diff --git a/.gitignore b/.gitignore
index a5e796f..2495b4f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -68,3 +68,4 @@
 editor/util/testing/mac/CodeLab.suite/Results
 editor/util/testing/mac/DartEditor.suite/Results
 editor/util/testing/mac/Samples.suite/Results
+.test-outcome.log
diff --git a/README.dart-sdk b/README.dart-sdk
index 04e9d4b..9815d25 100644
--- a/README.dart-sdk
+++ b/README.dart-sdk
@@ -8,8 +8,9 @@
   dart           Dart virtual machine
   dart2js        Dart-to-JavaScript compiler
   dartanalyzer   Dart static analyzer
-  dartdoc        Dart documentation generator
+  docgen         Dart documentation generator
   pub            Pub, the Dart package manager
+  dartfmt        Dart code formatter
 
 lib/             Libraries that are shipped with the Dart runtime. More 
                  information is available at api.dartlang.org.
@@ -17,6 +18,8 @@
 packages/        Additional packages that are shipped outside of the Dart 
                  runtime. More information is available at api.dartlang.org.
 
-version          The version number of the SDK (ex. 0.1.2.0_r1234).
+version          The version number of the SDK (ex. 1.5.1).
+
+revision         The Subversion revision of the SDK build (ex. 37107).
 
 util/            Support files for dart_analyzer and pub.
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 995de16..279884a 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -17,8 +17,8 @@
 import 'package:analysis_server/src/operation/operation.dart';
 import 'package:analysis_server/src/operation/operation_queue.dart';
 import 'package:analysis_server/src/package_map_provider.dart';
-import 'package:analysis_server/src/package_uri_resolver.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error.dart';
@@ -26,6 +26,7 @@
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analysis_services/constants.dart';
 import 'package:analysis_services/index/index.dart';
 import 'package:analysis_services/search/search_engine.dart';
 import 'package:analyzer/src/generated/element.dart';
@@ -401,6 +402,8 @@
             'Unexpected exception during analysis',
             new CaughtException(exception, stackTrace));
       }
+      _sendServerErrorNotification(exception, stackTrace);
+      shutdown();
     } finally {
       if (!operationQueue.isEmpty) {
         _schedulePerformOperation();
@@ -693,6 +696,16 @@
     }
   }
 
+  void shutdown() {
+    running = false;
+    if (index != null) {
+      index.clear();
+      index.stop();
+    }
+    // Defer closing the channel so that the shutdown response can be sent.
+    new Future(channel.close);
+  }
+
   /**
    * Return the [CompilationUnit] of the Dart file with the given [path].
    * Return `null` if the file is not a part of any context.
@@ -726,6 +739,32 @@
   void _schedulePerformOperation() {
     new Future(performOperation);
   }
+
+  /**
+   * Sends a fatal `server.error` notification.
+   */
+  void _sendServerErrorNotification(exception, stackTrace) {
+    // prepare exception.toString()
+    String exceptionString;
+    if (exception != null) {
+      exceptionString = exception.toString();
+    } else {
+      exceptionString = 'null exception';
+    }
+    // prepare stackTrace.toString()
+    String stackTraceString;
+    if (stackTrace != null) {
+      stackTraceString = stackTrace.toString();
+    } else {
+      stackTraceString = 'null stackTrace';
+    }
+    // send the notification
+    Notification notification = new Notification(SERVER_ERROR);
+    notification.setParameter(FATAL, true);
+    notification.setParameter(MESSAGE, exceptionString);
+    notification.setParameter(STACK_TRACE, stackTraceString);
+    channel.sendNotification(notification);
+  }
 }
 
 
diff --git a/pkg/analysis_server/lib/src/channel.dart b/pkg/analysis_server/lib/src/channel.dart
index 895316a..9e68890 100644
--- a/pkg/analysis_server/lib/src/channel.dart
+++ b/pkg/analysis_server/lib/src/channel.dart
@@ -63,6 +63,11 @@
    * Send the given [response] to the client.
    */
   void sendResponse(Response response);
+
+  /**
+   * Close the communication channel.
+   */
+  void close();
 }
 
 /**
@@ -167,6 +172,11 @@
       sendResponse(new Response.invalidRequestFormat());
     }
   }
+
+  @override
+  void close() {
+    socket.close(WebSocketStatus.NORMAL_CLOSURE);
+  }
 }
 
 /**
@@ -242,18 +252,28 @@
     input.transform((new Utf8Codec()).decoder).transform(new LineSplitter()
         ).listen((String data) => _readRequest(data, onRequest), onError: onError,
         onDone: () {
-      _closed.complete();
+      close();
       onDone();
     });
   }
 
   @override
   void sendNotification(Notification notification) {
+    // Don't send any further notifications after the communication channel is
+    // closed.
+    if (_closed.isCompleted) {
+      return;
+    }
     output.writeln(JSON.encode(notification.toJson()));
   }
 
   @override
   void sendResponse(Response response) {
+    // Don't send any further responses after the communication channel is
+    // closed.
+    if (_closed.isCompleted) {
+      return;
+    }
     output.writeln(JSON.encode(response.toJson()));
   }
 
@@ -262,6 +282,10 @@
    * the request.
    */
   void _readRequest(Object data, void onRequest(Request request)) {
+    // Ignore any further requests after the communication channel is closed.
+    if (_closed.isCompleted) {
+      return;
+    }
     // Parse the string as a JSON descriptor and process the resulting
     // structure as a request.
     Request request = new Request.fromString(data);
@@ -271,6 +295,13 @@
     }
     onRequest(request);
   }
+
+  @override
+  void close() {
+    if (!_closed.isCompleted) {
+      _closed.complete();
+    }
+  }
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/computer/computer_navigation.dart b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
index 98c2280..03ea941 100644
--- a/pkg/analysis_server/lib/src/computer/computer_navigation.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
@@ -31,7 +31,7 @@
   }
 
   void _addRegion(int offset, int length, Element element) {
-    if (element == null) {
+    if (element == null || element == DynamicElementImpl.instance) {
       return;
     }
     if (element is FieldFormalParameterElement) {
@@ -104,7 +104,9 @@
         lastNode = firstNode;
       }
       if (firstNode != null && lastNode != null) {
-        computer._addRegion_nodeStart_nodeEnd(firstNode, lastNode,
+        computer._addRegion_nodeStart_nodeEnd(
+            firstNode,
+            lastNode,
             node.element);
       }
     }
@@ -149,14 +151,18 @@
 
   @override
   visitPartDirective(PartDirective node) {
-    computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri,
+    computer._addRegion_tokenStart_nodeEnd(
+        node.keyword,
+        node.uri,
         node.element);
     return super.visitPartDirective(node);
   }
 
   @override
   visitPartOfDirective(PartOfDirective node) {
-    computer._addRegion_tokenStart_nodeEnd(node.keyword, node.libraryName,
+    computer._addRegion_tokenStart_nodeEnd(
+        node.keyword,
+        node.libraryName,
         node.element);
     return super.visitPartOfDirective(node);
   }
diff --git a/pkg/analysis_server/lib/src/computer/computer_occurrences.dart b/pkg/analysis_server/lib/src/computer/computer_occurrences.dart
index 0a87298..64f4687 100644
--- a/pkg/analysis_server/lib/src/computer/computer_occurrences.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_occurrences.dart
@@ -39,6 +39,9 @@
   }
 
   void _addOccurrence(Element element, int offset) {
+    if (element == null || element == DynamicElementImpl.instance) {
+      return;
+    }
     element = _canonicalizeElement(element);
     List<int> offsets = _elementsOffsets[element];
     if (offsets == null) {
diff --git a/pkg/analysis_server/lib/src/computer/element.dart b/pkg/analysis_server/lib/src/computer/element.dart
index fb9943a..4ccca7f 100644
--- a/pkg/analysis_server/lib/src/computer/element.dart
+++ b/pkg/analysis_server/lib/src/computer/element.dart
@@ -11,6 +11,14 @@
 
 
 /**
+ * Returns a JSON correponding to the given Engine element.
+ */
+Map<String, Object> engineElementToJson(engine.Element element) {
+  return new Element.fromEngine(element).toJson();
+}
+
+
+/**
  * Information about an element.
  */
 class Element {
@@ -354,6 +362,15 @@
         startColumn);
   }
 
+  factory Location.fromJson(Map<String, Object> map) {
+    return new Location(
+        map[FILE],
+        map[OFFSET],
+        map[LENGTH],
+        map[START_LINE],
+        map[START_COLUMN]);
+  }
+
   factory Location.fromOffset(engine.Element element, int offset, int length) {
     Source source = element.source;
     LineInfo lineInfo = element.context.getLineInfo(source);
@@ -370,15 +387,6 @@
         startColumn);
   }
 
-  factory Location.fromJson(Map<String, Object> map) {
-    return new Location(
-        map[FILE],
-        map[OFFSET],
-        map[LENGTH],
-        map[START_LINE],
-        map[START_COLUMN]);
-  }
-
   Map<String, Object> toJson() {
     return {
       FILE: file,
diff --git a/pkg/analysis_server/lib/src/constants.dart b/pkg/analysis_server/lib/src/constants.dart
index 0285b10..aab2d88 100644
--- a/pkg/analysis_server/lib/src/constants.dart
+++ b/pkg/analysis_server/lib/src/constants.dart
@@ -58,6 +58,7 @@
 const String SEARCH_FIND_MEMBER_REFERENCES = 'search.findMemberReferences';
 const String SEARCH_FIND_TOP_LEVEL_DECLARATIONS =
     'search.findTopLevelDeclarations';
+    const String SEARCH_GET_TYPE_HIERARCHY = 'search.getTypeHierarchy';
 
 //
 // Search notifications
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 0b4019b..c67ad63 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -12,6 +12,7 @@
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_services/constants.dart';
+import 'package:analysis_services/search/search_engine.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/engine.dart';
 
@@ -27,9 +28,16 @@
   final AnalysisServer server;
 
   /**
+   * The [SearchEngine] for this server.
+   */
+  SearchEngine searchEngine;
+
+  /**
    * Initialize a newly created handler to handle requests for the given [server].
    */
-  AnalysisDomainHandler(this.server);
+  AnalysisDomainHandler(this.server) {
+    searchEngine = server.searchEngine;
+  }
 
   /**
    * Implement the `analysis.getErrors` request.
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index 5196d67a..7d000c1 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -4,15 +4,13 @@
 
 library domain.completion;
 
-import 'dart:async';
-
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_services/completion/completion_suggestion.dart';
+import 'package:analysis_services/completion/completion_computer.dart';
 import 'package:analysis_services/constants.dart';
 import 'package:analysis_services/search/search_engine.dart';
-import 'package:analyzer/src/generated/element.dart';
 
 /**
  * Instances of the class [CompletionDomainHandler] implement a [RequestHandler]
@@ -35,7 +33,7 @@
   int _nextCompletionId = 0;
 
   /**
-   * Initialize a newly created handler to handle requests for the given [server].
+   * Initialize a new request handler for the given [server].
    */
   CompletionDomainHandler(this.server);
 
@@ -44,7 +42,7 @@
     try {
       String requestName = request.method;
       if (requestName == COMPLETION_GET_SUGGESTIONS) {
-        return getSuggestions(request);
+        return processRequest(request);
       }
     } on RequestFailure catch (exception) {
       return exception.response;
@@ -52,22 +50,34 @@
     return null;
   }
 
-  Response getSuggestions(Request request) {
+  /**
+   * Process a `completion.getSuggestions` request.
+   */
+  Response processRequest(Request request) {
     // extract param
     String file = request.getRequiredParameter(FILE).asString();
     int offset = request.getRequiredParameter(OFFSET).asInt();
     // schedule completion analysis
     String completionId = (_nextCompletionId++).toString();
-    var computer = new TopLevelSuggestionsComputer(server.searchEngine);
-    var future = computer.compute();
-    future.then((List<CompletionSuggestion> results) {
-      _sendCompletionNotification(completionId, true, results);
+    CompletionComputer.create(server.searchEngine).then((computers) {
+      int count = computers.length;
+      List<CompletionSuggestion> results = new List<CompletionSuggestion>();
+      computers.forEach((CompletionComputer c) {
+        c.compute().then((List<CompletionSuggestion> partialResults) {
+          // send aggregate results as we compute them
+          results.addAll(partialResults);
+          sendCompletionNotification(completionId, --count == 0, results);
+        });
+      });
     });
-    // respond
+    // initial response without results
     return new Response(request.id)..setResult(ID, completionId);
   }
 
-  void _sendCompletionNotification(String completionId, bool isLast,
+  /**
+   * Send completion notification results.
+   */
+  void sendCompletionNotification(String completionId, bool isLast,
       Iterable<CompletionSuggestion> results) {
     Notification notification = new Notification(COMPLETION_RESULTS);
     notification.setParameter(ID, completionId);
@@ -76,34 +86,3 @@
     server.sendNotification(notification);
   }
 }
-
-/**
- * A computer for `completion.getSuggestions` request results.
- */
-class TopLevelSuggestionsComputer {
-  final SearchEngine searchEngine;
-
-  TopLevelSuggestionsComputer(this.searchEngine);
-
-  /**
-   * Computes [CompletionSuggestion]s for the specified position in the source.
-   */
-  Future<List<CompletionSuggestion>> compute() {
-    var future = searchEngine.searchTopLevelDeclarations('');
-    return future.then((List<SearchMatch> matches) {
-      return matches.map((SearchMatch match) {
-        Element element = match.element;
-        String completion = element.displayName;
-        return new CompletionSuggestion(
-            CompletionSuggestionKind.fromElementKind(element.kind),
-            CompletionRelevance.DEFAULT,
-            completion,
-            completion.length,
-            0,
-            element.isDeprecated,
-            false // isPotential
-            );
-      }).toList();
-    });
-  }
-}
diff --git a/pkg/analysis_server/lib/src/domain_server.dart b/pkg/analysis_server/lib/src/domain_server.dart
index cfa7588..446d053 100644
--- a/pkg/analysis_server/lib/src/domain_server.dart
+++ b/pkg/analysis_server/lib/src/domain_server.dart
@@ -118,7 +118,7 @@
    * Cleanly shutdown the analysis server.
    */
   Response shutdown(Request request) {
-    server.running = false;
+    server.shutdown();
     Response response = new Response(request.id);
     return response;
   }
diff --git a/pkg/analysis_server/lib/src/protocol.dart b/pkg/analysis_server/lib/src/protocol.dart
index f275001..03d99cf 100644
--- a/pkg/analysis_server/lib/src/protocol.dart
+++ b/pkg/analysis_server/lib/src/protocol.dart
@@ -900,7 +900,7 @@
    * sent to the client to represent this response.
    */
   Map<String, Object> toJson() {
-    Map<String, Object> jsonObject = new HashMap<String, Object>();
+    Map<String, Object> jsonObject = {};
     jsonObject[EVENT] = event;
     if (!params.isEmpty) {
       jsonObject[PARAMS] = params;
diff --git a/pkg/analysis_server/lib/src/search/search_domain.dart b/pkg/analysis_server/lib/src/search/search_domain.dart
index 53572e1..e9baeaa 100644
--- a/pkg/analysis_server/lib/src/search/search_domain.dart
+++ b/pkg/analysis_server/lib/src/search/search_domain.dart
@@ -12,6 +12,7 @@
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/search/element_references.dart';
 import 'package:analysis_server/src/search/search_result.dart';
+import 'package:analysis_server/src/search/type_hierarchy.dart';
 import 'package:analysis_services/constants.dart';
 import 'package:analysis_services/search/search_engine.dart';
 import 'package:analyzer/src/generated/element.dart';
@@ -126,6 +127,30 @@
     return new Response(request.id)..setResult(ID, searchId);
   }
 
+  /**
+   * Implement the `search.getTypeHierarchy` request.
+   */
+  Response getTypeHierarchy(Request request) {
+    // prepare parameters
+    String file = request.getRequiredParameter(FILE).asString();
+    int offset = request.getRequiredParameter(OFFSET).asInt();
+    // prepare Element
+    List<Element> elements = server.getElementsAtOffset(file, offset);
+    if (elements.isEmpty) {
+      return new Response(request.id);
+    }
+    Element element = elements.first;
+    // prepare type hierarchy
+    TypeHierarchyComputer computer = new TypeHierarchyComputer(searchEngine);
+    computer.compute(element).then((TypeHierarchyItem item) {
+      Response response = new Response(request.id);
+      response.setResult(HIERARCHY, item);
+      server.sendResponse(response);
+    });
+    // delay response
+    return Response.DELAYED_RESPONSE;
+  }
+
   @override
   Response handleRequest(Request request) {
     try {
@@ -138,6 +163,8 @@
         return findMemberReferences(request);
       } else if (requestName == SEARCH_FIND_TOP_LEVEL_DECLARATIONS) {
         return findTopLevelDeclarations(request);
+      } else if (requestName == SEARCH_GET_TYPE_HIERARCHY) {
+        return getTypeHierarchy(request);
       }
     } on RequestFailure catch (exception) {
       return exception.response;
diff --git a/pkg/analysis_server/lib/src/search/type_hierarchy.dart b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
new file mode 100644
index 0000000..5a28bb5
--- /dev/null
+++ b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
@@ -0,0 +1,168 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analysis.type_hierarhy;
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:analysis_server/src/computer/element.dart' show
+    engineElementToJson;
+import 'package:analysis_services/constants.dart';
+import 'package:analysis_services/json.dart';
+import 'package:analysis_services/search/hierarchy.dart';
+import 'package:analysis_services/search/search_engine.dart';
+import 'package:analyzer/src/generated/element.dart';
+
+/**
+ * A computer for a type hierarchy of an [Element].
+ */
+class TypeHierarchyComputer {
+  final SearchEngine _searchEngine;
+  ElementKind _pivotKind;
+  String _pivotName;
+
+  TypeHierarchyComputer(this._searchEngine);
+
+  /**
+   * Returns the computed type hierarchy, maybe `null`.
+   */
+  Future<TypeHierarchyItem> compute(Element element) {
+    _pivotKind = element.kind;
+    _pivotName = element.name;
+    if (element is ExecutableElement &&
+        element.enclosingElement is ClassElement) {
+      element = element.enclosingElement;
+    }
+    if (element is ClassElement) {
+      Set<ClassElement> processed = new HashSet<ClassElement>();
+      InterfaceType type = element.type;
+      TypeHierarchyItem item = createSuperItem(type, processed);
+      return _createSubclasses(item, type, processed).then((_) {
+        return item;
+      });
+    }
+    return new Future.value(null);
+  }
+
+  TypeHierarchyItem createSuperItem(InterfaceType type,
+      Set<ClassElement> processed) {
+    // check for recursion
+    if (!processed.add(type.element)) {
+      return null;
+    }
+    // superclass
+    TypeHierarchyItem superItem = null;
+    {
+      InterfaceType superType = type.superclass;
+      if (superType != null) {
+        superItem = createSuperItem(superType, processed);
+      }
+    }
+    // mixins
+    List<TypeHierarchyItem> mixinsItems;
+    {
+      List<InterfaceType> mixinsTypes = type.mixins;
+      mixinsItems = mixinsTypes.map((InterfaceType type) {
+        return createSuperItem(type, processed);
+      }).toList();
+    }
+    // interfaces
+    List<TypeHierarchyItem> interfacesItems;
+    {
+      List<InterfaceType> interfacesTypes = type.interfaces;
+      interfacesItems = interfacesTypes.map((InterfaceType type) {
+        return createSuperItem(type, processed);
+      }).toList();
+    }
+    // done
+    String displayName = null;
+    if (type.typeArguments.isNotEmpty) {
+      displayName = type.toString();
+    }
+    ClassElement classElement = type.element;
+    ExecutableElement memberElement = findMemberElement(classElement);
+    return new TypeHierarchyItem(
+        classElement,
+        memberElement,
+        displayName,
+        superItem,
+        mixinsItems,
+        interfacesItems);
+  }
+
+  ExecutableElement findMemberElement(ClassElement classElement) {
+    if (_pivotKind == ElementKind.METHOD) {
+      return classElement.getMethod(_pivotName);
+    }
+    if (_pivotKind == ElementKind.GETTER) {
+      return classElement.getGetter(_pivotName);
+    }
+    if (_pivotKind == ElementKind.SETTER) {
+      return classElement.getSetter(_pivotName);
+    }
+    return null;
+  }
+
+  Future _createSubclasses(TypeHierarchyItem item, InterfaceType type,
+      Set<ClassElement> processed) {
+    var future = getDirectSubClasses(_searchEngine, type.element);
+    return future.then((Set<ClassElement> subElements) {
+      for (ClassElement subElement in subElements) {
+        // check for recursion
+        if (!processed.add(subElement)) {
+          continue;
+        }
+        // create a subclass item
+        ExecutableElement subMemberElement = findMemberElement(subElement);
+        TypeHierarchyItem subItem =
+            new TypeHierarchyItem(
+                subElement,
+                subMemberElement,
+                null,
+                null,
+                <TypeHierarchyItem>[],
+                <TypeHierarchyItem>[]);
+        item.subclasses.add(subItem);
+      }
+      // compute subclasses of subclasses
+      return Future.forEach(item.subclasses, (TypeHierarchyItem subItem) {
+        InterfaceType subType = subItem.classElement.type;
+        return _createSubclasses(subItem, subType, processed);
+      });
+    });
+  }
+}
+
+
+class TypeHierarchyItem implements HasToJson {
+  final ClassElement classElement;
+  final Element memberElement;
+  final String displayName;
+  final TypeHierarchyItem superclass;
+  final List<TypeHierarchyItem> mixins;
+  final List<TypeHierarchyItem> interfaces;
+  List<TypeHierarchyItem> subclasses = <TypeHierarchyItem>[];
+
+  TypeHierarchyItem(this.classElement, this.memberElement, this.displayName,
+      this.superclass, this.mixins, this.interfaces);
+
+  Map<String, Object> toJson() {
+    Map<String, Object> json = {};
+    json[CLASS_ELEMENT] = engineElementToJson(classElement);
+    if (memberElement != null) {
+      json[MEMBER_ELEMENT] = engineElementToJson(memberElement);
+    }
+    if (displayName != null) {
+      json[DISPLAY_NAME] = displayName;
+    }
+    if (superclass != null) {
+      json[SUPERCLASS] = objectToJson(superclass);
+    }
+    json[INTERFACES] = objectToJson(interfaces);
+    json[MIXINS] = objectToJson(mixins);
+    json[SUBCLASSES] = objectToJson(subclasses);
+    return json;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index 16fd27b..3be880a 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -4,8 +4,6 @@
 
 library socket.server;
 
-import 'dart:io' as io;
-
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/channel.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
@@ -17,7 +15,6 @@
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/generated/sdk_io.dart';
-import 'package:path/path.dart' as pathos;
 import 'package:analysis_services/index/index.dart';
 import 'package:analysis_services/index/local_file_index.dart';
 
@@ -26,16 +23,7 @@
  * Creates and runs an [Index].
  */
 Index _createIndex() {
-  String tempPath = io.Directory.systemTemp.path;
-  String indexPath = pathos.join(tempPath, 'AnalysisServer_index');
-  io.Directory indexDirectory = new io.Directory(indexPath);
-  if (indexDirectory.existsSync()) {
-    indexDirectory.deleteSync(recursive: true);
-  }
-  if (!indexDirectory.existsSync()) {
-    indexDirectory.createSync();
-  }
-  Index index = createLocalFileIndex(indexDirectory);
+  Index index = createLocalFileIndex();
   index.run();
   return index;
 }
diff --git a/pkg/analysis_server/test/analysis/test_all.dart b/pkg/analysis_server/test/analysis/test_all.dart
index 92917cb..c33c81c 100644
--- a/pkg/analysis_server/test/analysis/test_all.dart
+++ b/pkg/analysis_server/test/analysis/test_all.dart
@@ -15,4 +15,4 @@
   group('search', () {
     get_errors_test.main();
   });
-}
\ No newline at end of file
+}
diff --git a/pkg/analysis_server/test/analysis_notification_navigation_test.dart b/pkg/analysis_server/test/analysis_notification_navigation_test.dart
index ffc041e..b14b8da 100644
--- a/pkg/analysis_server/test/analysis_notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_navigation_test.dart
@@ -18,6 +18,7 @@
 
 
 main() {
+  groupSep = ' | ';
   runReflectiveTests(AnalysisNotificationNavigationTest);
 }
 
@@ -471,6 +472,27 @@
       expect(testTarget.returnType, isNull);
     });
   }
+
+  test_type_dynamic() {
+    addTestFile('''
+main() {
+  dynamic v = null;
+}
+''');
+    return prepareNavigation().then((_) {
+      assertNoRegionAt('dynamic');
+    });
+  }
+
+  test_type_void() {
+    addTestFile('''
+void main() {
+}
+''');
+    return prepareNavigation().then((_) {
+      assertNoRegionAt('void');
+    });
+  }
 }
 
 
diff --git a/pkg/analysis_server/test/analysis_notification_occurrences_test.dart b/pkg/analysis_server/test/analysis_notification_occurrences_test.dart
index 8507050..3f2ed6a 100644
--- a/pkg/analysis_server/test/analysis_notification_occurrences_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_occurrences_test.dart
@@ -125,26 +125,6 @@
     });
   }
 
-  test_classType() {
-    addTestFile('''
-main() {
-  int a = 1;
-  int b = 2;
-  int c = 3;
-}
-int VVV = 4;
-''');
-    return prepareOccurrences().then((_) {
-      assertHasRegion('int a');
-      expect(testOccurences.element.kind, ElementKind.CLASS);
-      expect(testOccurences.element.name, 'int');
-      assertHasOffset('int a');
-      assertHasOffset('int b');
-      assertHasOffset('int c');
-      assertHasOffset('int VVV');
-    });
-  }
-
   test_field() {
     addTestFile('''
 class A {
@@ -238,4 +218,49 @@
       assertHasOffset('VVV);');
     });
   }
+
+  test_type_class() {
+    addTestFile('''
+main() {
+  int a = 1;
+  int b = 2;
+  int c = 3;
+}
+int VVV = 4;
+''');
+    return prepareOccurrences().then((_) {
+      assertHasRegion('int a');
+      expect(testOccurences.element.kind, ElementKind.CLASS);
+      expect(testOccurences.element.name, 'int');
+      assertHasOffset('int a');
+      assertHasOffset('int b');
+      assertHasOffset('int c');
+      assertHasOffset('int VVV');
+    });
+  }
+
+  test_type_dynamic() {
+    addTestFile('''
+main() {
+  dynamic a = 1;
+  dynamic b = 2;
+}
+dynamic V = 3;
+''');
+    return prepareOccurrences().then((_) {
+      int offset = findOffset('dynamic a');
+      findRegion(offset, 'dynamic'.length, false);
+    });
+  }
+
+  test_type_void() {
+    addTestFile('''
+void main() {
+}
+''');
+    return prepareOccurrences().then((_) {
+      int offset = findOffset('void main()');
+      findRegion(offset, 'void'.length, false);
+    });
+  }
 }
diff --git a/pkg/analysis_server/test/completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
similarity index 79%
rename from pkg/analysis_server/test/completion_test.dart
rename to pkg/analysis_server/test/domain_completion_test.dart
index 477cecf..3c0008b 100644
--- a/pkg/analysis_server/test/completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -40,9 +40,9 @@
         + content.substring(completionOffset + 1));
   }
 
-  void assertHasResult(CompletionSuggestionKind kind,
-      CompletionRelevance relevance, String completion,
-      bool isDeprecated, bool isPotential) {
+  void assertHasResult(CompletionSuggestionKind kind, String completion,
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      bool isDeprecated = false, bool isPotential = false]) {
     var cs = suggestions.firstWhere((cs) => cs.completion == completion, orElse: () {
       var completions = suggestions.map((s) => s.completion).toList();
       fail('expected "$completion" but found\n $completions');
@@ -55,6 +55,12 @@
     expect(cs.isPotential, equals(isPotential));
   }
 
+  void assertNoResult(String completion) {
+    if (suggestions.any((cs) => cs.completion == completion)) {
+      fail('did not expect completion: $completion');
+    }
+  }
+
   void assertValidId(String id) {
     expect(id, isNotNull);
     expect(id.isNotEmpty, isTrue);
@@ -107,16 +113,28 @@
     return new Future.delayed(Duration.ZERO, waitForSuggestions);
   }
 
-  test_suggestions() {
+  test_suggestions_importedType() {
     addTestFile('''
       import 'dart:html';
       main() {^}
     ''');
     return getSuggestions().then((_) {
-      assertHasResult(CompletionSuggestionKind.CLASS,
-          CompletionRelevance.DEFAULT, 'Object', false, false);
-      assertHasResult(CompletionSuggestionKind.CLASS,
-          CompletionRelevance.DEFAULT, 'HtmlElement', false, false);
+      assertHasResult(CompletionSuggestionKind.CLASS, 'Object');
+      assertHasResult(CompletionSuggestionKind.CLASS, 'HtmlElement');
+      assertNoResult('test');
+    });
+  }
+
+  test_suggestions_topLevel() {
+    addTestFile('''
+      typedef foo();
+      var test^ = '';
+      main() {test.}
+    ''');
+    return getSuggestions().then((_) {
+      assertHasResult(CompletionSuggestionKind.CLASS, 'Object');
+      assertHasResult(CompletionSuggestionKind.TOP_LEVEL_VARIABLE, 'test');
+      assertNoResult('HtmlElement');
     });
   }
 }
diff --git a/pkg/analysis_server/test/integration/analysis_domain_inttest.dart b/pkg/analysis_server/test/integration/analysis_domain_int_test.dart
similarity index 68%
rename from pkg/analysis_server/test/integration/analysis_domain_inttest.dart
rename to pkg/analysis_server/test/integration/analysis_domain_int_test.dart
index 090e8e68..f744c1d 100644
--- a/pkg/analysis_server/test/integration/analysis_domain_inttest.dart
+++ b/pkg/analysis_server/test/integration/analysis_domain_int_test.dart
@@ -139,8 +139,7 @@
   test_getHover_noInfo() {
     String filename = 'test.dart';
     String pathname = normalizePath(filename);
-    String text =
-        r'''
+    String text = r'''
 main() {
   // no code
 }
@@ -153,14 +152,104 @@
     // request is made.  So wait for analysis to finish before testing anything.
     return analysisFinished.then((_) {
       return server.send(ANALYSIS_GET_HOVER, {
-              'file': pathname,
-              'offset': text.indexOf('no code')
-            }).then((result) {
-              expect(result, isAnalysisGetHoverResult);
-              expect(result['hovers'], hasLength(0));
+        'file': pathname,
+        'offset': text.indexOf('no code')
+      }).then((result) {
+        expect(result, isAnalysisGetHoverResult);
+        expect(result['hovers'], hasLength(0));
       });
     });
   }
+
+  test_getErrors_before_analysis() {
+    return getErrorsTest(false);
+  }
+
+  test_getErrors_after_analysis() {
+    return getErrorsTest(true);
+  }
+
+  Future getErrorsTest(bool afterAnalysis) {
+    String filename = 'test.dart';
+    String pathname = normalizePath(filename);
+    String text = r'''
+main() {
+  var x // parse error: missing ';'
+}''';
+    writeFile(filename, text);
+    setAnalysisRoots(['']);
+    Future finishTest() {
+      return server.send(ANALYSIS_GET_ERRORS, {
+        'file': pathname
+      }).then((result) {
+        expect(result, isAnalysisGetErrorsResult);
+        expect(result['errors'], equals(currentAnalysisErrors[pathname]));
+      });
+    }
+    if (afterAnalysis) {
+      return analysisFinished.then((_) => finishTest());
+    } else {
+      return finishTest();
+    }
+  }
+
+  test_updateContent_content_only() {
+    return updateContentTest(false);
+  }
+
+  test_updateContent_including_offset_and_lengths() {
+    return updateContentTest(true);
+  }
+
+  Future updateContentTest(bool includeOffsetAndLengths) {
+    String filename = 'test.dart';
+    String pathname = normalizePath(filename);
+    String goodText = r'''
+main() {
+  print("Hello, world!");
+}''';
+    String badText = goodText.replaceAll(';', '');
+    writeFile(filename, badText);
+    setAnalysisRoots(['']);
+    return analysisFinished.then((_) {
+      // The contents on disk (badText) are missing a semicolon.
+      expect(currentAnalysisErrors[pathname], isNot(isEmpty));
+      var contentChange = {
+        'content': goodText
+      };
+      if (includeOffsetAndLengths) {
+        contentChange['offset'] = goodText.indexOf(';');
+        contentChange['oldLength'] = 0;
+        contentChange['newLength'] = 1;
+      }
+      return server.send(ANALYSIS_UPDATE_CONTENT, {
+        'files': {
+          pathname: contentChange
+        }
+      });
+    }).then((result) {
+      expect(result, isNull);
+      return analysisFinished;
+    }).then((_) {
+      // There should be no errors now because the contents on disk have been
+      // overriden with goodText.
+      expect(currentAnalysisErrors[pathname], isEmpty);
+      return server.send(ANALYSIS_UPDATE_CONTENT, {
+        'files': {
+          pathname: {
+            'content': null
+          }
+        }
+      });
+    }).then((result) {
+      expect(result, isNull);
+      return analysisFinished;
+    }).then((_) {
+      // Now there should be errors again, because the contents on disk are no
+      // longer overridden.
+      expect(currentAnalysisErrors[pathname], isNot(isEmpty));
+    });
+  }
 }
 
 main() {
diff --git a/pkg/analysis_server/test/integration/analysis_error_inttest.dart b/pkg/analysis_server/test/integration/analysis_error_int_test.dart
similarity index 100%
rename from pkg/analysis_server/test/integration/analysis_error_inttest.dart
rename to pkg/analysis_server/test/integration/analysis_error_int_test.dart
diff --git a/pkg/analysis_server/test/integration/completion_domain_inttest.dart b/pkg/analysis_server/test/integration/completion_domain_int_test.dart
similarity index 88%
rename from pkg/analysis_server/test/integration/completion_domain_inttest.dart
rename to pkg/analysis_server/test/integration/completion_domain_int_test.dart
index 574d390..bfb9238 100644
--- a/pkg/analysis_server/test/integration/completion_domain_inttest.dart
+++ b/pkg/analysis_server/test/integration/completion_domain_int_test.dart
@@ -44,6 +44,12 @@
       });
     });
   }
+
+  test_placeholder() {
+    // The unit test framework freaks out if there are no tests, so this is a
+    // placeholder until we have a passing test.
+    // TODO(paulberry): remove this.
+  }
 }
 
 main() {
diff --git a/pkg/analysis_server/test/integration/integration_tests.dart b/pkg/analysis_server/test/integration/integration_tests.dart
index af863fd..47b1856 100644
--- a/pkg/analysis_server/test/integration/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/integration_tests.dart
@@ -18,9 +18,15 @@
  */
 abstract class AbstractAnalysisServerIntegrationTest {
   /**
+   * Amount of time to give the server to respond to a shutdown request before
+   * forcibly terminating it.
+   */
+  static const Duration SHUTDOWN_TIMEOUT = const Duration(seconds: 5);
+
+  /**
    * Connection to the analysis server.
    */
-  Server server;
+  final Server server = new Server();
 
   /**
    * Temporary directory in which source files can be stored.
@@ -35,6 +41,18 @@
       );
 
   /**
+   * True if the teardown process should skip sending a "server.shutdown"
+   * request (e.g. because the server is known to have already shutdown).
+   */
+  bool skipShutdown = false;
+
+  /**
+   * Data associated with the "server.connected" notification that was received
+   * when the server started up.
+   */
+  var serverConnectedParams;
+
+  /**
    * Write a source file with the given contents.  [relativePath]
    * is relative to [sourceDirectory]; on Windows any forward slashes it
    * contains are converted to backslashes.
@@ -119,24 +137,48 @@
    */
   Future setUp() {
     sourceDirectory = Directory.systemTemp.createTempSync('analysisServer');
-    return Server.start().then((Server server) {
-      this.server = server;
-      server.onNotification(ANALYSIS_ERRORS).listen((params) {
-        expect(params, isMap);
-        expect(params['file'], isString);
-        currentAnalysisErrors[params['file']] = params['errors'];
-      });
+
+    server.onNotification(ANALYSIS_ERRORS).listen((params) {
+      expect(params, isMap);
+      expect(params['file'], isString);
+      currentAnalysisErrors[params['file']] = params['errors'];
+    });
+    Completer serverConnected = new Completer();
+    server.onNotification(SERVER_CONNECTED).listen((_) {
+      expect(serverConnected.isCompleted, isFalse);
+      serverConnected.complete();
+    });
+    return server.start().then((params) {
+      serverConnectedParams = params;
+      server.exitCode.then((_) { skipShutdown = true; });
+      return serverConnected.future;
     });
   }
 
   /**
-   * After every test, the server stopped and [sourceDirectory] is deleted.
+   * After every test, the server is stopped and [sourceDirectory] is deleted.
    */
   Future tearDown() {
-    return server.kill().then((_) {
+    return _shutdownIfNeeded().then((_) {
       sourceDirectory.deleteSync(recursive: true);
     });
   }
+
+  /**
+   * If [skipShutdown] is not set, shut down the server.
+   */
+  Future _shutdownIfNeeded() {
+    if (skipShutdown) {
+      return new Future.value();
+    }
+    // Give the server a short time to comply with the shutdown request; if it
+    // doesn't exit, then forcibly terminate it.
+    Completer processExited = new Completer();
+    server.send(SERVER_SHUTDOWN, null);
+    return server.exitCode.timeout(SHUTDOWN_TIMEOUT, onTimeout: () {
+      return server.kill();
+    });
+  }
 }
 
 // Matchers for data types defined in the analysis server API
@@ -146,8 +188,7 @@
 // Matchers common to all domains
 // ------------------------------
 
-const Matcher isResponse = const MatchesJsonObject('response',
-    const {
+const Matcher isResponse = const MatchesJsonObject('response', const {
   'id': isString
 }, optionalFields: const {
   'result': anything,
@@ -188,6 +229,12 @@
   'analysis': isAnalysisStatus
 });
 
+// analysis.getErrors
+final Matcher isAnalysisGetErrorsResult = new MatchesJsonObject(
+    'analysis.getErrors result', {
+  'errors': isListOf(isAnalysisError)
+});
+
 // analysis.getHover
 final Matcher isAnalysisGetHoverResult = new MatchesJsonObject(
     'analysis.getHover result', {
@@ -428,9 +475,9 @@
  */
 class Server {
   /**
-   * Server process object.
+   * Server process object, or null if server hasn't been started yet.
    */
-  Process _process;
+  Process _process = null;
 
   /**
    * Commands that have been sent to the server but not yet acknowledged, and
@@ -477,7 +524,10 @@
    */
   bool _receivedBadDataFromServer = false;
 
-  Server._(this._process);
+  /**
+   * Stopwatch that we use to generate timing information for debug output.
+   */
+  Stopwatch _time = new Stopwatch();
 
   /**
    * Get a stream which will receive notifications of the given event type.
@@ -499,42 +549,37 @@
    * Start the server.  If [debugServer] is true, the server will be started
    * with "--debug", allowing a debugger to be attached.
    */
-  static Future<Server> start({bool debugServer: false}) {
+  Future start({bool debugServer: false}) {
+    if (_process != null) {
+      throw new Exception('Process already started');
+    }
+    _time.start();
     // TODO(paulberry): move the logic for finding the script, the dart
     // executable, and the package root into a shell script.
     String dartBinary = Platform.executable;
-    String scriptDir = dirname(Platform.script.path);
-    String serverPath = normalize(join(scriptDir, '..',
-        '..', 'bin', 'server.dart'));
-    String repoPath = normalize(join(scriptDir, '..', '..', '..', '..'));
-    String buildDirName;
-    if (Platform.isWindows) {
-      buildDirName = 'build';
-    } else if (Platform.isMacOS){
-      buildDirName = 'xcodebuild';
-    } else {
-      buildDirName = 'out';
-    }
-    String dartConfiguration = 'ReleaseIA32'; // TODO(paulberry): this is a guess
-    String buildPath = join(repoPath, buildDirName, dartConfiguration);
-    String packageRoot = join(buildPath, 'packages');
+    String scriptDir = dirname(Platform.script.toFilePath(windows:
+        Platform.isWindows));
+    String serverPath = normalize(join(scriptDir, '..', '..', 'bin',
+        'server.dart'));
     List<String> arguments = [];
     if (debugServer) {
       arguments.add('--debug');
     }
-    arguments.add('--package-root=$packageRoot');
+    if (Platform.packageRoot.isNotEmpty) {
+      arguments.add('--package-root=${Platform.packageRoot}');
+    }
     arguments.add(serverPath);
     return Process.start(dartBinary, arguments).then((Process process) {
-      Server server = new Server._(process);
+      _process = process;
       process.stdout.transform((new Utf8Codec()).decoder).transform(
           new LineSplitter()).listen((String line) {
         String trimmedLine = line.trim();
-        server._recordStdio('RECV: $trimmedLine');
+        _recordStdio('RECV: $trimmedLine');
         var message;
         try {
           message = JSON.decoder.convert(trimmedLine);
         } catch (exception) {
-          server._badDataFromServer();
+          _badDataFromServer();
           return;
         }
         expect(message, isMap);
@@ -542,11 +587,11 @@
         if (messageAsMap.containsKey('id')) {
           expect(messageAsMap['id'], isString);
           String id = message['id'];
-          Completer completer = server._pendingCommands[id];
+          Completer completer = _pendingCommands[id];
           if (completer == null) {
             fail('Unexpected response from server: id=$id');
           } else {
-            server._pendingCommands.remove(id);
+            _pendingCommands.remove(id);
           }
           if (messageAsMap.containsKey('error')) {
             // TODO(paulberry): propagate the error info to the completer.
@@ -566,7 +611,7 @@
           expect(messageAsMap['event'], isString);
           String event = messageAsMap['event'];
           StreamController notificationController =
-              server._notificationControllers[event];
+              _notificationControllers[event];
           if (notificationController != null) {
             notificationController.add(messageAsMap['params']);
           }
@@ -579,17 +624,29 @@
       process.stderr.transform((new Utf8Codec()).decoder).transform(
           new LineSplitter()).listen((String line) {
         String trimmedLine = line.trim();
-        server._recordStdio('ERR:  $trimmedLine');
-        server._badDataFromServer();
+        _recordStdio('ERR:  $trimmedLine');
+        _badDataFromServer();
       });
-      return server;
+      process.exitCode.then((int code) {
+        _recordStdio('TERMINATED WITH EXIT CODE $code');
+        if (code != 0) {
+          _badDataFromServer();
+        }
+      });
     });
   }
 
   /**
+   * Future that completes when the server process exits.
+   */
+  Future<int> get exitCode => _process.exitCode;
+
+  /**
    * Stop the server.
    */
   Future kill() {
+    debugStdio();
+    _recordStdio('PROCESS FORCIBLY TERMINATED');
     _process.kill();
     return _process.exitCode;
   }
@@ -658,6 +715,8 @@
    * [debugStdio] has been called.
    */
   void _recordStdio(String line) {
+    double elapsedTime = _time.elapsedTicks / _time.frequency;
+    line = "$elapsedTime: $line";
     if (_debuggingStdio) {
       print(line);
     }
diff --git a/pkg/analysis_server/test/integration/server_domain_inttest.dart b/pkg/analysis_server/test/integration/server_domain_int_test.dart
similarity index 89%
rename from pkg/analysis_server/test/integration/server_domain_inttest.dart
rename to pkg/analysis_server/test/integration/server_domain_int_test.dart
index 8b8c6a2..c577942 100644
--- a/pkg/analysis_server/test/integration/server_domain_inttest.dart
+++ b/pkg/analysis_server/test/integration/server_domain_int_test.dart
@@ -16,13 +16,12 @@
 class ServerDomainIntegrationTest extends AbstractAnalysisServerIntegrationTest
     {
   test_getVersion() {
-    return server.send('server.getVersion', null).then((response) {
+    return server.send(SERVER_GET_VERSION, null).then((response) {
       expect(response, isServerGetVersionResult);
     });
   }
 
-  fail_test_shutdown() {
-    // TODO(paulberry): fix the server so that it passes this test.
+  test_shutdown() {
     return server.send(SERVER_SHUTDOWN, null).then((response) {
       expect(response, isNull);
       return new Future.delayed(new Duration(seconds: 1)).then((_) {
@@ -83,13 +82,7 @@
   }
 
   test_connected() {
-    Completer receivedConnected = new Completer();
-    server.onNotification(SERVER_CONNECTED).listen((params) {
-      expect(receivedConnected.isCompleted, isFalse);
-      receivedConnected.complete();
-      expect(params, isNull);
-    });
-    return receivedConnected.future;
+    expect(serverConnectedParams, isNull);
   }
 
   test_error() {
diff --git a/pkg/analysis_server/test/integration/test_all.dart b/pkg/analysis_server/test/integration/test_all.dart
index 74d5ee7..ce0dc3e 100644
--- a/pkg/analysis_server/test/integration/test_all.dart
+++ b/pkg/analysis_server/test/integration/test_all.dart
@@ -4,10 +4,10 @@
 
 import 'package:unittest/unittest.dart';
 
-import 'analysis_domain_inttest.dart' as analysis_domain_inttest;
-import 'analysis_error_inttest.dart' as analysis_error_inttest;
-import 'completion_domain_inttest.dart' as completion_domain_inttest;
-import 'server_domain_inttest.dart' as server_domain_inttest;
+import 'analysis_domain_int_test.dart' as analysis_domain_int_test;
+import 'analysis_error_int_test.dart' as analysis_error_int_test;
+import 'completion_domain_int_test.dart' as completion_domain_int_test;
+import 'server_domain_int_test.dart' as server_domain_int_test;
 
 /**
  * Utility for manually running all integration tests.
@@ -15,9 +15,9 @@
 main() {
   groupSep = ' | ';
   group('analysis_server_integration', () {
-    analysis_domain_inttest.main();
-    analysis_error_inttest.main();
-    completion_domain_inttest.main();
-    server_domain_inttest.main();
+    analysis_domain_int_test.main();
+    analysis_error_int_test.main();
+    completion_domain_int_test.main();
+    server_domain_int_test.main();
   });
 }
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 5eb4ad5..68f7da9 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -133,6 +133,7 @@
 
   List<Response> responsesReceived = [];
   List<Notification> notificationsReceived = [];
+  bool _closed = false;
 
   MockServerChannel() {
   }
@@ -144,6 +145,10 @@
 
   @override
   void sendNotification(Notification notification) {
+    // Don't deliver notifications after the connection is closed.
+    if (_closed) {
+      return;
+    }
     notificationsReceived.add(notification);
     // Wrap send notification in future to simulate websocket
     // TODO(scheglov) ask Dan why and decide what to do
@@ -155,6 +160,10 @@
    * Simulate request/response pair.
    */
   Future<Response> sendRequest(Request request) {
+    // No further requests should be sent after the connection is closed.
+    if (_closed) {
+      throw new Exception('sendRequest after connection closed');
+    }
     // Wrap send request in future to simulate websocket
     new Future(() => requestController.add(request));
     return waitForResponse(request);
@@ -162,6 +171,10 @@
 
   @override
   void sendResponse(Response response) {
+    // Don't deliver responses after the connection is closed.
+    if (_closed) {
+      return;
+    }
     responsesReceived.add(response);
     // Wrap send response in future to simulate websocket
     new Future(() => responseController.add(response));
@@ -181,6 +194,11 @@
       return response.id == id;
     });
   }
+
+  @override
+  void close() {
+    _closed = true;
+  }
 }
 
 /**
diff --git a/pkg/analysis_server/test/search/test_all.dart b/pkg/analysis_server/test/search/test_all.dart
index ba3a431..db3efd7 100644
--- a/pkg/analysis_server/test/search/test_all.dart
+++ b/pkg/analysis_server/test/search/test_all.dart
@@ -6,11 +6,12 @@
 import 'package:unittest/unittest.dart';
 
 import 'element_references_test.dart' as element_references_test;
-import 'member_references_test.dart' as member_references_test;
 import 'member_declarations_test.dart' as member_declarations;
+import 'member_references_test.dart' as member_references_test;
 import 'search_domain_test.dart' as search_domain_test;
 import 'search_result_test.dart' as search_result_test;
 import 'top_level_declarations_test.dart' as top_level_declarations_test;
+import 'type_hierarchy_test.dart' as type_hierarchy_test;
 
 /**
  * Utility for manually running all tests.
@@ -24,5 +25,6 @@
     search_domain_test.main();
     search_result_test.main();
     top_level_declarations_test.main();
+    type_hierarchy_test.main();
   });
 }
\ No newline at end of file
diff --git a/pkg/analysis_server/test/search/type_hierarchy_test.dart b/pkg/analysis_server/test/search/type_hierarchy_test.dart
new file mode 100644
index 0000000..b0a54f8
--- /dev/null
+++ b/pkg/analysis_server/test/search/type_hierarchy_test.dart
@@ -0,0 +1,556 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.analysis.get_type_hierarhy;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/search/search_domain.dart';
+import 'package:analysis_services/constants.dart';
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/index/local_memory_index.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import '../analysis_abstract.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(GetTypeHierarchyTest);
+}
+
+
+@ReflectiveTestCase()
+class GetTypeHierarchyTest extends AbstractAnalysisTest {
+  static const String requestId = 'test-getTypeHierarchy';
+
+  @override
+  Index createIndex() {
+    return createLocalMemoryIndex();
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    server.handlers = [new SearchDomainHandler(server),];
+    createProject();
+  }
+
+  test_bad_function() {
+    addTestFile('''
+main() {
+}
+''');
+    return waitForTasksFinished().then((_) {
+      return _getTypeHierarchy('main() {').then((json) {
+        expect(json, isNull);
+      });
+    });
+  }
+
+  test_bad_recursion() {
+    addTestFile('''
+class A extends B {
+}
+class B extends A {
+}
+''');
+    return waitForTasksFinished().then((_) {
+      return _getTypeHierarchy('B extends A').then((json) {
+        expect(json, {
+          'classElement': {
+            'kind': 'CLASS',
+            'name': 'B',
+            'location': anything,
+            'flags': 0
+          },
+          'superclass': {
+            'classElement': {
+              'kind': 'CLASS',
+              'name': 'A',
+              'location': anything,
+              'flags': 0
+            },
+            'interfaces': [],
+            'mixins': [],
+            'subclasses': []
+          },
+          'interfaces': [],
+          'mixins': [],
+          'subclasses': []
+        });
+      });
+    });
+  }
+
+  test_class_displayName() {
+    addTestFile('''
+class A<T> {
+}
+class B extends A<int> {
+}
+''');
+    return waitForTasksFinished().then((_) {
+      return _getTypeHierarchy('B extends').then((jsonB) {
+        var jsonA = jsonB[SUPERCLASS];
+        expect(jsonA[CLASS_ELEMENT][NAME], 'A');
+        expect(jsonB[CLASS_ELEMENT][NAME], 'B');
+        expect(jsonA[DISPLAY_NAME], 'A<int>');
+      });
+    });
+  }
+
+  test_class_extendsTypeA() {
+    addTestFile('''
+class A {}
+class B extends A {
+}
+class C extends B {
+}
+''');
+    return waitForTasksFinished().then((_) {
+      return _getTypeHierarchy('A {}').then((json) {
+        expect(json, {
+          'classElement': {
+            'kind': 'CLASS',
+            'name': 'A',
+            'location': anything,
+            'flags': 0
+          },
+          'superclass': {
+            'classElement': {
+              'kind': 'CLASS',
+              'name': 'Object',
+              'location': anything,
+              'flags': 0
+            },
+            'interfaces': [],
+            'mixins': [],
+            'subclasses': []
+          },
+          'interfaces': [],
+          'mixins': [],
+          'subclasses': [{
+              'classElement': {
+                'kind': 'CLASS',
+                'name': 'B',
+                'location': anything,
+                'flags': 0
+              },
+              'interfaces': [],
+              'mixins': [],
+              'subclasses': [{
+                  'classElement': {
+                    'kind': 'CLASS',
+                    'name': 'C',
+                    'location': anything,
+                    'flags': 0
+                  },
+                  'interfaces': [],
+                  'mixins': [],
+                  'subclasses': []
+                }]
+            }]
+        });
+      });
+    });
+  }
+
+  test_class_extendsTypeB() {
+    addTestFile('''
+class A {
+}
+class B extends A {
+}
+class C extends B {
+}
+''');
+    return waitForTasksFinished().then((_) {
+      return _getTypeHierarchy('B extends').then((json) {
+        expect(json, {
+          'classElement': {
+            'kind': 'CLASS',
+            'name': 'B',
+            'location': anything,
+            'flags': 0
+          },
+          'superclass': {
+            'classElement': {
+              'kind': 'CLASS',
+              'name': 'A',
+              'location': anything,
+              'flags': 0
+            },
+            'superclass': {
+              'classElement': {
+                'kind': 'CLASS',
+                'name': 'Object',
+                'location': anything,
+                'flags': 0
+              },
+              'interfaces': [],
+              'mixins': [],
+              'subclasses': []
+            },
+            'interfaces': [],
+            'mixins': [],
+            'subclasses': []
+          },
+          'interfaces': [],
+          'mixins': [],
+          'subclasses': [{
+              'classElement': {
+                'kind': 'CLASS',
+                'name': 'C',
+                'location': anything,
+                'flags': 0
+              },
+              'interfaces': [],
+              'mixins': [],
+              'subclasses': []
+            }]
+        });
+      });
+    });
+  }
+
+  test_class_extendsTypeC() {
+    addTestFile('''
+class A {
+}
+class B extends A {
+}
+class C extends B {
+}
+''');
+    return waitForTasksFinished().then((_) {
+      return _getTypeHierarchy('C extends').then((json) {
+        expect(json, {
+          'classElement': {
+            'kind': 'CLASS',
+            'name': 'C',
+            'location': anything,
+            'flags': 0
+          },
+          'superclass': {
+            'classElement': {
+              'kind': 'CLASS',
+              'name': 'B',
+              'location': anything,
+              'flags': 0
+            },
+            'superclass': {
+              'classElement': {
+                'kind': 'CLASS',
+                'name': 'A',
+                'location': anything,
+                'flags': 0
+              },
+              'superclass': {
+                'classElement': {
+                  'kind': 'CLASS',
+                  'name': 'Object',
+                  'location': anything,
+                  'flags': 0
+                },
+                'interfaces': [],
+                'mixins': [],
+                'subclasses': []
+              },
+              'interfaces': [],
+              'mixins': [],
+              'subclasses': []
+            },
+            'interfaces': [],
+            'mixins': [],
+            'subclasses': []
+          },
+          'interfaces': [],
+          'mixins': [],
+          'subclasses': []
+        });
+      });
+    });
+  }
+
+  test_class_implementsTypes() {
+    addTestFile('''
+class MA {}
+class MB {}
+class B extends A {
+}
+class T implements MA, MB {
+}
+''');
+    return waitForTasksFinished().then((_) {
+      return _getTypeHierarchy('T implements').then((json) {
+        expect(json, {
+          'classElement': {
+            'kind': 'CLASS',
+            'name': 'T',
+            'location': anything,
+            'flags': 0
+          },
+          'superclass': {
+            'classElement': {
+              'kind': 'CLASS',
+              'name': 'Object',
+              'location': anything,
+              'flags': 0
+            },
+            'interfaces': [],
+            'mixins': [],
+            'subclasses': []
+          },
+          'interfaces': [{
+              'classElement': {
+                'kind': 'CLASS',
+                'name': 'MA',
+                'location': anything,
+                'flags': 0
+              },
+              'interfaces': [],
+              'mixins': [],
+              'subclasses': []
+            }, {
+              'classElement': {
+                'kind': 'CLASS',
+                'name': 'MB',
+                'location': anything,
+                'flags': 0
+              },
+              'interfaces': [],
+              'mixins': [],
+              'subclasses': []
+            }],
+          'mixins': [],
+          'subclasses': []
+        });
+      });
+    });
+  }
+
+  test_class_withTypes() {
+    addTestFile('''
+class MA {}
+class MB {}
+class B extends A {
+}
+class T extends Object with MA, MB {
+}
+''');
+    return waitForTasksFinished().then((_) {
+      return _getTypeHierarchy('T extends Object').then((json) {
+        expect(json, {
+          'classElement': {
+            'kind': 'CLASS',
+            'name': 'T',
+            'location': anything,
+            'flags': 0
+          },
+          'superclass': {
+            'classElement': {
+              'kind': 'CLASS',
+              'name': 'Object',
+              'location': anything,
+              'flags': 0
+            },
+            'interfaces': [],
+            'mixins': [],
+            'subclasses': []
+          },
+          'interfaces': [],
+          'mixins': [{
+              'classElement': {
+                'kind': 'CLASS',
+                'name': 'MA',
+                'location': anything,
+                'flags': 0
+              },
+              'interfaces': [],
+              'mixins': [],
+              'subclasses': []
+            }, {
+              'classElement': {
+                'kind': 'CLASS',
+                'name': 'MB',
+                'location': anything,
+                'flags': 0
+              },
+              'interfaces': [],
+              'mixins': [],
+              'subclasses': []
+            }],
+          'subclasses': []
+        });
+      });
+    });
+  }
+
+  test_member_getter() {
+    addTestFile('''
+class A {
+  get test => null; // in A
+}
+class B extends A {
+  get test => null; // in B
+}
+class C extends B {
+}
+class D extends C {
+  get test => null; // in D
+}
+''');
+    return waitForTasksFinished().then((_) {
+      return _getTypeHierarchy('test => null; // in B').then((jsonB) {
+        var jsonA = jsonB[SUPERCLASS];
+        var jsonC = jsonB[SUBCLASSES][0];
+        var jsonD = jsonC[SUBCLASSES][0];
+        expect(jsonA[CLASS_ELEMENT][NAME], 'A');
+        expect(jsonB[CLASS_ELEMENT][NAME], 'B');
+        expect(jsonC[CLASS_ELEMENT][NAME], 'C');
+        expect(jsonD[CLASS_ELEMENT][NAME], 'D');
+        expect(
+            jsonA[MEMBER_ELEMENT][LOCATION][OFFSET],
+            findOffset('test => null; // in A'));
+        expect(
+            jsonB[MEMBER_ELEMENT][LOCATION][OFFSET],
+            findOffset('test => null; // in B'));
+        expect(jsonC['memberElement'], isNull);
+        expect(
+            jsonD[MEMBER_ELEMENT][LOCATION][OFFSET],
+            findOffset('test => null; // in D'));
+      });
+    });
+  }
+
+  test_member_method() {
+    addTestFile('''
+class A {
+  test() {} // in A
+}
+class B extends A {
+  test() {} // in B
+}
+class C extends B {
+}
+class D extends C {
+  test() {} // in D
+}
+''');
+    return waitForTasksFinished().then((_) {
+      return _getTypeHierarchy('test() {} // in B').then((jsonB) {
+        var jsonA = jsonB[SUPERCLASS];
+        var jsonC = jsonB[SUBCLASSES][0];
+        var jsonD = jsonC[SUBCLASSES][0];
+        expect(jsonA[CLASS_ELEMENT][NAME], 'A');
+        expect(jsonB[CLASS_ELEMENT][NAME], 'B');
+        expect(jsonC[CLASS_ELEMENT][NAME], 'C');
+        expect(jsonD[CLASS_ELEMENT][NAME], 'D');
+        expect(
+            jsonA[MEMBER_ELEMENT][LOCATION][OFFSET],
+            findOffset('test() {} // in A'));
+        expect(
+            jsonB[MEMBER_ELEMENT][LOCATION][OFFSET],
+            findOffset('test() {} // in B'));
+        expect(jsonC['memberElement'], isNull);
+        expect(
+            jsonD[MEMBER_ELEMENT][LOCATION][OFFSET],
+            findOffset('test() {} // in D'));
+      });
+    });
+  }
+
+  test_member_operator() {
+    addTestFile('''
+class A {
+  operator ==(x) => null; // in A
+}
+class B extends A {
+  operator ==(x) => null; // in B
+}
+class C extends B {
+}
+class D extends C {
+  operator ==(x) => null; // in D
+}
+''');
+    return waitForTasksFinished().then((_) {
+      return _getTypeHierarchy('==(x) => null; // in B').then((jsonB) {
+        var jsonA = jsonB[SUPERCLASS];
+        var jsonC = jsonB[SUBCLASSES][0];
+        var jsonD = jsonC[SUBCLASSES][0];
+        expect(jsonA[CLASS_ELEMENT][NAME], 'A');
+        expect(jsonB[CLASS_ELEMENT][NAME], 'B');
+        expect(jsonC[CLASS_ELEMENT][NAME], 'C');
+        expect(jsonD[CLASS_ELEMENT][NAME], 'D');
+        expect(
+            jsonA[MEMBER_ELEMENT][LOCATION][OFFSET],
+            findOffset('==(x) => null; // in A'));
+        expect(
+            jsonB[MEMBER_ELEMENT][LOCATION][OFFSET],
+            findOffset('==(x) => null; // in B'));
+        expect(jsonC['memberElement'], isNull);
+        expect(
+            jsonD[MEMBER_ELEMENT][LOCATION][OFFSET],
+            findOffset('==(x) => null; // in D'));
+      });
+    });
+  }
+
+  test_member_setter() {
+    addTestFile('''
+class A {
+  set test(x) {} // in A
+}
+class B extends A {
+  set test(x) {} // in B
+}
+class C extends B {
+}
+class D extends C {
+  set test(x) {} // in D
+}
+''');
+    return waitForTasksFinished().then((_) {
+      return _getTypeHierarchy('test(x) {} // in B').then((jsonB) {
+        var jsonA = jsonB[SUPERCLASS];
+        var jsonC = jsonB[SUBCLASSES][0];
+        var jsonD = jsonC[SUBCLASSES][0];
+        expect(jsonA[CLASS_ELEMENT][NAME], 'A');
+        expect(jsonB[CLASS_ELEMENT][NAME], 'B');
+        expect(jsonC[CLASS_ELEMENT][NAME], 'C');
+        expect(jsonD[CLASS_ELEMENT][NAME], 'D');
+        expect(
+            jsonA[MEMBER_ELEMENT][LOCATION][OFFSET],
+            findOffset('test(x) {} // in A'));
+        expect(
+            jsonB[MEMBER_ELEMENT][LOCATION][OFFSET],
+            findOffset('test(x) {} // in B'));
+        expect(jsonC['memberElement'], isNull);
+        expect(
+            jsonD[MEMBER_ELEMENT][LOCATION][OFFSET],
+            findOffset('test(x) {} // in D'));
+      });
+    });
+  }
+
+  Request _createGetTypeHierarchyRequest(String search) {
+    int offset = findOffset(search);
+    Request request = new Request(requestId, SEARCH_GET_TYPE_HIERARCHY);
+    request.setParameter(FILE, testFile);
+    request.setParameter(OFFSET, offset);
+    return request;
+  }
+
+  Future<Map<String, Object>> _getTypeHierarchy(String search) {
+    Request request = _createGetTypeHierarchyRequest(search);
+    return serverChannel.sendRequest(request).then((Response response) {
+      return response.getResult(HIERARCHY) as Map<String, Object>;
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/test_all.dart b/pkg/analysis_server/test/test_all.dart
index 42730f9..825c880 100644
--- a/pkg/analysis_server/test/test_all.dart
+++ b/pkg/analysis_server/test/test_all.dart
@@ -13,15 +13,14 @@
 import 'analysis_notification_overrides_test.dart' as analysis_notification_overrides_test;
 import 'analysis_server_test.dart' as analysis_server_test;
 import 'channel_test.dart' as channel_test;
-import 'completion_test.dart' as completion_test;
 import 'computer/test_all.dart' as computer_test_all;
 import 'context_directory_manager_test.dart' as context_directory_manager_test;
 import 'domain_analysis_test.dart' as domain_analysis_test;
+import 'domain_completion_test.dart' as completion_test;
 import 'domain_server_test.dart' as domain_server_test;
 import 'edit/test_all.dart' as edit_all;
 import 'operation/test_all.dart' as operation_test_all;
 import 'package_map_provider_test.dart' as package_map_provider_test;
-import 'package_uri_resolver_test.dart' as package_uri_resolver_test;
 import 'protocol_test.dart' as protocol_test;
 import 'search/test_all.dart' as search_all;
 import 'socket_server_test.dart' as socket_server_test;
@@ -49,7 +48,6 @@
     edit_all.main();
     operation_test_all.main();
     package_map_provider_test.main();
-    package_uri_resolver_test.main();
     protocol_test.main();
     search_all.main();
     socket_server_test.main();
diff --git a/pkg/analysis_services/lib/completion/completion_computer.dart b/pkg/analysis_services/lib/completion/completion_computer.dart
new file mode 100644
index 0000000..ad273dd
--- /dev/null
+++ b/pkg/analysis_services/lib/completion/completion_computer.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.completion.computer;
+
+import 'dart:async';
+
+import 'package:analysis_services/completion/completion_suggestion.dart';
+import 'package:analysis_services/src/completion/top_level_computer.dart';
+import 'package:analysis_services/search/search_engine.dart';
+
+/**
+ * The base class for computing code completion suggestions.
+ */
+abstract class CompletionComputer {
+
+  /**
+   * Create a collection of code completion computers for the given situation.
+   */
+  static Future<List<CompletionComputer>> create(SearchEngine searchEngine) {
+    List<CompletionComputer> computers = [];
+    computers.add(new TopLevelComputer(searchEngine));
+    return new Future.value(computers);
+  }
+
+  /**
+   * Computes [CompletionSuggestion]s for the specified position in the source.
+   */
+  Future<List<CompletionSuggestion>> compute();
+}
diff --git a/pkg/analysis_services/lib/completion/completion_suggestion.dart b/pkg/analysis_services/lib/completion/completion_suggestion.dart
index 14e9fcb..523319f 100644
--- a/pkg/analysis_services/lib/completion/completion_suggestion.dart
+++ b/pkg/analysis_services/lib/completion/completion_suggestion.dart
@@ -12,14 +12,60 @@
  * A single completion suggestion.
  */
 class CompletionSuggestion implements HasToJson {
+
+  /**
+   *  The kind of element being suggested.
+   */
   final CompletionSuggestionKind kind;
+
+  /**
+   * The relevance of this completion suggestion.
+   */
   final CompletionRelevance relevance;
+
+  /**
+   * The identifier to be inserted if the suggestion is selected.
+   * If the suggestion is for a method or function, the client might want to
+   * additionally insert a template for the parameters.
+   * The information required in order to do so is contained in other fields.
+   */
   final String completion;
+
+  /**
+   * The offset, relative to the beginning of the completion, of where
+   * the selection should be placed after insertion.
+   */
   final int selectionOffset;
+
+  /**
+   * The number of characters that should be selected after insertion.
+   */
   final int selectionLength;
+
+  /**
+   * `true` if the suggested element is deprecated.
+   */
   final bool isDeprecated;
+
+  /**
+   * True if the element is not known to be valid for the target.
+   * This happens if the type of the target is dynamic.
+   */
   final bool isPotential;
 
+  // optional fields
+
+//  final String docSummary;
+//  final String docComplete;
+//  final String declaringType;
+//  final String returnType;
+//  final List<String> parameterNames;
+//  final List<String> parameterTypes;
+//  final int requiredParameterCount;
+//  final int positionalParameterCount;
+//  final String parameterName;
+//  final String parameterType;
+
   CompletionSuggestion(this.kind, this.relevance, this.completion,
       this.selectionOffset, this.selectionLength, this.isDeprecated,
       this.isPotential);
@@ -66,6 +112,8 @@
       const CompletionSuggestionKind('FUNCTION');
   static const CompletionSuggestionKind FUNCTION_ALIAS =
       const CompletionSuggestionKind('FUNCTION_ALIAS');
+  static const CompletionSuggestionKind FUNCTION_TYPE_ALIAS =
+      const CompletionSuggestionKind('FUNCTION_TYPE_ALIAS');
   static const CompletionSuggestionKind GETTER =
       const CompletionSuggestionKind('GETTER');
   static const CompletionSuggestionKind IMPORT =
@@ -107,6 +155,7 @@
     if (FIELD.name == name) return FIELD;
     if (FUNCTION.name == name) return FUNCTION;
     if (FUNCTION_ALIAS.name == name) return FUNCTION_ALIAS;
+    if (FUNCTION_TYPE_ALIAS.name == name) return FUNCTION_TYPE_ALIAS;
     if (GETTER.name == name) return GETTER;
     if (IMPORT.name == name) return IMPORT;
     if (LIBRARY_PREFIX.name == name) return LIBRARY_PREFIX;
@@ -149,7 +198,6 @@
     //    ElementKind.LIBRARY,
     //    ElementKind.LOCAL_VARIABLE,
     if (kind == ElementKind.METHOD) return METHOD;
-    //    ElementKind.METHOD,
     //    ElementKind.NAME,
     if (kind == ElementKind.PARAMETER) return PARAMETER;
     //    ElementKind.POLYMER_ATTRIBUTE,
@@ -158,7 +206,7 @@
     //    ElementKind.PREFIX,
     if (kind == ElementKind.SETTER) return SETTER;
     if (kind == ElementKind.TOP_LEVEL_VARIABLE) return TOP_LEVEL_VARIABLE;
-    //    ElementKind.FUNCTION_TYPE_ALIAS,
+    if (kind == ElementKind.FUNCTION_TYPE_ALIAS) return FUNCTION_TYPE_ALIAS;
     //    ElementKind.TYPE_PARAMETER,
     //    ElementKind.UNIVERSE
     throw new ArgumentError('Unknown CompletionSuggestionKind for: $kind');
diff --git a/pkg/analysis_services/lib/constants.dart b/pkg/analysis_services/lib/constants.dart
index dab2e6e..def5954 100644
--- a/pkg/analysis_services/lib/constants.dart
+++ b/pkg/analysis_services/lib/constants.dart
@@ -9,6 +9,7 @@
 //
 const String ADDED = 'added';
 const String CHILDREN = 'children';
+const String CLASS_ELEMENT = 'classElement';
 const String COMPLETION = 'completion';
 const String CONTAINING_LIBRARY_NAME = 'containingLibraryName';
 const String CONTAINING_LIBRARY_PATH = 'containingLibraryPath';
@@ -16,6 +17,7 @@
 const String CORRECTION = 'correction';
 const String DART_DOC = 'dartdoc';
 const String DEFAULT = 'default';
+const String DISPLAY_NAME = 'displayName';
 const String EDITS = 'edits';
 const String ELEMENT = 'element';
 const String ELEMENT_DESCRIPTION = 'elementDescription';
@@ -23,15 +25,18 @@
 const String EXCLUDED = 'excluded';
 const String ERROR = 'error';
 const String ERRORS = 'errors';
+const String FATAL = 'fatal';
 const String FILE = 'file';
 const String FILES = 'files';
 const String FIXES = 'fixes';
 const String FLAGS = 'flags';
+const String HIERARCHY = 'hierarchy';
 const String HOVERS = 'hovers';
 const String ID = 'id';
 const String INCLUDE_POTENTIAL = 'includePotential';
 const String INCLUDED = 'included';
 const String INTERFACE_ELEMENTS = 'interfaceElements';
+const String INTERFACES = 'interfaces';
 const String IS_ABSTRACT = 'isAbstract';
 const String IS_DEPRECATED = 'isDeprecated';
 const String IS_POTENTIAL = 'isPotential';
@@ -41,7 +46,9 @@
 const String LENGTH = 'length';
 const String LINKED_POSITION_GROUPS = 'linkedPositionGroups';
 const String LOCATION = 'location';
+const String MEMBER_ELEMENT = 'memberElement';
 const String MESSAGE = 'message';
+const String MIXINS = 'mixins';
 const String NAME = 'name';
 const String NEW_LENGTH = 'newLength';
 const String OCCURRENCES = 'occurrences';
@@ -67,10 +74,13 @@
 const String SEVERITY = 'severity';
 const String SELECTION_LENGTH = 'selectionLength';
 const String SELECTION_OFFSET = 'selectionOffset';
+const String STACK_TRACE = 'stackTrace';
 const String START_COLUMN = 'startColumn';
 const String START_LINE = 'startLine';
 const String STATIC_TYPE = 'staticType';
+const String SUBCLASSES = 'subclasses';
 const String SUBSCRIPTIONS = 'subscriptions';
+const String SUPERCLASS = 'superclass';
 const String SUPER_CLASS_ELEMENT = 'superclassElement';
 const String TARGETS = 'targets';
 const String TYPE = 'type';
diff --git a/pkg/analysis_services/lib/correction/assist.dart b/pkg/analysis_services/lib/correction/assist.dart
new file mode 100644
index 0000000..a81c211
--- /dev/null
+++ b/pkg/analysis_services/lib/correction/assist.dart
@@ -0,0 +1,136 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.correction.assist;
+
+import 'package:analysis_services/correction/change.dart';
+import 'package:analysis_services/search/search_engine.dart';
+import 'package:analysis_services/src/correction/assist.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+
+/**
+ * Computes [Assist]s at the given location.
+ *
+ * Returns the computed [Assist]s, not `null`.
+ */
+List<Assist> computeAssists(SearchEngine searchEngine, CompilationUnit unit,
+    int offset, int length) {
+  Source source = unit.element.source;
+  String file = source.fullName;
+  AssistProcessor processor =
+      new AssistProcessor(searchEngine, source, file, unit, offset, length);
+  return processor.compute();
+}
+
+
+/**
+ * A description of a single proposed assist.
+ */
+class Assist {
+  final AssistKind kind;
+  final Change change;
+
+  Assist(this.kind, this.change);
+
+  @override
+  String toString() {
+    return 'Assist(kind=$kind, change=$change)';
+  }
+}
+
+
+/**
+ * An enumeration of possible quick assist kinds.
+ */
+class AssistKind {
+  static const ADD_PART_DIRECTIVE =
+      const AssistKind('ADD_PART_DIRECTIVE', 30, "Add 'part' directive");
+  static const ADD_TYPE_ANNOTATION =
+      const AssistKind('ADD_TYPE_ANNOTATION', 30, "Add type annotation");
+  static const ASSIGN_TO_LOCAL_VARIABLE =
+      const AssistKind(
+          'ASSIGN_TO_LOCAL_VARIABLE',
+          30,
+          "Assign value to new local variable");
+  static const CONVERT_INTO_BLOCK_BODY =
+      const AssistKind('CONVERT_INTO_BLOCK_BODY', 30, "Convert into block body");
+  static const CONVERT_INTO_EXPRESSION_BODY =
+      const AssistKind(
+          'CONVERT_INTO_EXPRESSION_BODY',
+          30,
+          "Convert into expression body");
+  static const CONVERT_INTO_IS_NOT =
+      const AssistKind('CONVERT_INTO_IS_NOT', 30, "Convert into is!");
+  static const CONVERT_INTO_IS_NOT_EMPTY =
+      const AssistKind('CONVERT_INTO_IS_NOT_EMPTY', 30, "Convert into 'isNotEmpty'");
+  static const EXCHANGE_OPERANDS =
+      const AssistKind('EXCHANGE_OPERANDS', 30, "Exchange operands");
+  static const EXTRACT_CLASS =
+      const AssistKind('EXTRACT_CLASS', 30, "Extract class into file '%s'");
+  static const IMPORT_ADD_SHOW =
+      const AssistKind('IMPORT_ADD_SHOW', 30, "Add explicit 'show' combinator");
+  static const INVERT_IF_STATEMENT =
+      const AssistKind('INVERT_IF_STATEMENT', 30, "Invert 'if' statement");
+  static const JOIN_IF_WITH_INNER =
+      const AssistKind(
+          'JOIN_IF_WITH_INNER',
+          30,
+          "Join 'if' statement with inner 'if' statement");
+  static const JOIN_IF_WITH_OUTER =
+      const AssistKind(
+          'JOIN_IF_WITH_OUTER',
+          30,
+          "Join 'if' statement with outer 'if' statement");
+  static const JOIN_VARIABLE_DECLARATION =
+      const AssistKind('JOIN_VARIABLE_DECLARATION', 30, "Join variable declaration");
+  static const REMOVE_TYPE_ANNOTATION =
+      const AssistKind('REMOVE_TYPE_ANNOTATION', 29, "Remove type annotation");
+  static const REPLACE_CONDITIONAL_WITH_IF_ELSE =
+      const AssistKind(
+          'REPLACE_CONDITIONAL_WITH_IF_ELSE',
+          30,
+          "Replace conditional with 'if-else'");
+  static const REPLACE_IF_ELSE_WITH_CONDITIONAL =
+      const AssistKind(
+          'REPLACE_IF_ELSE_WITH_CONDITIONAL',
+          30,
+          "Replace 'if-else' with conditional ('c ? x : y')");
+  static const SPLIT_AND_CONDITION =
+      const AssistKind('SPLIT_AND_CONDITION', 30, "Split && condition");
+  static const SPLIT_VARIABLE_DECLARATION =
+      const AssistKind(
+          'SPLIT_VARIABLE_DECLARATION',
+          30,
+          "Split variable declaration");
+  static const SURROUND_WITH_BLOCK =
+      const AssistKind('SURROUND_WITH_BLOCK', 30, "Surround with block");
+  static const SURROUND_WITH_DO_WHILE =
+      const AssistKind('SURROUND_WITH_DO_WHILE', 30, "Surround with 'do-while'");
+  static const SURROUND_WITH_FOR =
+      const AssistKind('SURROUND_WITH_FOR', 30, "Surround with 'for'");
+  static const SURROUND_WITH_FOR_IN =
+      const AssistKind('SURROUND_WITH_FOR_IN', 30, "Surround with 'for-in'");
+  static const SURROUND_WITH_IF =
+      const AssistKind('SURROUND_WITH_IF', 30, "Surround with 'if'");
+  static const SURROUND_WITH_TRY_CATCH =
+      const AssistKind('SURROUND_WITH_TRY_CATCH', 30, "Surround with 'try-catch'");
+  static const SURROUND_WITH_TRY_FINALLY =
+      const AssistKind(
+          'SURROUND_WITH_TRY_FINALLY',
+          30,
+          "Surround with 'try-finally'");
+  static const SURROUND_WITH_WHILE =
+      const AssistKind('SURROUND_WITH_WHILE', 30, "Surround with 'while'");
+
+  final name;
+  final int relevance;
+  final String message;
+
+  const AssistKind(this.name, this.relevance, this.message);
+
+  @override
+  String toString() => name;
+}
diff --git a/pkg/analysis_services/lib/correction/fix.dart b/pkg/analysis_services/lib/correction/fix.dart
index eaafa6db..3db3401 100644
--- a/pkg/analysis_services/lib/correction/fix.dart
+++ b/pkg/analysis_services/lib/correction/fix.dart
@@ -126,100 +126,3 @@
   @override
   String toString() => name;
 }
-
-
-///**
-// * An enumeration of possible quick assist kinds.
-// */
-//class AssistKind {
-//  static const QA_ADD_PART_DIRECTIVE =
-//      const AssistKind('QA_ADD_PART_DIRECTIVE', 30, "Add 'part' directive");
-//  static const QA_ADD_TYPE_ANNOTATION =
-//      const AssistKind('QA_ADD_TYPE_ANNOTATION', 30, "Add type annotation");
-//  static const QA_ASSIGN_TO_LOCAL_VARIABLE =
-//      const AssistKind(
-//          'QA_ASSIGN_TO_LOCAL_VARIABLE',
-//          30,
-//          "Assign value to new local variable");
-//  static const QA_CONVERT_INTO_BLOCK_BODY =
-//      const AssistKind('QA_CONVERT_INTO_BLOCK_BODY', 30, "Convert into block body");
-//  static const QA_CONVERT_INTO_EXPRESSION_BODY =
-//      const AssistKind(
-//          'QA_CONVERT_INTO_EXPRESSION_BODY',
-//          30,
-//          "Convert into expression body");
-//  static const QA_CONVERT_INTO_IS_NOT =
-//      const AssistKind('QA_CONVERT_INTO_IS_NOT', 30, "Convert into is!");
-//  static const QA_CONVERT_INTO_IS_NOT_EMPTY =
-//      const AssistKind(
-//          'QA_CONVERT_INTO_IS_NOT_EMPTY',
-//          30,
-//          "Convert into 'isNotEmpty'");
-//  static const QA_EXCHANGE_OPERANDS =
-//      const AssistKind('QA_EXCHANGE_OPERANDS', 30, "Exchange operands");
-//  static const QA_EXTRACT_CLASS =
-//      const AssistKind('QA_EXTRACT_CLASS', 30, "Extract class into file '%s'");
-//  static const QA_IMPORT_ADD_SHOW =
-//      const AssistKind('QA_IMPORT_ADD_SHOW', 30, "Add explicit 'show' combinator");
-//  static const QA_INVERT_IF_STATEMENT =
-//      const AssistKind('QA_INVERT_IF_STATEMENT', 30, "Invert 'if' statement");
-//  static const QA_JOIN_IF_WITH_INNER =
-//      const AssistKind(
-//          'QA_JOIN_IF_WITH_INNER',
-//          30,
-//          "Join 'if' statement with inner 'if' statement");
-//  static const QA_JOIN_IF_WITH_OUTER =
-//      const AssistKind(
-//          'QA_JOIN_IF_WITH_OUTER',
-//          30,
-//          "Join 'if' statement with outer 'if' statement");
-//  static const QA_JOIN_VARIABLE_DECLARATION =
-//      const AssistKind(
-//          'QA_JOIN_VARIABLE_DECLARATION',
-//          30,
-//          "Join variable declaration");
-//  static const QA_REMOVE_TYPE_ANNOTATION =
-//      const AssistKind('QA_REMOVE_TYPE_ANNOTATION', 29, "Remove type annotation");
-//  static const QA_REPLACE_CONDITIONAL_WITH_IF_ELSE =
-//      const AssistKind(
-//          'QA_REPLACE_CONDITIONAL_WITH_IF_ELSE',
-//          30,
-//          "Replace conditional with 'if-else'");
-//  static const QA_REPLACE_IF_ELSE_WITH_CONDITIONAL =
-//      const AssistKind(
-//          'QA_REPLACE_IF_ELSE_WITH_CONDITIONAL',
-//          30,
-//          "Replace 'if-else' with conditional ('c ? x : y')");
-//  static const QA_SPLIT_AND_CONDITION =
-//      const AssistKind('QA_SPLIT_AND_CONDITION', 30, "Split && condition");
-//  static const QA_SPLIT_VARIABLE_DECLARATION =
-//      const AssistKind(
-//          'QA_SPLIT_VARIABLE_DECLARATION',
-//          30,
-//          "Split variable declaration");
-//  static const QA_SURROUND_WITH_BLOCK =
-//      const AssistKind('QA_SURROUND_WITH_BLOCK', 30, "Surround with block");
-//  static const QA_SURROUND_WITH_DO_WHILE =
-//      const AssistKind('QA_SURROUND_WITH_DO_WHILE', 30, "Surround with 'do-while'");
-//  static const QA_SURROUND_WITH_FOR =
-//      const AssistKind('QA_SURROUND_WITH_FOR', 30, "Surround with 'for'");
-//  static const QA_SURROUND_WITH_FOR_IN =
-//      const AssistKind('QA_SURROUND_WITH_FOR_IN', 30, "Surround with 'for-in'");
-//  static const QA_SURROUND_WITH_IF =
-//      const AssistKind('QA_SURROUND_WITH_IF', 30, "Surround with 'if'");
-//  static const QA_SURROUND_WITH_TRY_CATCH =
-//      const AssistKind('QA_SURROUND_WITH_TRY_CATCH', 30, "Surround with 'try-catch'");
-//  static const QA_SURROUND_WITH_TRY_FINALLY =
-//      const AssistKind(
-//          'QA_SURROUND_WITH_TRY_FINALLY',
-//          30,
-//          "Surround with 'try-finally'");
-//  static const QA_SURROUND_WITH_WHILE =
-//      const AssistKind('QA_SURROUND_WITH_WHILE', 30, "Surround with 'while'");
-//
-//  final name;
-//  final int relevance;
-//  final String message;
-//
-//  const AssistKind(this.name, this.relevance, this.message);
-//}
diff --git a/pkg/analysis_services/lib/index/local_file_index.dart b/pkg/analysis_services/lib/index/local_file_index.dart
index b819ef1..3fb0c3a 100644
--- a/pkg/analysis_services/lib/index/local_file_index.dart
+++ b/pkg/analysis_services/lib/index/local_file_index.dart
@@ -4,18 +4,16 @@
 
 library services.index.local_file_index;
 
-import 'dart:io';
-
 import 'package:analysis_services/index/index.dart';
 import 'package:analysis_services/src/index/local_index.dart';
 import 'package:analysis_services/src/index/store/codec.dart';
-import 'package:analysis_services/src/index/store/separate_file_manager.dart';
+import 'package:analysis_services/src/index/store/temporary_folder_file_manager.dart';
 import 'package:analysis_services/src/index/store/split_store.dart';
 import 'package:analyzer/src/generated/engine.dart';
 
 
-Index createLocalFileIndex(Directory directory) {
-  var fileManager = new SeparateFileManager(directory);
+Index createLocalFileIndex() {
+  var fileManager = new TemporaryFolderFileManager();
   var stringCodec = new StringCodec();
   var nodeManager = new FileNodeManager(fileManager,
       AnalysisEngine.instance.logger, stringCodec, new ContextCodec(),
diff --git a/pkg/analysis_services/lib/src/completion/top_level_computer.dart b/pkg/analysis_services/lib/src/completion/top_level_computer.dart
new file mode 100644
index 0000000..9688a82
--- /dev/null
+++ b/pkg/analysis_services/lib/src/completion/top_level_computer.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.completion.computer.toplevel;
+
+import 'dart:async';
+
+import 'package:analysis_services/completion/completion_computer.dart';
+import 'package:analysis_services/completion/completion_suggestion.dart';
+import 'package:analysis_services/search/search_engine.dart';
+import 'package:analyzer/src/generated/element.dart';
+
+/**
+ * A computer for `completion.getSuggestions` request results.
+ */
+class TopLevelComputer extends CompletionComputer {
+  final SearchEngine searchEngine;
+
+  TopLevelComputer(this.searchEngine);
+
+  /**
+   * Computes [CompletionSuggestion]s for the specified position in the source.
+   */
+  Future<List<CompletionSuggestion>> compute() {
+    var future = searchEngine.searchTopLevelDeclarations('');
+    return future.then((List<SearchMatch> matches) {
+      return matches.map((SearchMatch match) {
+        Element element = match.element;
+        String completion = element.displayName;
+        return new CompletionSuggestion(
+            CompletionSuggestionKind.fromElementKind(element.kind),
+            CompletionRelevance.DEFAULT,
+            completion,
+            completion.length,
+            0,
+            element.isDeprecated,
+            false // isPotential
+            );
+      }).toList();
+    });
+  }
+}
diff --git a/pkg/analysis_services/lib/src/correction/assist.dart b/pkg/analysis_services/lib/src/correction/assist.dart
new file mode 100644
index 0000000..c116040
--- /dev/null
+++ b/pkg/analysis_services/lib/src/correction/assist.dart
@@ -0,0 +1,1614 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library services.src.correction.assist;
+
+import 'package:analysis_services/correction/assist.dart';
+import 'package:analysis_services/correction/change.dart';
+import 'package:analysis_services/search/hierarchy.dart';
+import 'package:analysis_services/search/search_engine.dart';
+import 'package:analysis_services/src/correction/name_suggestion.dart';
+import 'package:analysis_services/src/correction/source_buffer.dart';
+import 'package:analysis_services/src/correction/source_range.dart';
+import 'package:analysis_services/src/correction/util.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:path/path.dart';
+
+
+/**
+ * The computer for Dart assists.
+ */
+class AssistProcessor {
+  final SearchEngine searchEngine;
+  final Source source;
+  final String file;
+  final CompilationUnit unit;
+  final int selectionOffset;
+  final int selectionLength;
+  CompilationUnitElement unitElement;
+  LibraryElement unitLibraryElement;
+  String unitLibraryFile;
+  String unitLibraryFolder;
+
+  final List<Edit> edits = <Edit>[];
+  final Map<String, LinkedPositionGroup> linkedPositionGroups = <String,
+      LinkedPositionGroup>{};
+  Position endPosition = null;
+  final List<Assist> assists = <Assist>[];
+
+  int selectionEnd;
+  CorrectionUtils utils;
+  AstNode node;
+
+  AssistProcessor(this.searchEngine, this.source, this.file, this.unit,
+      this.selectionOffset, this.selectionLength) {
+    unitElement = unit.element;
+    unitLibraryElement = unitElement.library;
+    unitLibraryFile = unitLibraryElement.source.fullName;
+    unitLibraryFolder = dirname(unitLibraryFile);
+    selectionEnd = selectionOffset + selectionLength;
+  }
+
+  /**
+   * Returns the EOL to use for this [CompilationUnit].
+   */
+  String get eol => utils.endOfLine;
+
+  List<Assist> compute() {
+    utils = new CorrectionUtils(unit);
+    node = new NodeLocator.con2(
+        selectionOffset,
+        selectionEnd).searchWithin(unit);
+    // try to add proposals
+    _addProposal_addTypeAnnotation();
+    _addProposal_assignToLocalVariable();
+    _addProposal_convertToBlockFunctionBody();
+    _addProposal_convertToExpressionFunctionBody();
+    _addProposal_convertToIsNot_onIs();
+    _addProposal_convertToIsNot_onNot();
+    _addProposal_convertToIsNotEmpty();
+    _addProposal_exchangeOperands();
+    _addProposal_extractClassIntoPart();
+    _addProposal_importAddShow();
+    _addProposal_invertIf();
+    _addProposal_joinIfStatementOuter();
+    _addProposal_joinVariableDeclaration_onAssignment();
+    _addProposal_joinVariableDeclaration_onDeclaration();
+    _addProposal_removeTypeAnnotation();
+    _addProposal_replaceConditionalWithIfElse();
+    _addProposal_replaceIfElseWithConditional();
+    _addProposal_splitAndCondition();
+    _addProposal_splitVariableDeclaration();
+    _addProposal_surroundWith();
+    // done
+    return assists;
+  }
+
+  FunctionBody getEnclosingFunctionBody() {
+    {
+      FunctionExpression function =
+          node.getAncestor((node) => node is FunctionExpression);
+      if (function != null) {
+        return function.body;
+      }
+    }
+    {
+      FunctionDeclaration function =
+          node.getAncestor((node) => node is FunctionDeclaration);
+      if (function != null) {
+        return function.functionExpression.body;
+      }
+    }
+    {
+      MethodDeclaration method =
+          node.getAncestor((node) => node is MethodDeclaration);
+      if (method != null) {
+        return method.body;
+      }
+    }
+    return null;
+  }
+
+  void _addAssist(AssistKind kind, List args, {String assistFile}) {
+    if (assistFile == null) {
+      assistFile = file;
+    }
+    FileEdit fileEdit = new FileEdit(file);
+    edits.forEach((edit) => fileEdit.add(edit));
+    // prepare Change
+    String message = JavaString.format(kind.message, args);
+    Change change = new Change(message);
+    change.add(fileEdit);
+    linkedPositionGroups.values.forEach(
+        (group) => change.addLinkedPositionGroup(group));
+    change.endPosition = endPosition;
+    // add Assist
+    Assist assist = new Assist(kind, change);
+    assists.add(assist);
+    // clear
+    edits.clear();
+    linkedPositionGroups.clear();
+    endPosition = null;
+  }
+
+  /**
+   * Adds a new [Edit] to [edits].
+   */
+  void _addInsertEdit(int offset, String text) {
+    Edit edit = new Edit(offset, 0, text);
+    edits.add(edit);
+  }
+
+  void _addProposal_addTypeAnnotation() {
+    // prepare VariableDeclarationList
+    VariableDeclarationList declarationList =
+        node.getAncestor((node) => node is VariableDeclarationList);
+    if (declarationList == null) {
+      _coverageMarker();
+      return;
+    }
+    // may be has type annotation already
+    if (declarationList.type != null) {
+      _coverageMarker();
+      return;
+    }
+    // prepare single VariableDeclaration
+    List<VariableDeclaration> variables = declarationList.variables;
+    if (variables.length != 1) {
+      _coverageMarker();
+      return;
+    }
+    VariableDeclaration variable = variables[0];
+    // we need an initializer to get the type from
+    Expression initializer = variable.initializer;
+    if (initializer == null) {
+      _coverageMarker();
+      return;
+    }
+    DartType type = initializer.bestType;
+    // prepare type source
+    String typeSource;
+    if (type is InterfaceType || type is FunctionType) {
+      typeSource = utils.getTypeSource(type);
+    } else {
+      _coverageMarker();
+      return;
+    }
+    // add edit
+    Token keyword = declarationList.keyword;
+    if (keyword is KeywordToken && keyword.keyword == Keyword.VAR) {
+      SourceRange range = rangeToken(keyword);
+      _addReplaceEdit(range, typeSource);
+    } else {
+      _addInsertEdit(variable.offset, '$typeSource ');
+    }
+    // add proposal
+    _addAssist(AssistKind.ADD_TYPE_ANNOTATION, []);
+  }
+
+  void _addProposal_assignToLocalVariable() {
+    // prepare enclosing ExpressionStatement
+    Statement statement = node.getAncestor((node) => node is Statement);
+    if (statement is! ExpressionStatement) {
+      _coverageMarker();
+      return;
+    }
+    ExpressionStatement expressionStatement = statement as ExpressionStatement;
+    // prepare expression
+    Expression expression = expressionStatement.expression;
+    int offset = expression.offset;
+    // ignore if already assignment
+    if (expression is AssignmentExpression) {
+      _coverageMarker();
+      return;
+    }
+    // ignore "throw"
+    if (expression is ThrowExpression) {
+      _coverageMarker();
+      return;
+    }
+    // prepare expression type
+    DartType type = expression.bestType;
+    if (type.isVoid) {
+      _coverageMarker();
+      return;
+    }
+    // prepare source
+    SourceBuilder builder = new SourceBuilder(file, offset);
+    builder.append("var ");
+    // prepare excluded names
+    Set<String> excluded = new Set<String>();
+    {
+      ScopedNameFinder scopedNameFinder = new ScopedNameFinder(offset);
+      expression.accept(scopedNameFinder);
+      excluded.addAll(scopedNameFinder.locals.keys.toSet());
+    }
+    // name(s)
+    {
+      List<String> suggestions =
+          getVariableNameSuggestionsForExpression(type, expression, excluded);
+      builder.startPosition("NAME");
+      for (int i = 0; i < suggestions.length; i++) {
+        String name = suggestions[i];
+        if (i == 0) {
+          builder.append(name);
+        }
+        builder.addProposal(name);
+      }
+      builder.endPosition();
+    }
+    builder.append(" = ");
+    // add proposal
+    _insertBuilder(builder);
+    _addAssist(AssistKind.ASSIGN_TO_LOCAL_VARIABLE, []);
+  }
+
+  void _addProposal_convertToBlockFunctionBody() {
+    FunctionBody body = getEnclosingFunctionBody();
+    // prepare expression body
+    if (body is! ExpressionFunctionBody) {
+      _coverageMarker();
+      return;
+    }
+    Expression returnValue = (body as ExpressionFunctionBody).expression;
+    // prepare prefix
+    String prefix = utils.getNodePrefix(body.parent);
+    // add change
+    String indent = utils.getIndent(1);
+    String returnSource = 'return ' + _getSource(returnValue);
+    String newBodySource = "{$eol$prefix${indent}$returnSource;$eol$prefix}";
+    _addReplaceEdit(rangeNode(body), newBodySource);
+    // add proposal
+    _addAssist(AssistKind.CONVERT_INTO_BLOCK_BODY, []);
+  }
+
+  void _addProposal_convertToExpressionFunctionBody() {
+    // prepare current body
+    FunctionBody body = getEnclosingFunctionBody();
+    if (body is! BlockFunctionBody) {
+      _coverageMarker();
+      return;
+    }
+    // prepare return statement
+    List<Statement> statements = (body as BlockFunctionBody).block.statements;
+    if (statements.length != 1) {
+      _coverageMarker();
+      return;
+    }
+    if (statements[0] is! ReturnStatement) {
+      _coverageMarker();
+      return;
+    }
+    ReturnStatement returnStatement = statements[0] as ReturnStatement;
+    // prepare returned expression
+    Expression returnExpression = returnStatement.expression;
+    if (returnExpression == null) {
+      _coverageMarker();
+      return;
+    }
+    // add change
+    String newBodySource = "=> ${_getSource(returnExpression)}";
+    if (body.parent is! FunctionExpression ||
+        body.parent.parent is FunctionDeclaration) {
+      newBodySource += ";";
+    }
+    _addReplaceEdit(rangeNode(body), newBodySource);
+    // add proposal
+    _addAssist(AssistKind.CONVERT_INTO_EXPRESSION_BODY, []);
+  }
+
+  /**
+   * Converts "!isEmpty" -> "isNotEmpty" if possible.
+   */
+  void _addProposal_convertToIsNotEmpty() {
+    // prepare "expr.isEmpty"
+    AstNode isEmptyAccess = null;
+    SimpleIdentifier isEmptyIdentifier = null;
+    if (node is SimpleIdentifier) {
+      SimpleIdentifier identifier = node as SimpleIdentifier;
+      AstNode parent = identifier.parent;
+      // normal case (but rare)
+      if (parent is PropertyAccess) {
+        isEmptyIdentifier = parent.propertyName;
+        isEmptyAccess = parent;
+      }
+      // usual case
+      if (parent is PrefixedIdentifier) {
+        isEmptyIdentifier = parent.identifier;
+        isEmptyAccess = parent;
+      }
+    }
+    if (isEmptyIdentifier == null) {
+      _coverageMarker();
+      return;
+    }
+    // should be "isEmpty"
+    Element propertyElement = isEmptyIdentifier.bestElement;
+    if (propertyElement == null || "isEmpty" != propertyElement.name) {
+      _coverageMarker();
+      return;
+    }
+    // should have "isNotEmpty"
+    Element propertyTarget = propertyElement.enclosingElement;
+    if (propertyTarget == null ||
+        getChildren(propertyTarget, "isNotEmpty").isEmpty) {
+      _coverageMarker();
+      return;
+    }
+    // should be in PrefixExpression
+    if (isEmptyAccess.parent is! PrefixExpression) {
+      _coverageMarker();
+      return;
+    }
+    PrefixExpression prefixExpression =
+        isEmptyAccess.parent as PrefixExpression;
+    // should be !
+    if (prefixExpression.operator.type != TokenType.BANG) {
+      return;
+    }
+    // do replace
+    _addRemoveEdit(rangeStartStart(prefixExpression, prefixExpression.operand));
+    _addReplaceEdit(rangeNode(isEmptyIdentifier), "isNotEmpty");
+    // add proposal
+    _addAssist(AssistKind.CONVERT_INTO_IS_NOT_EMPTY, []);
+  }
+
+  void _addProposal_convertToIsNot_onIs() {
+    // may be child of "is"
+    AstNode node = this.node;
+    while (node != null && node is! IsExpression) {
+      node = node.parent;
+    }
+    // prepare "is"
+    if (node is! IsExpression) {
+      _coverageMarker();
+      return;
+    }
+    IsExpression isExpression = node as IsExpression;
+    if (isExpression.notOperator != null) {
+      _coverageMarker();
+      return;
+    }
+    // prepare enclosing ()
+    AstNode parent = isExpression.parent;
+    if (parent is! ParenthesizedExpression) {
+      _coverageMarker();
+      return;
+    }
+    ParenthesizedExpression parExpression = parent as ParenthesizedExpression;
+    // prepare enclosing !()
+    AstNode parent2 = parent.parent;
+    if (parent2 is! PrefixExpression) {
+      _coverageMarker();
+      return;
+    }
+    PrefixExpression prefExpression = parent2 as PrefixExpression;
+    if (prefExpression.operator.type != TokenType.BANG) {
+      _coverageMarker();
+      return;
+    }
+    // strip !()
+    if (getExpressionParentPrecedence(prefExpression) >=
+        TokenType.IS.precedence) {
+      _addRemoveEdit(rangeToken(prefExpression.operator));
+    } else {
+      _addRemoveEdit(
+          rangeStartEnd(prefExpression, parExpression.leftParenthesis));
+      _addRemoveEdit(
+          rangeStartEnd(parExpression.rightParenthesis, prefExpression));
+    }
+    _addInsertEdit(isExpression.isOperator.end, "!");
+    // add proposal
+    _addAssist(AssistKind.CONVERT_INTO_IS_NOT, []);
+  }
+
+  void _addProposal_convertToIsNot_onNot() {
+    // may be () in prefix expression
+    if (node is ParenthesizedExpression && node.parent is PrefixExpression) {
+      node = node.parent;
+    }
+    // prepare !()
+    if (node is! PrefixExpression) {
+      _coverageMarker();
+      return;
+    }
+    PrefixExpression prefExpression = node as PrefixExpression;
+    // should be ! operator
+    if (prefExpression.operator.type != TokenType.BANG) {
+      _coverageMarker();
+      return;
+    }
+    // prepare !()
+    Expression operand = prefExpression.operand;
+    if (operand is! ParenthesizedExpression) {
+      _coverageMarker();
+      return;
+    }
+    ParenthesizedExpression parExpression = operand as ParenthesizedExpression;
+    operand = parExpression.expression;
+    // prepare "is"
+    if (operand is! IsExpression) {
+      _coverageMarker();
+      return;
+    }
+    IsExpression isExpression = operand as IsExpression;
+    if (isExpression.notOperator != null) {
+      _coverageMarker();
+      return;
+    }
+    // strip !()
+    if (getExpressionParentPrecedence(prefExpression) >=
+        TokenType.IS.precedence) {
+      _addRemoveEdit(rangeToken(prefExpression.operator));
+    } else {
+      _addRemoveEdit(
+          rangeStartEnd(prefExpression, parExpression.leftParenthesis));
+      _addRemoveEdit(
+          rangeStartEnd(parExpression.rightParenthesis, prefExpression));
+    }
+    _addInsertEdit(isExpression.isOperator.end, "!");
+    // add proposal
+    _addAssist(AssistKind.CONVERT_INTO_IS_NOT, []);
+  }
+
+  void _addProposal_exchangeOperands() {
+    // check that user invokes quick assist on binary expression
+    if (node is! BinaryExpression) {
+      _coverageMarker();
+      return;
+    }
+    BinaryExpression binaryExpression = node as BinaryExpression;
+    // prepare operator position
+    if (!_isOperatorSelected(
+        binaryExpression,
+        selectionOffset,
+        selectionLength)) {
+      _coverageMarker();
+      return;
+    }
+    // add edits
+    {
+      Expression leftOperand = binaryExpression.leftOperand;
+      Expression rightOperand = binaryExpression.rightOperand;
+      // find "wide" enclosing binary expression with same operator
+      while (binaryExpression.parent is BinaryExpression) {
+        BinaryExpression newBinaryExpression =
+            binaryExpression.parent as BinaryExpression;
+        if (newBinaryExpression.operator.type !=
+            binaryExpression.operator.type) {
+          _coverageMarker();
+          break;
+        }
+        binaryExpression = newBinaryExpression;
+      }
+      // exchange parts of "wide" expression parts
+      SourceRange leftRange = rangeStartEnd(binaryExpression, leftOperand);
+      SourceRange rightRange = rangeStartEnd(rightOperand, binaryExpression);
+      _addReplaceEdit(leftRange, _getSource2(rightRange));
+      _addReplaceEdit(rightRange, _getSource2(leftRange));
+    }
+    // add proposal
+    _addAssist(AssistKind.EXCHANGE_OPERANDS, []);
+  }
+
+  void _addProposal_extractClassIntoPart() {
+    // TODO(scheglov) implement
+//    // should be on the name
+//    if (node is! SimpleIdentifier) {
+//      return;
+//    }
+//    if (node.parent is! ClassDeclaration) {
+//      return;
+//    }
+//    ClassDeclaration classDeclaration = node.parent as ClassDeclaration;
+//    SourceRange linesRange =
+//        utils.getLinesRange2(rangeNode(classDeclaration));
+//    // prepare name
+//    String className = classDeclaration.name.name;
+//    String fileName = CorrectionUtils.getRecommentedFileNameForClass(className);
+//    // prepare new file
+//    JavaFile newFile = new JavaFile.relative(_unitLibraryFolder, fileName);
+//    if (newFile.exists()) {
+//      return;
+//    }
+//    // remove class from this unit
+//    SourceChange unitChange = new SourceChange(_source.shortName, _source);
+//    unitChange.addEdit(new Edit.range(linesRange, ""));
+//    // create new unit
+//    Change createFileChange;
+//    {
+//      String newContent = "part of ${_unitLibraryElement.displayName};";
+//      newContent += utils.endOfLine;
+//      newContent += utils.endOfLine;
+//      newContent += _getSource2(linesRange);
+//      createFileChange = new CreateFileChange(fileName, newFile, newContent);
+//    }
+//    // add 'part'
+//    SourceChange libraryChange =
+//        _getInsertPartDirectiveChange(_unitLibrarySource, fileName);
+//    // add proposal
+//    Change compositeChange =
+//        new CompositeChange("", [unitChange, createFileChange, libraryChange]);
+//    _proposals.add(
+//        new ChangeCorrectionProposal(
+//            compositeChange,
+//            AssistKind.EXTRACT_CLASS,
+//            [fileName]));
+  }
+
+  void _addProposal_importAddShow() {
+    // TODO(scheglov) implement
+//    // prepare ImportDirective
+//    ImportDirective importDirective =
+//        node.getAncestor((node) => node is ImportDirective);
+//    if (importDirective == null) {
+//      return;
+//    }
+//    // there should be no existing combinators
+//    if (!importDirective.combinators.isEmpty) {
+//      return;
+//    }
+//    // prepare whole import namespace
+//    ImportElement importElement = importDirective.element;
+//    Map<String, Element> namespace =
+//        getImportNamespace(importElement);
+//    // prepare names of referenced elements (from this import)
+//    Set<String> referencedNames = new Set();
+//    for (Element element in namespace.values) {
+//      List<SearchMatch> references =
+//          searchEngine.searchReferences(element, null, null);
+//      for (SearchMatch match in references) {
+//        LibraryElement library = match.element.library;
+//        if (unitLibraryElement == library) {
+//          referencedNames.add(element.displayName);
+//          break;
+//        }
+//      }
+//    }
+//    // ignore if unused
+//    if (referencedNames.isEmpty) {
+//      return;
+//    }
+//    // prepare change
+//    String sb = " show ${StringUtils.join(referencedNames, ", ")}";
+//    _addInsertEdit(importDirective.end - 1, sb.toString());
+//    // add proposal
+//    _addAssist(AssistKind.IMPORT_ADD_SHOW, []);
+  }
+
+  void _addProposal_invertIf() {
+    // TODO(scheglov) implement
+//    if (node is! IfStatement) {
+//      return;
+//    }
+//    IfStatement ifStatement = node as IfStatement;
+//    Expression condition = ifStatement.condition;
+//    // should have both "then" and "else"
+//    Statement thenStatement = ifStatement.thenStatement;
+//    Statement elseStatement = ifStatement.elseStatement;
+//    if (thenStatement == null || elseStatement == null) {
+//      return;
+//    }
+//    // prepare source
+//    String invertedCondition = utils.invertCondition(condition);
+//    String thenSource = _getSource(thenStatement);
+//    String elseSource = _getSource(elseStatement);
+//    // do replacements
+//    _addReplaceEdit(rangeNode(condition), invertedCondition);
+//    _addReplaceEdit(rangeNode(thenStatement), elseSource);
+//    _addReplaceEdit(rangeNode(elseStatement), thenSource);
+//    // add proposal
+//    _addAssist(AssistKind.INVERT_IF_STATEMENT, []);
+  }
+
+  void _addProposal_joinIfStatementInner() {
+    // TODO(scheglov) implement
+//    // climb up condition to the (supposedly) "if" statement
+//    AstNode node = this.node;
+//    while (node is Expression) {
+//      node = node.parent;
+//    }
+//    // prepare target "if" statement
+//    if (node is! IfStatement) {
+//      return;
+//    }
+//    IfStatement targetIfStatement = node as IfStatement;
+//    if (targetIfStatement.elseStatement != null) {
+//      return;
+//    }
+//    // prepare inner "if" statement
+//    Statement targetThenStatement = targetIfStatement.thenStatement;
+//    Statement innerStatement =
+//        CorrectionUtils.getSingleStatement(targetThenStatement);
+//    if (innerStatement is! IfStatement) {
+//      return;
+//    }
+//    IfStatement innerIfStatement = innerStatement as IfStatement;
+//    if (innerIfStatement.elseStatement != null) {
+//      return;
+//    }
+//    // prepare environment
+//    String prefix = utils.getNodePrefix(targetIfStatement);
+//    // merge conditions
+//    String condition;
+//    {
+//      Expression targetCondition = targetIfStatement.condition;
+//      Expression innerCondition = innerIfStatement.condition;
+//      String targetConditionSource = _getSource(targetCondition);
+//      String innerConditionSource = _getSource(innerCondition);
+//      if (_shouldWrapParenthesisBeforeAnd(targetCondition)) {
+//        targetConditionSource = "(${targetConditionSource})";
+//      }
+//      if (_shouldWrapParenthesisBeforeAnd(innerCondition)) {
+//        innerConditionSource = "(${innerConditionSource})";
+//      }
+//      condition = "${targetConditionSource} && ${innerConditionSource}";
+//    }
+//    // replace target "if" statement
+//    {
+//      Statement innerThenStatement = innerIfStatement.thenStatement;
+//      List<Statement> innerThenStatements =
+//          CorrectionUtils.getStatements(innerThenStatement);
+//      SourceRange lineRanges = utils.getLinesRange(innerThenStatements);
+//      String oldSource = utils.getText3(lineRanges);
+//      String newSource = utils.getIndentSource2(oldSource, false);
+//      // TODO(scheglov)
+////      _addReplaceEdit(
+////          rangeNode(targetIfStatement),
+////          MessageFormat.format(
+////              "if ({0}) '{'{1}{2}{3}'}'",
+////              [condition, eol, newSource, prefix]));
+//    }
+//    // done
+//    _addAssist(AssistKind.JOIN_IF_WITH_INNER, []);
+  }
+
+  void _addProposal_joinIfStatementOuter() {
+    // TODO(scheglov) implement
+//    // climb up condition to the (supposedly) "if" statement
+//    AstNode node = this.node;
+//    while (node is Expression) {
+//      node = node.parent;
+//    }
+//    // prepare target "if" statement
+//    if (node is! IfStatement) {
+//      return;
+//    }
+//    IfStatement targetIfStatement = node as IfStatement;
+//    if (targetIfStatement.elseStatement != null) {
+//      return;
+//    }
+//    // prepare outer "if" statement
+//    AstNode parent = targetIfStatement.parent;
+//    if (parent is Block) {
+//      parent = parent.parent;
+//    }
+//    if (parent is! IfStatement) {
+//      return;
+//    }
+//    IfStatement outerIfStatement = parent as IfStatement;
+//    if (outerIfStatement.elseStatement != null) {
+//      return;
+//    }
+//    // prepare environment
+//    String prefix = utils.getNodePrefix(outerIfStatement);
+//    // merge conditions
+//    String condition;
+//    {
+//      Expression targetCondition = targetIfStatement.condition;
+//      Expression outerCondition = outerIfStatement.condition;
+//      String targetConditionSource = _getSource(targetCondition);
+//      String outerConditionSource = _getSource(outerCondition);
+//      if (_shouldWrapParenthesisBeforeAnd(targetCondition)) {
+//        targetConditionSource = "(${targetConditionSource})";
+//      }
+//      if (_shouldWrapParenthesisBeforeAnd(outerCondition)) {
+//        outerConditionSource = "(${outerConditionSource})";
+//      }
+//      condition = "${outerConditionSource} && ${targetConditionSource}";
+//    }
+//    // replace outer "if" statement
+//    {
+//      Statement targetThenStatement = targetIfStatement.thenStatement;
+//      List<Statement> targetThenStatements =
+//          CorrectionUtils.getStatements(targetThenStatement);
+//      SourceRange lineRanges = utils.getLinesRange(targetThenStatements);
+//      String oldSource = utils.getText3(lineRanges);
+//      String newSource = utils.getIndentSource2(oldSource, false);
+//      // TODO(scheglov)
+////      _addReplaceEdit(
+////          rangeNode(outerIfStatement),
+////          MessageFormat.format(
+////              "if ({0}) '{'{1}{2}{3}'}'",
+////              [condition, eol, newSource, prefix]));
+//    }
+//    // done
+//    _addAssist(AssistKind.JOIN_IF_WITH_OUTER, []);
+  }
+
+  void _addProposal_joinVariableDeclaration_onAssignment() {
+    // check that node is LHS in assignment
+    if (node is SimpleIdentifier &&
+        node.parent is AssignmentExpression &&
+        identical((node.parent as AssignmentExpression).leftHandSide, node) &&
+        node.parent.parent is ExpressionStatement) {
+    } else {
+      _coverageMarker();
+      return;
+    }
+    AssignmentExpression assignExpression = node.parent as AssignmentExpression;
+    // check that binary expression is assignment
+    if (assignExpression.operator.type != TokenType.EQ) {
+      _coverageMarker();
+      return;
+    }
+    // prepare "declaration" statement
+    Element element = (node as SimpleIdentifier).staticElement;
+    if (element == null) {
+      _coverageMarker();
+      return;
+    }
+    int declOffset = element.nameOffset;
+    AstNode declNode = new NodeLocator.con1(declOffset).searchWithin(unit);
+    if (declNode != null &&
+        declNode.parent is VariableDeclaration &&
+        identical((declNode.parent as VariableDeclaration).name, declNode) &&
+        declNode.parent.parent is VariableDeclarationList &&
+        declNode.parent.parent.parent is VariableDeclarationStatement) {
+    } else {
+      _coverageMarker();
+      return;
+    }
+    VariableDeclaration decl = declNode.parent as VariableDeclaration;
+    VariableDeclarationStatement declStatement =
+        decl.parent.parent as VariableDeclarationStatement;
+    // may be has initializer
+    if (decl.initializer != null) {
+      _coverageMarker();
+      return;
+    }
+    // check that "declaration" statement declared only one variable
+    if (declStatement.variables.variables.length != 1) {
+      _coverageMarker();
+      return;
+    }
+    // check that the "declaration" and "assignment" statements are
+    // parts of the same Block
+    ExpressionStatement assignStatement =
+        node.parent.parent as ExpressionStatement;
+    if (assignStatement.parent is Block &&
+        assignStatement.parent == declStatement.parent) {
+    } else {
+      _coverageMarker();
+      return;
+    }
+    Block block = assignStatement.parent as Block;
+    // check that "declaration" and "assignment" statements are adjacent
+    List<Statement> statements = block.statements;
+    if (statements.indexOf(assignStatement) ==
+        statements.indexOf(declStatement) + 1) {
+    } else {
+      _coverageMarker();
+      return;
+    }
+    // add edits
+    {
+      int assignOffset = assignExpression.operator.offset;
+      _addReplaceEdit(rangeEndStart(declNode, assignOffset), " ");
+    }
+    // add proposal
+    _addAssist(AssistKind.JOIN_VARIABLE_DECLARATION, []);
+  }
+
+  void _addProposal_joinVariableDeclaration_onDeclaration() {
+    // prepare enclosing VariableDeclarationList
+    VariableDeclarationList declList =
+        node.getAncestor((node) => node is VariableDeclarationList);
+    if (declList != null && declList.variables.length == 1) {
+    } else {
+      _coverageMarker();
+      return;
+    }
+    VariableDeclaration decl = declList.variables[0];
+    // already initialized
+    if (decl.initializer != null) {
+      _coverageMarker();
+      return;
+    }
+    // prepare VariableDeclarationStatement in Block
+    if (declList.parent is VariableDeclarationStatement &&
+        declList.parent.parent is Block) {
+    } else {
+      _coverageMarker();
+      return;
+    }
+    VariableDeclarationStatement declStatement =
+        declList.parent as VariableDeclarationStatement;
+    Block block = declStatement.parent as Block;
+    List<Statement> statements = block.statements;
+    // prepare assignment
+    AssignmentExpression assignExpression;
+    {
+      // declaration should not be last Statement
+      int declIndex = statements.indexOf(declStatement);
+      if (declIndex < statements.length - 1) {
+      } else {
+        _coverageMarker();
+        return;
+      }
+      // next Statement should be assignment
+      Statement assignStatement = statements[declIndex + 1];
+      if (assignStatement is ExpressionStatement) {
+      } else {
+        _coverageMarker();
+        return;
+      }
+      ExpressionStatement expressionStatement =
+          assignStatement as ExpressionStatement;
+      // expression should be assignment
+      if (expressionStatement.expression is AssignmentExpression) {
+      } else {
+        _coverageMarker();
+        return;
+      }
+      assignExpression = expressionStatement.expression as AssignmentExpression;
+    }
+    // check that pure assignment
+    if (assignExpression.operator.type != TokenType.EQ) {
+      _coverageMarker();
+      return;
+    }
+    // add edits
+    {
+      int assignOffset = assignExpression.operator.offset;
+      _addReplaceEdit(rangeEndStart(decl.name, assignOffset), " ");
+    }
+    // add proposal
+    _addAssist(AssistKind.JOIN_VARIABLE_DECLARATION, []);
+  }
+
+  void _addProposal_removeTypeAnnotation() {
+    AstNode typeStart = null;
+    AstNode typeEnd = null;
+    // try top-level variable
+    {
+      TopLevelVariableDeclaration declaration =
+          node.getAncestor((node) => node is TopLevelVariableDeclaration);
+      if (declaration != null) {
+        TypeName typeNode = declaration.variables.type;
+        if (typeNode != null) {
+          VariableDeclaration field = declaration.variables.variables[0];
+          typeStart = declaration;
+          typeEnd = field;
+        }
+      }
+    }
+    // try class field
+    {
+      FieldDeclaration fieldDeclaration =
+          node.getAncestor((node) => node is FieldDeclaration);
+      if (fieldDeclaration != null) {
+        TypeName typeNode = fieldDeclaration.fields.type;
+        if (typeNode != null) {
+          VariableDeclaration field = fieldDeclaration.fields.variables[0];
+          typeStart = fieldDeclaration;
+          typeEnd = field;
+        }
+      }
+    }
+    // try local variable
+    {
+      VariableDeclarationStatement statement =
+          node.getAncestor((node) => node is VariableDeclarationStatement);
+      if (statement != null) {
+        TypeName typeNode = statement.variables.type;
+        if (typeNode != null) {
+          VariableDeclaration variable = statement.variables.variables[0];
+          typeStart = typeNode;
+          typeEnd = variable;
+        }
+      }
+    }
+    // add edit
+    if (typeStart != null && typeEnd != null) {
+      SourceRange typeRange = rangeStartStart(typeStart, typeEnd);
+      _addReplaceEdit(typeRange, "var ");
+    }
+    // add proposal
+    _addAssist(AssistKind.REMOVE_TYPE_ANNOTATION, []);
+  }
+
+  void _addProposal_replaceConditionalWithIfElse() {
+    ConditionalExpression conditional = null;
+    // may be on Statement with Conditional
+    Statement statement = node.getAncestor((node) => node is Statement);
+    if (statement == null) {
+      _coverageMarker();
+      return;
+    }
+    // variable declaration
+    bool inVariable = false;
+    if (statement is VariableDeclarationStatement) {
+      VariableDeclarationStatement variableStatement = statement;
+      for (VariableDeclaration variable in
+          variableStatement.variables.variables) {
+        if (variable.initializer is ConditionalExpression) {
+          conditional = variable.initializer as ConditionalExpression;
+          inVariable = true;
+          break;
+        }
+      }
+    }
+    // assignment
+    bool inAssignment = false;
+    if (statement is ExpressionStatement) {
+      ExpressionStatement exprStmt = statement;
+      if (exprStmt.expression is AssignmentExpression) {
+        AssignmentExpression assignment =
+            exprStmt.expression as AssignmentExpression;
+        if (assignment.operator.type == TokenType.EQ &&
+            assignment.rightHandSide is ConditionalExpression) {
+          conditional = assignment.rightHandSide as ConditionalExpression;
+          inAssignment = true;
+        }
+      }
+    }
+    // return
+    bool inReturn = false;
+    if (statement is ReturnStatement) {
+      ReturnStatement returnStatement = statement;
+      if (returnStatement.expression is ConditionalExpression) {
+        conditional = returnStatement.expression as ConditionalExpression;
+        inReturn = true;
+      }
+    }
+    // prepare environment
+    String indent = utils.getIndent(1);
+    String prefix = utils.getNodePrefix(statement);
+    // Type v = Conditional;
+    if (inVariable) {
+      VariableDeclaration variable = conditional.parent as VariableDeclaration;
+      _addRemoveEdit(rangeEndEnd(variable.name, conditional));
+      String conditionSrc = _getSource(conditional.condition);
+      String thenSrc = _getSource(conditional.thenExpression);
+      String elseSrc = _getSource(conditional.elseExpression);
+      String name = variable.name.name;
+      String src = eol;
+      src += prefix + 'if ($conditionSrc) {' + eol;
+      src += prefix + indent + '$name = $thenSrc;' + eol;
+      src += prefix + '} else {' + eol;
+      src += prefix + indent + '$name = $elseSrc;' + eol;
+      src += prefix + '}';
+      _addReplaceEdit(rangeEndLength(statement, 0), src);
+    }
+    // v = Conditional;
+    if (inAssignment) {
+      AssignmentExpression assignment =
+          conditional.parent as AssignmentExpression;
+      Expression leftSide = assignment.leftHandSide;
+      String conditionSrc = _getSource(conditional.condition);
+      String thenSrc = _getSource(conditional.thenExpression);
+      String elseSrc = _getSource(conditional.elseExpression);
+      String name = _getSource(leftSide);
+      String src = '';
+      src += 'if ($conditionSrc) {' + eol;
+      src += prefix + indent + '$name = $thenSrc;' + eol;
+      src += prefix + '} else {' + eol;
+      src += prefix + indent + '$name = $elseSrc;' + eol;
+      src += prefix + '}';
+      _addReplaceEdit(rangeNode(statement), src);
+    }
+    // return Conditional;
+    if (inReturn) {
+      String conditionSrc = _getSource(conditional.condition);
+      String thenSrc = _getSource(conditional.thenExpression);
+      String elseSrc = _getSource(conditional.elseExpression);
+      String src = '';
+      src += 'if ($conditionSrc) {' + eol;
+      src += prefix + indent + 'return $thenSrc;' + eol;
+      src += prefix + '} else {' + eol;
+      src += prefix + indent + 'return $elseSrc;' + eol;
+      src += prefix + '}';
+      _addReplaceEdit(rangeNode(statement), src);
+    }
+    // add proposal
+    _addAssist(AssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE, []);
+  }
+
+  void _addProposal_replaceIfElseWithConditional() {
+    // TODO(scheglov) implement
+//    // should be "if"
+//    if (node is! IfStatement) {
+//      return;
+//    }
+//    IfStatement ifStatement = node as IfStatement;
+//    // single then/else statements
+//    Statement thenStatement =
+//        CorrectionUtils.getSingleStatement(ifStatement.thenStatement);
+//    Statement elseStatement =
+//        CorrectionUtils.getSingleStatement(ifStatement.elseStatement);
+//    if (thenStatement == null || elseStatement == null) {
+//      return;
+//    }
+//    // returns
+//    if (thenStatement is ReturnStatement || elseStatement is ReturnStatement) {
+//      ReturnStatement thenReturn = thenStatement as ReturnStatement;
+//      ReturnStatement elseReturn = elseStatement as ReturnStatement;
+//      // TODO(scheglov)
+////      _addReplaceEdit(
+////          rangeNode(ifStatement),
+////          MessageFormat.format(
+////              "return {0} ? {1} : {2};",
+////              [
+////                  _getSource(ifStatement.condition),
+////                  _getSource(thenReturn.expression),
+////                  _getSource(elseReturn.expression)]));
+//    }
+//    // assignments -> v = Conditional;
+//    if (thenStatement is ExpressionStatement &&
+//        elseStatement is ExpressionStatement) {
+//      Expression thenExpression = thenStatement.expression;
+//      Expression elseExpression = elseStatement.expression;
+//      if (thenExpression is AssignmentExpression &&
+//          elseExpression is AssignmentExpression) {
+//        AssignmentExpression thenAssignment = thenExpression;
+//        AssignmentExpression elseAssignment = elseExpression;
+//        String thenTarget = _getSource(thenAssignment.leftHandSide);
+//        String elseTarget = _getSource(elseAssignment.leftHandSide);
+//        if (thenAssignment.operator.type == TokenType.EQ &&
+//            elseAssignment.operator.type == TokenType.EQ &&
+//            StringUtils.equals(thenTarget, elseTarget)) {
+//          // TODO(scheglov)
+////          _addReplaceEdit(
+////              rangeNode(ifStatement),
+////              MessageFormat.format(
+////                  "{0} = {1} ? {2} : {3};",
+////                  [
+////                      thenTarget,
+////                      _getSource(ifStatement.condition),
+////                      _getSource(thenAssignment.rightHandSide),
+////                      _getSource(elseAssignment.rightHandSide)]));
+//        }
+//      }
+//    }
+//    // add proposal
+//    _addAssist(
+//        AssistKind.REPLACE_IF_ELSE_WITH_CONDITIONAL,
+//        []);
+  }
+
+  void _addProposal_splitAndCondition() {
+    // TODO(scheglov) implement
+//    // check that user invokes quick assist on binary expression
+//    if (node is! BinaryExpression) {
+//      return;
+//    }
+//    BinaryExpression binaryExpression = node as BinaryExpression;
+//    // prepare operator position
+//    int offset =
+//        _isOperatorSelected(binaryExpression, _selectionOffset, _selectionLength);
+//    if (offset == -1) {
+//      return;
+//    }
+//    // should be &&
+//    if (binaryExpression.operator.type != TokenType.AMPERSAND_AMPERSAND) {
+//      return;
+//    }
+//    // prepare "if"
+//    Statement statement = node.getAncestor((node) => node is Statement);
+//    if (statement is! IfStatement) {
+//      return;
+//    }
+//    IfStatement ifStatement = statement as IfStatement;
+//    // check that binary expression is part of first level && condition of "if"
+//    BinaryExpression condition = binaryExpression;
+//    while (condition.parent is BinaryExpression &&
+//        (condition.parent as BinaryExpression).operator.type ==
+//            TokenType.AMPERSAND_AMPERSAND) {
+//      condition = condition.parent as BinaryExpression;
+//    }
+//    if (!identical(ifStatement.condition, condition)) {
+//      return;
+//    }
+//    // prepare environment
+//    String prefix = utils.getNodePrefix(ifStatement);
+//    String indent = utils.getIndent(1);
+//    // prepare "rightCondition"
+//    String rightConditionSource;
+//    {
+//      SourceRange rightConditionRange =
+//          rangeStartEnd(binaryExpression.rightOperand, condition);
+//      rightConditionSource = _getSource2(rightConditionRange);
+//    }
+//    // remove "&& rightCondition"
+//    _addRemoveEdit(
+//        rangeEndEnd(binaryExpression.leftOperand, condition));
+//    // update "then" statement
+//    Statement thenStatement = ifStatement.thenStatement;
+//    Statement elseStatement = ifStatement.elseStatement;
+//    if (thenStatement is Block) {
+//      Block thenBlock = thenStatement;
+//      SourceRange thenBlockRange = rangeNode(thenBlock);
+//      // insert inner "if" with right part of "condition"
+//      {
+//        String source =
+//            "${eol}${prefix}${indent}if (${rightConditionSource}) {";
+//        int thenBlockInsideOffset = thenBlockRange.offset + 1;
+//        _addInsertEdit(thenBlockInsideOffset, source);
+//      }
+//      // insert closing "}" for inner "if"
+//      {
+//        int thenBlockEnd = thenBlockRange.end;
+//        String source = "${indent}}";
+//        // may be move "else" statements
+//        if (elseStatement != null) {
+//          List<Statement> elseStatements =
+//              CorrectionUtils.getStatements(elseStatement);
+//          SourceRange elseLinesRange = utils.getLinesRange(elseStatements);
+//          String elseIndentOld = "${prefix}${indent}";
+//          String elseIndentNew = "${elseIndentOld}${indent}";
+//          String newElseSource =
+//              utils.getIndentSource(elseLinesRange, elseIndentOld, elseIndentNew);
+//          // append "else" block
+//          source += " else {${eol}";
+//          source += newElseSource;
+//          source += "${prefix}${indent}}";
+//          // remove old "else" range
+//          _addRemoveEdit(
+//              rangeStartEnd(thenBlockEnd, elseStatement));
+//        }
+//        // insert before outer "then" block "}"
+//        source += "${eol}${prefix}";
+//        _addInsertEdit(thenBlockEnd - 1, source);
+//      }
+//    } else {
+//      // insert inner "if" with right part of "condition"
+//      {
+//        String source = "${eol}${prefix}${indent}if (${rightConditionSource})";
+//        _addInsertEdit(ifStatement.rightParenthesis.offset + 1, source);
+//      }
+//      // indent "else" statements to correspond inner "if"
+//      if (elseStatement != null) {
+//        SourceRange elseRange =
+//            rangeStartEnd(ifStatement.elseKeyword.offset, elseStatement);
+//        SourceRange elseLinesRange = utils.getLinesRange2(elseRange);
+//        String elseIndentOld = prefix;
+//        String elseIndentNew = "${elseIndentOld}${indent}";
+//        edits.add(
+//            utils.createIndentEdit(elseLinesRange, elseIndentOld, elseIndentNew));
+//      }
+//    }
+//    // indent "then" statements to correspond inner "if"
+//    {
+//      List<Statement> thenStatements =
+//          CorrectionUtils.getStatements(thenStatement);
+//      SourceRange linesRange = utils.getLinesRange(thenStatements);
+//      String thenIndentOld = "${prefix}${indent}";
+//      String thenIndentNew = "${thenIndentOld}${indent}";
+//      edits.add(
+//          utils.createIndentEdit(linesRange, thenIndentOld, thenIndentNew));
+//    }
+//    // add proposal
+//    _addAssist(AssistKind.SPLIT_AND_CONDITION, []);
+  }
+
+  void _addProposal_splitVariableDeclaration() {
+    // TODO(scheglov) implement
+//    // prepare DartVariableStatement, should be part of Block
+//    VariableDeclarationStatement statement =
+//        node.getAncestor((node) => node is VariableDeclarationStatement);
+//    if (statement != null && statement.parent is Block) {
+//    } else {
+//      return;
+//    }
+//    // check that statement declares single variable
+//    List<VariableDeclaration> variables = statement.variables.variables;
+//    if (variables.length != 1) {
+//      return;
+//    }
+//    VariableDeclaration variable = variables[0];
+//    // remove initializer value
+//    _addRemoveEdit(
+//        rangeEndStart(variable.name, statement.semicolon));
+//    // TODO(scheglov)
+////    // add assignment statement
+////    String indent = _utils.getNodePrefix(statement);
+////    String assignSource =
+////        MessageFormat.format(
+////            "{0} = {1};",
+////            [variable.name.name, _getSource(variable.initializer)]);
+////    SourceRange assignRange = rangeEndLength(statement, 0);
+////    _addReplaceEdit(assignRange, "${eol}${indent}${assignSource}");
+////    // add proposal
+////    _addUnitCorrectionProposal(
+////        AssistKind.SPLIT_VARIABLE_DECLARATION,
+////        []);
+  }
+
+  void _addProposal_surroundWith() {
+    // TODO(scheglov) implement
+//    // prepare selected statements
+//    List<Statement> selectedStatements;
+//    {
+//      SourceRange selection =
+//          rangeStartLength(_selectionOffset, _selectionLength);
+//      StatementAnalyzer selectionAnalyzer =
+//          new StatementAnalyzer.con1(_unit, selection);
+//      _unit.accept(selectionAnalyzer);
+//      List<AstNode> selectedNodes = selectionAnalyzer.selectedNodes;
+//      // convert nodes to statements
+//      selectedStatements = [];
+//      for (AstNode selectedNode in selectedNodes) {
+//        if (selectedNode is Statement) {
+//          selectedStatements.add(selectedNode);
+//        }
+//      }
+//      // we want only statements
+//      if (selectedStatements.isEmpty ||
+//          selectedStatements.length != selectedNodes.length) {
+//        return;
+//      }
+//    }
+//    // prepare statement information
+//    Statement firstStatement = selectedStatements[0];
+//    Statement lastStatement = selectedStatements[selectedStatements.length - 1];
+//    SourceRange statementsRange = utils.getLinesRange(selectedStatements);
+//    // prepare environment
+//    String indentOld = utils.getNodePrefix(firstStatement);
+//    String indentNew = "${indentOld}${utils.getIndent(1)}";
+//    // "block"
+//    {
+//      _addInsertEdit(statementsRange.offset, "${indentOld}{${eol}");
+//      {
+//        Edit edit =
+//            utils.createIndentEdit(statementsRange, indentOld, indentNew);
+//        edits.add(edit);
+//      }
+//      _addInsertEdit(statementsRange.end, "${indentOld}}${eol}");
+//      _proposalEndRange = rangeEndLength(lastStatement, 0);
+//      // add proposal
+//      _addAssist(AssistKind.SURROUND_WITH_BLOCK, []);
+//    }
+//    // "if"
+//    {
+//      {
+//        int offset = statementsRange.offset;
+//        SourceBuilder sb = new SourceBuilder.con1(offset);
+//        sb.append(indentOld);
+//        sb.append("if (");
+//        {
+//          sb.startPosition("CONDITION");
+//          sb.append("condition");
+//          sb.endPosition();
+//        }
+//        sb.append(") {");
+//        sb.append(eol);
+//        _insertBuilder(sb);
+//      }
+//      {
+//        Edit edit =
+//            utils.createIndentEdit(statementsRange, indentOld, indentNew);
+//        edits.add(edit);
+//      }
+//      _addInsertEdit(statementsRange.end, "${indentOld}}${eol}");
+//      _proposalEndRange = rangeEndLength(lastStatement, 0);
+//      // add proposal
+//      _addAssist(AssistKind.SURROUND_WITH_IF, []);
+//    }
+//    // "while"
+//    {
+//      {
+//        int offset = statementsRange.offset;
+//        SourceBuilder sb = new SourceBuilder.con1(offset);
+//        sb.append(indentOld);
+//        sb.append("while (");
+//        {
+//          sb.startPosition("CONDITION");
+//          sb.append("condition");
+//          sb.endPosition();
+//        }
+//        sb.append(") {");
+//        sb.append(eol);
+//        _insertBuilder(sb);
+//      }
+//      {
+//        Edit edit =
+//            utils.createIndentEdit(statementsRange, indentOld, indentNew);
+//        edits.add(edit);
+//      }
+//      _addInsertEdit(statementsRange.end, "${indentOld}}${eol}");
+//      _proposalEndRange = rangeEndLength(lastStatement, 0);
+//      // add proposal
+//      _addAssist(AssistKind.SURROUND_WITH_WHILE, []);
+//    }
+//    // "for-in"
+//    {
+//      {
+//        int offset = statementsRange.offset;
+//        SourceBuilder sb = new SourceBuilder.con1(offset);
+//        sb.append(indentOld);
+//        sb.append("for (var ");
+//        {
+//          sb.startPosition("NAME");
+//          sb.append("item");
+//          sb.endPosition();
+//        }
+//        sb.append(" in ");
+//        {
+//          sb.startPosition("ITERABLE");
+//          sb.append("iterable");
+//          sb.endPosition();
+//        }
+//        sb.append(") {");
+//        sb.append(eol);
+//        _insertBuilder(sb);
+//      }
+//      {
+//        Edit edit =
+//            utils.createIndentEdit(statementsRange, indentOld, indentNew);
+//        edits.add(edit);
+//      }
+//      _addInsertEdit(statementsRange.end, "${indentOld}}${eol}");
+//      _proposalEndRange = rangeEndLength(lastStatement, 0);
+//      // add proposal
+//      _addAssist(AssistKind.SURROUND_WITH_FOR_IN, []);
+//    }
+//    // "for"
+//    {
+//      {
+//        int offset = statementsRange.offset;
+//        SourceBuilder sb = new SourceBuilder.con1(offset);
+//        sb.append(indentOld);
+//        sb.append("for (var ");
+//        {
+//          sb.startPosition("VAR");
+//          sb.append("v");
+//          sb.endPosition();
+//        }
+//        sb.append(" = ");
+//        {
+//          sb.startPosition("INIT");
+//          sb.append("init");
+//          sb.endPosition();
+//        }
+//        sb.append("; ");
+//        {
+//          sb.startPosition("CONDITION");
+//          sb.append("condition");
+//          sb.endPosition();
+//        }
+//        sb.append("; ");
+//        {
+//          sb.startPosition("INCREMENT");
+//          sb.append("increment");
+//          sb.endPosition();
+//        }
+//        sb.append(") {");
+//        sb.append(eol);
+//        _insertBuilder(sb);
+//      }
+//      {
+//        Edit edit =
+//            utils.createIndentEdit(statementsRange, indentOld, indentNew);
+//        edits.add(edit);
+//      }
+//      _addInsertEdit(statementsRange.end, "${indentOld}}${eol}");
+//      _proposalEndRange = rangeEndLength(lastStatement, 0);
+//      // add proposal
+//      _addAssist(AssistKind.SURROUND_WITH_FOR, []);
+//    }
+//    // "do-while"
+//    {
+//      _addInsertEdit(statementsRange.offset, "${indentOld}do {${eol}");
+//      {
+//        Edit edit =
+//            utils.createIndentEdit(statementsRange, indentOld, indentNew);
+//        edits.add(edit);
+//      }
+//      {
+//        int offset = statementsRange.end;
+//        SourceBuilder sb = new SourceBuilder.con1(offset);
+//        sb.append(indentOld);
+//        sb.append("} while (");
+//        {
+//          sb.startPosition("CONDITION");
+//          sb.append("condition");
+//          sb.endPosition();
+//        }
+//        sb.append(");");
+//        sb.append(eol);
+//        _insertBuilder(sb);
+//      }
+//      _proposalEndRange = rangeEndLength(lastStatement, 0);
+//      // add proposal
+//      _addAssist(AssistKind.SURROUND_WITH_DO_WHILE, []);
+//    }
+//    // "try-catch"
+//    {
+//      _addInsertEdit(statementsRange.offset, "${indentOld}try {${eol}");
+//      {
+//        Edit edit =
+//            utils.createIndentEdit(statementsRange, indentOld, indentNew);
+//        edits.add(edit);
+//      }
+//      {
+//        int offset = statementsRange.end;
+//        SourceBuilder sb = new SourceBuilder.con1(offset);
+//        sb.append(indentOld);
+//        sb.append("} on ");
+//        {
+//          sb.startPosition("EXCEPTION_TYPE");
+//          sb.append("Exception");
+//          sb.endPosition();
+//        }
+//        sb.append(" catch (");
+//        {
+//          sb.startPosition("EXCEPTION_VAR");
+//          sb.append("e");
+//          sb.endPosition();
+//        }
+//        sb.append(") {");
+//        sb.append(eol);
+//        //
+//        sb.append(indentNew);
+//        {
+//          sb.startPosition("CATCH");
+//          sb.append("// TODO");
+//          sb.endPosition();
+//          sb.setEndPosition();
+//        }
+//        sb.append(eol);
+//        //
+//        sb.append(indentOld);
+//        sb.append("}");
+//        sb.append(eol);
+//        //
+//        _insertBuilder(sb);
+//      }
+//      // add proposal
+//      _addAssist(AssistKind.SURROUND_WITH_TRY_CATCH, []);
+//    }
+//    // "try-finally"
+//    {
+//      _addInsertEdit(statementsRange.offset, "${indentOld}try {${eol}");
+//      {
+//        Edit edit =
+//            utils.createIndentEdit(statementsRange, indentOld, indentNew);
+//        edits.add(edit);
+//      }
+//      {
+//        int offset = statementsRange.end;
+//        SourceBuilder sb = new SourceBuilder.con1(offset);
+//        //
+//        sb.append(indentOld);
+//        sb.append("} finally {");
+//        sb.append(eol);
+//        //
+//        sb.append(indentNew);
+//        {
+//          sb.startPosition("FINALLY");
+//          sb.append("// TODO");
+//          sb.endPosition();
+//        }
+//        sb.setEndPosition();
+//        sb.append(eol);
+//        //
+//        sb.append(indentOld);
+//        sb.append("}");
+//        sb.append(eol);
+//        //
+//        _insertBuilder(sb);
+//      }
+//      // add proposal
+//      _addAssist(
+//          AssistKind.SURROUND_WITH_TRY_FINALLY,
+//          []);
+//    }
+  }
+
+  /**
+   * Adds a new [Edit] to [edits].
+   */
+  void _addRemoveEdit(SourceRange range) {
+    _addReplaceEdit(range, '');
+  }
+
+  /**
+   * Adds a new [Edit] to [edits].
+   */
+  void _addReplaceEdit(SourceRange range, String text) {
+    Edit edit = new Edit(range.offset, range.length, text);
+    edits.add(edit);
+  }
+
+  /**
+   * Returns an existing or just added [LinkedPositionGroup] with [groupId].
+   */
+  LinkedPositionGroup _getLinkedPosition(String groupId) {
+    LinkedPositionGroup group = linkedPositionGroups[groupId];
+    if (group == null) {
+      group = new LinkedPositionGroup(groupId);
+      linkedPositionGroups[groupId] = group;
+    }
+    return group;
+  }
+
+  /**
+   * Returns the text of the given range in the unit.
+   */
+  String _getSource(AstNode node) {
+    // TODO(scheglov) rename
+    return utils.getText(node);
+  }
+
+  /**
+   * Returns the text of the given range in the unit.
+   */
+  String _getSource2(SourceRange range) {
+    // TODO(scheglov) rename
+    return utils.getText3(range);
+  }
+
+  /**
+   * Inserts the given [SourceBuilder] at its offset.
+   */
+  void _insertBuilder(SourceBuilder builder) {
+    String text = builder.toString();
+    _addInsertEdit(builder.offset, text);
+    // add linked positions
+    builder.linkedPositionGroups.forEach((LinkedPositionGroup group) {
+      LinkedPositionGroup fixGroup = _getLinkedPosition(group.id);
+      group.positions.forEach((Position position) {
+        fixGroup.addPosition(position);
+      });
+      group.proposals.forEach((String proposal) {
+        fixGroup.addProposal(proposal);
+      });
+    });
+  }
+
+  /**
+   * This method does nothing, but we invoke it in places where Dart VM
+   * coverage agent fails to provide coverage information - such as almost
+   * all "return" statements.
+   *
+   * https://code.google.com/p/dart/issues/detail?id=19912
+   */
+  static void _coverageMarker() {
+  }
+
+  /**
+   * Returns `true` if the selection covers an operator of the given
+   * [BinaryExpression].
+   */
+  static bool _isOperatorSelected(BinaryExpression binaryExpression, int offset,
+      int length) {
+    AstNode left = binaryExpression.leftOperand;
+    AstNode right = binaryExpression.rightOperand;
+    // between the nodes
+    if (offset >= left.endToken.end && offset + length <= right.offset) {
+      _coverageMarker();
+      return true;
+    }
+    // or exactly select the node (but not with infix expressions)
+    if (offset == left.offset && offset + length == right.endToken.end) {
+      if (left is BinaryExpression || right is BinaryExpression) {
+        _coverageMarker();
+        return false;
+      }
+      _coverageMarker();
+      return true;
+    }
+    // invalid selection (part of node, etc)
+    _coverageMarker();
+    return false;
+  }
+}
diff --git a/pkg/analysis_services/lib/src/correction/fix.dart b/pkg/analysis_services/lib/src/correction/fix.dart
index 22e331d..4b242ff 100644
--- a/pkg/analysis_services/lib/src/correction/fix.dart
+++ b/pkg/analysis_services/lib/src/correction/fix.dart
@@ -7,6 +7,8 @@
 
 library services.src.correction.fix;
 
+import 'dart:collection';
+
 import 'package:analysis_services/correction/change.dart';
 import 'package:analysis_services/correction/fix.dart';
 import 'package:analysis_services/search/hierarchy.dart';
@@ -19,12 +21,15 @@
 import 'package:analysis_services/src/correction/util.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:path/path.dart';
 
 
 /**
@@ -46,6 +51,8 @@
   final AnalysisError error;
   CompilationUnitElement unitElement;
   LibraryElement unitLibraryElement;
+  String unitLibraryFile;
+  String unitLibraryFolder;
 
   final List<Edit> edits = <Edit>[];
   final Map<String, LinkedPositionGroup> linkedPositionGroups = <String,
@@ -65,6 +72,8 @@
       {
     unitElement = unit.element;
     unitLibraryElement = unitElement.library;
+    unitLibraryFile = unitLibraryElement.source.fullName;
+    unitLibraryFolder = dirname(unitLibraryFile);
   }
 
   DartType get coreTypeBool => _getCoreType("bool");
@@ -731,208 +740,194 @@
   }
 
   void _addFix_importLibrary(FixKind kind, String importPath) {
-    // TODO(scheglov) implement
-//    CompilationUnitElement libraryUnitElement =
-//        _unitLibraryElement.definingCompilationUnit;
-//    CompilationUnit libraryUnit = libraryUnitElement.node;
-//    // prepare new import location
-//    int offset = 0;
-//    String prefix;
-//    String suffix;
-//    {
-//      // if no directives
-//      prefix = "";
-//      suffix = eol;
-//      CorrectionUtils libraryUtils = new CorrectionUtils(libraryUnit);
-//      // after last directive in library
-//      for (Directive directive in libraryUnit.directives) {
-//        if (directive is LibraryDirective || directive is ImportDirective) {
-//          offset = directive.end;
-//          prefix = eol;
-//          suffix = "";
-//        }
-//      }
-//      // if still beginning of file, skip shebang and line comments
-//      if (offset == 0) {
-//        CorrectionUtils_InsertDesc desc = libraryUtils.insertDescTop;
-//        offset = desc.offset;
-//        prefix = desc.prefix;
-//        suffix = "${desc.suffix}${eol}";
-//      }
-//    }
-//    // insert new import
-//    String importSource = "${prefix}import '${importPath}';${suffix}";
-//    _addInsertEdit(offset, importSource);
-//    // add proposal
-//    _addUnitCorrectionProposal2(libraryUnitElement.source, kind, [importPath]);
+    CompilationUnitElement libraryUnitElement =
+        unitLibraryElement.definingCompilationUnit;
+    CompilationUnit libraryUnit = libraryUnitElement.node;
+    // prepare new import location
+    int offset = 0;
+    String prefix;
+    String suffix;
+    {
+      // if no directives
+      prefix = "";
+      suffix = eol;
+      CorrectionUtils libraryUtils = new CorrectionUtils(libraryUnit);
+      // after last directive in library
+      for (Directive directive in libraryUnit.directives) {
+        if (directive is LibraryDirective || directive is ImportDirective) {
+          offset = directive.end;
+          prefix = eol;
+          suffix = "";
+        }
+      }
+      // if still beginning of file, skip shebang and line comments
+      if (offset == 0) {
+        CorrectionUtils_InsertDesc desc = libraryUtils.getInsertDescTop();
+        offset = desc.offset;
+        prefix = desc.prefix;
+        suffix = "${desc.suffix}${eol}";
+      }
+    }
+    // insert new import
+    String importSource = "${prefix}import '${importPath}';${suffix}";
+    _addInsertEdit(offset, importSource);
+    // add proposal
+    _addFix(kind, [importPath], fixFile: libraryUnitElement.source.fullName);
   }
 
   void _addFix_importLibrary_withElement(String name, ElementKind kind) {
-    // TODO(scheglov) implement
-//    // ignore if private
-//    if (name.startsWith("_")) {
-//      return;
-//    }
-//    // may be there is an existing import, but it is with prefix and we don't use this prefix
-//    for (ImportElement imp in _unitLibraryElement.imports) {
-//      // prepare element
-//      LibraryElement libraryElement = imp.importedLibrary;
-//      Element element =
-//          CorrectionUtils.getExportedElement(libraryElement, name);
-//      if (element == null) {
-//        continue;
-//      }
-//      if (element is PropertyAccessorElement) {
-//        element = (element as PropertyAccessorElement).variable;
-//      }
-//      if (element.kind != kind) {
-//        continue;
-//      }
-//      // may be apply prefix
-//      PrefixElement prefix = imp.prefix;
-//      if (prefix != null) {
-//        SourceRange range = SourceRangeFactory.rangeStartLength(node, 0);
-//        _addReplaceEdit(range, "${prefix.displayName}.");
-//        _addFix(
-//            FixKind.IMPORT_LIBRARY_PREFIX,
-//            [libraryElement.displayName, prefix.displayName]);
-//        continue;
-//      }
-//      // may be update "show" directive
-//      List<NamespaceCombinator> combinators = imp.combinators;
-//      if (combinators.length == 1 && combinators[0] is ShowElementCombinator) {
-//        ShowElementCombinator showCombinator =
-//            combinators[0] as ShowElementCombinator;
-//        // prepare new set of names to show
-//        Set<String> showNames = new Set<String>();
-//        showNames.addAll(showCombinator.shownNames);
-//        showNames.add(name);
-//        // prepare library name - unit name or 'dart:name' for SDK library
-//        String libraryName = libraryElement.definingCompilationUnit.displayName;
-//        if (libraryElement.isInSdk) {
-//          libraryName = imp.uri;
-//        }
-//        // update library
-//        String newShowCode = "show ${StringUtils.join(showNames, ", ")}";
-//        // TODO(scheglov)
-//        _addReplaceEdit(
-//            SourceRangeFactory.rangeShowCombinator(showCombinator),
-//            newShowCode);
-//        _addUnitCorrectionProposal2(
-//            _unitLibraryElement.source,
-//            FixKind.IMPORT_LIBRARY_SHOW,
-//            [libraryName]);
-//        // we support only one import without prefix
-//        return;
-//      }
-//    }
-//    // check SDK libraries
-//    AnalysisContext context = _unitLibraryElement.context;
-//    {
-//      DartSdk sdk = context.sourceFactory.dartSdk;
-//      List<SdkLibrary> sdkLibraries = sdk.sdkLibraries;
-//      for (SdkLibrary sdkLibrary in sdkLibraries) {
-//        SourceFactory sdkSourceFactory = context.sourceFactory;
-//        String libraryUri = sdkLibrary.shortName;
-//        Source librarySource = sdkSourceFactory.resolveUri(null, libraryUri);
-//        // prepare LibraryElement
-//        LibraryElement libraryElement =
-//            context.getLibraryElement(librarySource);
-//        if (libraryElement == null) {
-//          continue;
-//        }
-//        // prepare exported Element
-//        Element element =
-//            CorrectionUtils.getExportedElement(libraryElement, name);
-//        if (element == null) {
-//          continue;
-//        }
-//        if (element is PropertyAccessorElement) {
-//          element = (element as PropertyAccessorElement).variable;
-//        }
-//        if (element.kind != kind) {
-//          continue;
-//        }
-//        // add import
-//        _addFix_importLibrary(FixKind.IMPORT_LIBRARY_SDK, libraryUri);
-//      }
-//    }
-//    // check project libraries
-//    {
-//      List<Source> librarySources = context.librarySources;
-//      for (Source librarySource in librarySources) {
-//        // we don't need SDK libraries here
-//        if (librarySource.isInSystemLibrary) {
-//          continue;
-//        }
-//        // prepare LibraryElement
-//        LibraryElement libraryElement =
-//            context.getLibraryElement(librarySource);
-//        if (libraryElement == null) {
-//          continue;
-//        }
-//        // prepare exported Element
-//        Element element =
-//            CorrectionUtils.getExportedElement(libraryElement, name);
-//        if (element == null) {
-//          continue;
-//        }
-//        if (element.kind != kind) {
-//          continue;
-//        }
-//        // prepare "library" file
-//        JavaFile libraryFile = getSourceFile(librarySource);
-//        if (libraryFile == null) {
-//          continue;
-//        }
-//        // may be "package:" URI
-//        {
-//          Uri libraryPackageUri = _findPackageUri(context, libraryFile);
-//          if (libraryPackageUri != null) {
-//            _addFix_importLibrary(
-//                FixKind.IMPORT_LIBRARY_PROJECT,
-//                libraryPackageUri.toString());
-//            continue;
-//          }
-//        }
-//        // relative URI
-//        String relative =
-//            URIUtils.computeRelativePath(
-//                _unitLibraryFolder.getAbsolutePath(),
-//                libraryFile.getAbsolutePath());
-//        _addFix_importLibrary(
-//            FixKind.IMPORT_LIBRARY_PROJECT,
-//            relative);
-//      }
-//    }
+    // ignore if private
+    if (name.startsWith("_")) {
+      return;
+    }
+
+    // may be there is an existing import,
+    // but it is with prefix and we don't use this prefix
+    for (ImportElement imp in unitLibraryElement.imports) {
+      // prepare element
+      LibraryElement libraryElement = imp.importedLibrary;
+      Element element = getExportedElement(libraryElement, name);
+      if (element == null) {
+        continue;
+      }
+      if (element is PropertyAccessorElement) {
+        element = (element as PropertyAccessorElement).variable;
+      }
+      if (element.kind != kind) {
+        continue;
+      }
+      // may be apply prefix
+      PrefixElement prefix = imp.prefix;
+      if (prefix != null) {
+        SourceRange range = rf.rangeStartLength(node, 0);
+        _addReplaceEdit(range, "${prefix.displayName}.");
+        _addFix(
+            FixKind.IMPORT_LIBRARY_PREFIX,
+            [libraryElement.displayName, prefix.displayName]);
+        continue;
+      }
+      // may be update "show" directive
+      List<NamespaceCombinator> combinators = imp.combinators;
+      if (combinators.length == 1 && combinators[0] is ShowElementCombinator) {
+        ShowElementCombinator showCombinator =
+            combinators[0] as ShowElementCombinator;
+        // prepare new set of names to show
+        Set<String> showNames = new SplayTreeSet<String>();
+        showNames.addAll(showCombinator.shownNames);
+        showNames.add(name);
+        // prepare library name - unit name or 'dart:name' for SDK library
+        String libraryName = libraryElement.definingCompilationUnit.displayName;
+        if (libraryElement.isInSdk) {
+          libraryName = imp.uri;
+        }
+        // update library
+        String newShowCode = "show ${StringUtils.join(showNames, ", ")}";
+        _addReplaceEdit(rf.rangeOffsetEnd(showCombinator), newShowCode);
+        _addFix(
+            FixKind.IMPORT_LIBRARY_SHOW,
+            [libraryName],
+            fixFile: unitLibraryFile);
+        // we support only one import without prefix
+        return;
+      }
+    }
+    // check SDK libraries
+    AnalysisContext context = unitLibraryElement.context;
+    {
+      DartSdk sdk = context.sourceFactory.dartSdk;
+      List<SdkLibrary> sdkLibraries = sdk.sdkLibraries;
+      for (SdkLibrary sdkLibrary in sdkLibraries) {
+        SourceFactory sdkSourceFactory = context.sourceFactory;
+        String libraryUri = sdkLibrary.shortName;
+        Source librarySource = sdkSourceFactory.resolveUri(null, libraryUri);
+        // prepare LibraryElement
+        LibraryElement libraryElement =
+            context.getLibraryElement(librarySource);
+        if (libraryElement == null) {
+          continue;
+        }
+        // prepare exported Element
+        Element element = getExportedElement(libraryElement, name);
+        if (element == null) {
+          continue;
+        }
+        if (element is PropertyAccessorElement) {
+          element = (element as PropertyAccessorElement).variable;
+        }
+        if (element.kind != kind) {
+          continue;
+        }
+        // add import
+        _addFix_importLibrary(FixKind.IMPORT_LIBRARY_SDK, libraryUri);
+      }
+    }
+    // check project libraries
+    {
+      List<Source> librarySources = context.librarySources;
+      for (Source librarySource in librarySources) {
+        // we don't need SDK libraries here
+        if (librarySource.isInSystemLibrary) {
+          continue;
+        }
+        // prepare LibraryElement
+        LibraryElement libraryElement =
+            context.getLibraryElement(librarySource);
+        if (libraryElement == null) {
+          continue;
+        }
+        // prepare exported Element
+        Element element = getExportedElement(libraryElement, name);
+        if (element == null) {
+          continue;
+        }
+        if (element is PropertyAccessorElement) {
+          element = (element as PropertyAccessorElement).variable;
+        }
+        if (element.kind != kind) {
+          continue;
+        }
+        // prepare "library" file
+        String libraryFile = librarySource.fullName;
+        // may be "package:" URI
+        {
+          String libraryPackageUri = _findPackageUri(context, libraryFile);
+          if (libraryPackageUri != null) {
+            _addFix_importLibrary(
+                FixKind.IMPORT_LIBRARY_PROJECT,
+                libraryPackageUri);
+            continue;
+          }
+        }
+        // relative URI
+        String relativeFile = relative(libraryFile, from: unitLibraryFolder);
+        relativeFile = split(relativeFile).join('/');
+        _addFix_importLibrary(FixKind.IMPORT_LIBRARY_PROJECT, relativeFile);
+      }
+    }
   }
 
   void _addFix_importLibrary_withFunction() {
-    // TODO(scheglov) implement
-//    if (node is SimpleIdentifier && node.parent is MethodInvocation) {
-//      MethodInvocation invocation = node.parent as MethodInvocation;
-//      if (invocation.realTarget == null &&
-//          identical(invocation.methodName, node)) {
-//        String name = (node as SimpleIdentifier).name;
-//        _addFix_importLibrary_withElement(name, ElementKind.FUNCTION);
-//      }
-//    }
+    if (node is SimpleIdentifier && node.parent is MethodInvocation) {
+      MethodInvocation invocation = node.parent as MethodInvocation;
+      if (invocation.realTarget == null && invocation.methodName == node) {
+        String name = (node as SimpleIdentifier).name;
+        _addFix_importLibrary_withElement(name, ElementKind.FUNCTION);
+      }
+    }
   }
 
   void _addFix_importLibrary_withTopLevelVariable() {
-    // TODO(scheglov) implement
-//    if (node is SimpleIdentifier) {
-//      String name = (node as SimpleIdentifier).name;
-//      _addFix_importLibrary_withElement(name, ElementKind.TOP_LEVEL_VARIABLE);
-//    }
+    if (node is SimpleIdentifier) {
+      String name = (node as SimpleIdentifier).name;
+      _addFix_importLibrary_withElement(name, ElementKind.TOP_LEVEL_VARIABLE);
+    }
   }
 
   void _addFix_importLibrary_withType() {
-    // TODO(scheglov) implement
-//    if (_mayBeTypeIdentifier(node)) {
-//      String typeName = (node as SimpleIdentifier).name;
-//      _addFix_importLibrary_withElement(typeName, ElementKind.CLASS);
-//    }
+    if (_mayBeTypeIdentifier(node)) {
+      String typeName = (node as SimpleIdentifier).name;
+      _addFix_importLibrary_withElement(typeName, ElementKind.CLASS);
+    }
   }
 
   void _addFix_insertSemicolon() {
@@ -1776,6 +1771,24 @@
     return null;
   }
 
+  /**
+   * Inserts the given [SourceBuilder] at its offset.
+   */
+  void _insertBuilder(SourceBuilder builder) {
+    String text = builder.toString();
+    _addInsertEdit(builder.offset, text);
+    // add linked positions
+    builder.linkedPositionGroups.forEach((LinkedPositionGroup group) {
+      LinkedPositionGroup fixGroup = _getLinkedPosition(group.id);
+      group.positions.forEach((Position position) {
+        fixGroup.addPosition(position);
+      });
+      group.proposals.forEach((String proposal) {
+        fixGroup.addProposal(proposal);
+      });
+    });
+  }
+
 //  void _addLinkedPositionProposal(String group,
 //      LinkedPositionProposal proposal) {
 //    List<LinkedPositionProposal> nodeProposals = linkedPositionProposals[group];
@@ -1801,24 +1814,6 @@
 //    return false;
 //  }
 
-  /**
-   * Inserts the given [SourceBuilder] at its offset.
-   */
-  void _insertBuilder(SourceBuilder builder) {
-    String text = builder.toString();
-    _addInsertEdit(builder.offset, text);
-    // add linked positions
-    builder.linkedPositionGroups.forEach((LinkedPositionGroup group) {
-      LinkedPositionGroup fixGroup = _getLinkedPosition(group.id);
-      group.positions.forEach((Position position) {
-        fixGroup.addPosition(position);
-      });
-      group.proposals.forEach((String proposal) {
-        fixGroup.addProposal(proposal);
-      });
-    });
-  }
-
   _ConstructorLocation
       _prepareNewConstructorLocation(ClassDeclaration classDeclaration) {
     List<ClassMember> members = classDeclaration.members;
@@ -1888,6 +1883,24 @@
   }
 
   /**
+   * Attempts to convert the given absolute path into a "package" URI.
+   *
+   * [context] - the [AnalysisContext] to work in.
+   * [path] - the absolute path, not `null`.
+   *
+   * Returns the "package" URI, may be `null`.
+   */
+  static String _findPackageUri(AnalysisContext context, String path) {
+//    Source fileSource = new FileBasedSource.con1(path);
+    Source fileSource = new NonExistingSource(path, UriKind.FILE_URI);
+    Uri uri = context.sourceFactory.restoreUri(fileSource);
+    if (uri == null) {
+      return null;
+    }
+    return uri.toString();
+  }
+
+  /**
    * @return the suggestions for given [Type] and [DartExpression], not empty.
    */
   static List<String> _getArgumentNameSuggestions(Set<String> excluded,
diff --git a/pkg/analysis_services/lib/src/correction/source_range.dart b/pkg/analysis_services/lib/src/correction/source_range.dart
index 433d5e6..f0bc18c 100644
--- a/pkg/analysis_services/lib/src/correction/source_range.dart
+++ b/pkg/analysis_services/lib/src/correction/source_range.dart
@@ -24,9 +24,14 @@
   return new SourceRange(offset, length);
 }
 
+SourceRange rangeEndLength(a, int length) {
+  int offset = a is int ? a : a.end;
+  return new SourceRange(offset, length);
+}
+
 SourceRange rangeEndStart(a, b) {
   int offset = a.end;
-  var length = b.offset - offset;
+  var length = (b is int ? b : b.offset) - offset;
   return new SourceRange(offset, length);
 }
 
@@ -47,6 +52,12 @@
   return rangeStartEnd(first, last);
 }
 
+SourceRange rangeOffsetEnd(o) {
+  int offset = o.offset;
+  int length = o.end - offset;
+  return new SourceRange(offset, length);
+}
+
 SourceRange rangeStartEnd(a, b) {
   int offset = a is int ? a : a.offset;
   int end = b is int ? b : b.end;
diff --git a/pkg/analysis_services/lib/src/correction/util.dart b/pkg/analysis_services/lib/src/correction/util.dart
index b8ccbba..51b3b52 100644
--- a/pkg/analysis_services/lib/src/correction/util.dart
+++ b/pkg/analysis_services/lib/src/correction/util.dart
@@ -58,6 +58,36 @@
 
 
 /**
+ * Returns a namespace of the given [ExportElement].
+ */
+Map<String, Element> getExportNamespaceForDirective(ExportElement exp) {
+  Namespace namespace =
+      new NamespaceBuilder().createExportNamespaceForDirective(exp);
+  return namespace.definedNames;
+}
+
+
+/**
+ * Returns a export namespace of the given [LibraryElement].
+ */
+Map<String, Element> getExportNamespaceForLibrary(LibraryElement library) {
+  Namespace namespace =
+      new NamespaceBuilder().createExportNamespaceForLibrary(library);
+  return namespace.definedNames;
+}
+
+
+/**
+ * Returns an [Element] exported from the given [LibraryElement].
+ */
+Element getExportedElement(LibraryElement library, String name) {
+  if (library == null) {
+    return null;
+  }
+  return getExportNamespaceForLibrary(library)[name];
+}
+
+/**
  * Returns [getExpressionPrecedence] for the parent of [node],
  * or `0` if the parent node is [ParenthesizedExpression].
  *
@@ -82,7 +112,6 @@
   return -1000;
 }
 
-
 /**
  * Returns the namespace of the given [ImportElement].
  */
@@ -113,7 +142,6 @@
   return null;
 }
 
-
 /**
  * Returns the [String] content of the given [Source].
  */
@@ -169,6 +197,122 @@
   String getIndent(int level) => repeat('  ', level);
 
   /**
+   * Returns a [InsertDesc] describing where to insert a new library-related
+   * directive.
+   */
+  CorrectionUtils_InsertDesc getInsertDescImport() {
+    // analyze directives
+    Directive prevDirective = null;
+    for (Directive directive in unit.directives) {
+      if (directive is LibraryDirective ||
+          directive is ImportDirective ||
+          directive is ExportDirective) {
+        prevDirective = directive;
+      }
+    }
+    // insert after last library-related directive
+    if (prevDirective != null) {
+      CorrectionUtils_InsertDesc result = new CorrectionUtils_InsertDesc();
+      result.offset = prevDirective.end;
+      String eol = endOfLine;
+      if (prevDirective is LibraryDirective) {
+        result.prefix = "${eol}${eol}";
+      } else {
+        result.prefix = eol;
+      }
+      return result;
+    }
+    // no directives, use "top" location
+    return getInsertDescTop();
+  }
+
+  /**
+   * Returns a [InsertDesc] describing where to insert a new 'part' directive.
+   */
+  CorrectionUtils_InsertDesc getInsertDescPart() {
+    // analyze directives
+    Directive prevDirective = null;
+    for (Directive directive in unit.directives) {
+      prevDirective = directive;
+    }
+    // insert after last directive
+    if (prevDirective != null) {
+      CorrectionUtils_InsertDesc result = new CorrectionUtils_InsertDesc();
+      result.offset = prevDirective.end;
+      String eol = endOfLine;
+      if (prevDirective is PartDirective) {
+        result.prefix = eol;
+      } else {
+        result.prefix = "${eol}${eol}";
+      }
+      return result;
+    }
+    // no directives, use "top" location
+    return getInsertDescTop();
+  }
+
+  /**
+   * Returns a [InsertDesc] describing where to insert a new directive or a
+   * top-level declaration at the top of the file.
+   */
+  CorrectionUtils_InsertDesc getInsertDescTop() {
+    // skip leading line comments
+    int offset = 0;
+    bool insertEmptyLineBefore = false;
+    bool insertEmptyLineAfter = false;
+    String source = _buffer;
+    // skip hash-bang
+    if (offset < source.length - 2) {
+      String linePrefix = getText2(offset, 2);
+      if (linePrefix == "#!") {
+        insertEmptyLineBefore = true;
+        offset = getLineNext(offset);
+        // skip empty lines to first line comment
+        int emptyOffset = offset;
+        while (emptyOffset < source.length - 2) {
+          int nextLineOffset = getLineNext(emptyOffset);
+          String line = source.substring(emptyOffset, nextLineOffset);
+          if (line.trim().isEmpty) {
+            emptyOffset = nextLineOffset;
+            continue;
+          } else if (line.startsWith("//")) {
+            offset = emptyOffset;
+            break;
+          } else {
+            break;
+          }
+        }
+      }
+    }
+    // skip line comments
+    while (offset < source.length - 2) {
+      String linePrefix = getText2(offset, 2);
+      if (linePrefix == "//") {
+        insertEmptyLineBefore = true;
+        offset = getLineNext(offset);
+      } else {
+        break;
+      }
+    }
+    // determine if empty line is required after
+    int nextLineOffset = getLineNext(offset);
+    String insertLine = source.substring(offset, nextLineOffset);
+    if (!insertLine.trim().isEmpty) {
+      insertEmptyLineAfter = true;
+    }
+    // fill InsertDesc
+    CorrectionUtils_InsertDesc desc = new CorrectionUtils_InsertDesc();
+    desc.offset = offset;
+    if (insertEmptyLineBefore) {
+      desc.prefix = endOfLine;
+    }
+    if (insertEmptyLineAfter) {
+      desc.suffix = endOfLine;
+    }
+    return desc;
+  }
+
+  /**
    * Skips whitespace characters and single EOL on the right from [index].
    *
    * If [index] the end of a statement or method, then in the most cases it is
@@ -214,6 +358,32 @@
   }
 
   /**
+   * Returns a start index of the next line after the line which contains the
+   * given index.
+   */
+  int getLineNext(int index) {
+    int length = _buffer.length;
+    // skip to the end of the line
+    while (index < length) {
+      int c = _buffer.codeUnitAt(index);
+      if (c == 0xD || c == 0xA) {
+        break;
+      }
+      index++;
+    }
+    // skip single \r
+    if (index < length && _buffer.codeUnitAt(index) == 0xD) {
+      index++;
+    }
+    // skip single \n
+    if (index < length && _buffer.codeUnitAt(index) == 0xA) {
+      index++;
+    }
+    // done
+    return index;
+  }
+
+  /**
    * Returns the whitespace prefix of the line which contains given offset.
    */
   String getLinePrefix(int index) {
@@ -326,19 +496,36 @@
   /**
    * Returns the text of the given [AstNode] in the unit.
    */
-  String getText(AstNode node) => getText2(node.offset, node.length);
+  String getText(AstNode node) {
+    // TODO(scheglov) rename
+    return getText2(node.offset, node.length);
+  }
 
   /**
    * Returns the text of the given range in the unit.
    */
-  String getText2(int offset, int length) =>
-      _buffer.substring(offset, offset + length);
+  String getText2(int offset, int length) {
+    // TODO(scheglov) rename
+    return _buffer.substring(offset, offset + length);
+  }
+
+  /**
+   * Returns the text of the given range in the unit.
+   */
+  String getText3(SourceRange range) {
+    // TODO(scheglov) rename
+    return getText2(range.offset, range.length);
+  }
 
   /**
    * Returns the source to reference [type] in this [CompilationUnit].
    */
   String getTypeSource(DartType type) {
     StringBuffer sb = new StringBuffer();
+    // just some Function, maybe find Function Type Alias later
+    if (type is FunctionType) {
+      return "Function";
+    }
     // prepare element
     Element element = type.element;
     if (element == null) {
@@ -401,3 +588,13 @@
     return null;
   }
 }
+
+
+/**
+ * Describes where to insert new directive or top-level declaration.
+ */
+class CorrectionUtils_InsertDesc {
+  int offset = 0;
+  String prefix = "";
+  String suffix = "";
+}
diff --git a/pkg/analysis_services/lib/src/index/store/separate_file_manager.dart b/pkg/analysis_services/lib/src/index/store/separate_file_manager.dart
deleted file mode 100644
index 5a51cfa..0000000
--- a/pkg/analysis_services/lib/src/index/store/separate_file_manager.dart
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library services.src.index.store.separate_file_mananer;
-
-import 'dart:async';
-import 'dart:io';
-
-import 'package:analysis_services/src/index/store/split_store.dart';
-import 'package:path/path.dart' as pathos;
-
-
-/**
- * An implementation of [FileManager] that keeps each file in a separate file
- * system file.
- */
-class SeparateFileManager implements FileManager {
-  final Directory _directory;
-
-  SeparateFileManager(this._directory) {
-    clear();
-  }
-
-  @override
-  void clear() {
-    List<FileSystemEntity> entries = _directory.listSync();
-    for (FileSystemEntity entry in entries) {
-      entry.deleteSync(recursive: true);
-    }
-  }
-
-  @override
-  void delete(String name) {
-    File file = _getFile(name);
-    try {
-      file.deleteSync();
-    } catch (e) {
-    }
-  }
-
-  @override
-  Future<List<int>> read(String name) {
-    File file = _getFile(name);
-    return file.readAsBytes().catchError((e) {
-      return null;
-    });
-  }
-
-  @override
-  Future write(String name, List<int> bytes) {
-    return _getFile(name).writeAsBytes(bytes);
-  }
-
-  File _getFile(String name) {
-    String path = pathos.join(_directory.path, name);
-    return new File(path);
-  }
-}
diff --git a/pkg/analysis_services/lib/src/index/store/temporary_folder_file_manager.dart b/pkg/analysis_services/lib/src/index/store/temporary_folder_file_manager.dart
new file mode 100644
index 0000000..331da60
--- /dev/null
+++ b/pkg/analysis_services/lib/src/index/store/temporary_folder_file_manager.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.src.index.store.temporary_folder_file_mananer;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:analysis_services/src/index/store/split_store.dart';
+import 'package:path/path.dart' as pathos;
+
+
+/**
+ * An implementation of [FileManager] that keeps each file in a separate file
+ * in a temporary folder.
+ */
+class TemporaryFolderFileManager implements FileManager {
+  Directory _directory;
+
+  Directory get test_directory => _directory;
+
+  @override
+  void clear() {
+    if (_directory != null) {
+      try {
+        _directory.deleteSync(recursive: true);
+      } on FileSystemException {
+        // For some reason, on Windows this sometimes results in the error:
+        // "FileSystemException: Deletion failed, path = '...' (OS Error: The
+        // process cannot access the file because it is being used by another
+        // process., errno = 32).  (Speculation: perhaps createTempSync is not
+        // successfully creating a unique name, so multiple processes are
+        // trying to access the same file?)
+        //
+        // For now, work around the problem by ignoring the exception.
+        // TODO(paulberry): fix the actual root cause of this bug.
+      }
+      _directory = null;
+    }
+  }
+
+  @override
+  void delete(String name) {
+    if (_directory == null) {
+      return;
+    }
+    File file = _getFile(name);
+    try {
+      file.deleteSync();
+    } catch (e) {
+    }
+  }
+
+  @override
+  Future<List<int>> read(String name) {
+    if (_directory == null) {
+      return new Future.value(null);
+    }
+    File file = _getFile(name);
+    return file.readAsBytes().catchError((e) {
+      return null;
+    });
+  }
+
+  @override
+  Future write(String name, List<int> bytes) {
+    _ensureDirectory();
+    return _getFile(name).writeAsBytes(bytes);
+  }
+
+  void _ensureDirectory() {
+    if (_directory == null) {
+      Directory temp = Directory.systemTemp;
+      _directory = temp.createTempSync('AnalysisServices_Index');
+    }
+  }
+
+  File _getFile(String name) {
+    String path = pathos.join(_directory.path, name);
+    return new File(path);
+  }
+}
diff --git a/pkg/analysis_services/test/completion/completion_computer_test.dart b/pkg/analysis_services/test/completion/completion_computer_test.dart
new file mode 100644
index 0000000..d9b22d6
--- /dev/null
+++ b/pkg/analysis_services/test/completion/completion_computer_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.completion.suggestion;
+
+import 'package:analysis_services/completion/completion_computer.dart';
+import 'package:analysis_services/src/completion/top_level_computer.dart';
+import 'package:analysis_testing/abstract_single_unit.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(CompletionComputerTest);
+}
+
+@ReflectiveTestCase()
+class CompletionComputerTest extends AbstractSingleUnitTest {
+
+  test_topLevel() {
+    CompletionComputer.create(null).then((computers) {
+      assertContainsType(computers, TopLevelComputer);
+      expect(computers, hasLength(1));
+    });
+  }
+
+  /// Assert that the list contains exactly one of the given type
+  void assertContainsType(List computers, Type type) {
+    int count = 0;
+    computers.forEach((c) {
+      if (c.runtimeType == type) {
+        ++count;
+      }
+    });
+    if (count != 1) {
+      var msg = new StringBuffer();
+      msg.writeln('Expected $type, but found:');
+      computers.forEach((c) {
+        msg.writeln('  ${c.runtimeType}');
+      });
+      fail(msg.toString());
+    }
+  }
+}
diff --git a/pkg/analysis_services/test/completion/completion_test_util.dart b/pkg/analysis_services/test/completion/completion_test_util.dart
new file mode 100644
index 0000000..c069050
--- /dev/null
+++ b/pkg/analysis_services/test/completion/completion_test_util.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.completion.util;
+
+import 'dart:async';
+
+import 'package:analysis_services/completion/completion_computer.dart';
+import 'package:analysis_services/completion/completion_suggestion.dart';
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/index/local_memory_index.dart';
+import 'package:analysis_services/src/search/search_engine.dart';
+import 'package:analysis_testing/abstract_single_unit.dart';
+import 'package:unittest/unittest.dart';
+
+class AbstractCompletionTest extends AbstractSingleUnitTest {
+  Index index;
+  SearchEngineImpl searchEngine;
+  CompletionComputer computer;
+  List<CompletionSuggestion> suggestions;
+
+  void addTestUnit(String code) {
+    resolveTestUnit(code);
+    index.indexUnit(context, testUnit);
+  }
+
+  void assertHasResult(CompletionSuggestionKind kind, String completion,
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT,
+      bool isDeprecated = false, bool isPotential = false]) {
+    var cs = suggestions.firstWhere((cs) => cs.completion == completion, orElse: () {
+      var completions = suggestions.map((s) => s.completion).toList();
+      fail('expected "$completion" but found\n $completions');
+    });
+    expect(cs.kind, equals(kind));
+    expect(cs.relevance, equals(relevance));
+    expect(cs.selectionOffset, equals(completion.length));
+    expect(cs.selectionLength, equals(0));
+    expect(cs.isDeprecated, equals(isDeprecated));
+    expect(cs.isPotential, equals(isPotential));
+  }
+
+  void assertNoResult(String completion) {
+    if (suggestions.any((cs) => cs.completion == completion)) {
+      fail('did not expect completion: $completion');
+    }
+  }
+
+  Future compute() {
+    return computer.compute().then((List<CompletionSuggestion> results) {
+      this.suggestions = results;
+    });
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    index = createLocalMemoryIndex();
+    searchEngine = new SearchEngineImpl(index);
+    verifyNoTestUnitErrors = false;
+  }
+}
\ No newline at end of file
diff --git a/pkg/analysis_services/test/completion/test_all.dart b/pkg/analysis_services/test/completion/test_all.dart
new file mode 100644
index 0000000..32a0428
--- /dev/null
+++ b/pkg/analysis_services/test/completion/test_all.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.completion;
+
+import 'package:unittest/unittest.dart';
+
+import 'completion_computer_test.dart' as completion_test;
+import 'top_level_computer_test.dart' as topLevel_test;
+
+/// Utility for manually running all tests.
+main() {
+  groupSep = ' | ';
+  group('completion', () {
+    completion_test.main();
+    topLevel_test.main();
+  });
+}
\ No newline at end of file
diff --git a/pkg/analysis_services/test/completion/top_level_computer_test.dart b/pkg/analysis_services/test/completion/top_level_computer_test.dart
new file mode 100644
index 0000000..b12e07e
--- /dev/null
+++ b/pkg/analysis_services/test/completion/top_level_computer_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.completion.toplevel;
+
+import 'package:analysis_services/completion/completion_suggestion.dart';
+import 'package:analysis_services/src/completion/top_level_computer.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import 'completion_test_util.dart';
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(TopLevelComputerTest);
+}
+
+@ReflectiveTestCase()
+class TopLevelComputerTest extends AbstractCompletionTest {
+
+  test_class() {
+    addTestUnit('class B {boolean v;}');
+    return compute().then((_) {
+      assertHasResult(CompletionSuggestionKind.CLASS, 'B');
+      assertNoResult('v');
+    });
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    computer = new TopLevelComputer(searchEngine);
+  }
+}
\ No newline at end of file
diff --git a/pkg/analysis_services/test/correction/assist_test.dart b/pkg/analysis_services/test/correction/assist_test.dart
new file mode 100644
index 0000000..9456225
--- /dev/null
+++ b/pkg/analysis_services/test/correction/assist_test.dart
@@ -0,0 +1,1272 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library test.services.correction.assist;
+
+import 'package:analysis_services/correction/assist.dart';
+import 'package:analysis_services/correction/change.dart';
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/index/local_memory_index.dart';
+import 'package:analysis_services/src/search/search_engine.dart';
+import 'package:analysis_testing/abstract_single_unit.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(AssistProcessorTest);
+}
+
+
+@ReflectiveTestCase()
+class AssistProcessorTest extends AbstractSingleUnitTest {
+  Index index;
+  SearchEngineImpl searchEngine;
+
+  int offset;
+  int length;
+
+  Assist assist;
+  Change change;
+  String resultCode;
+  LinkedPositionGroup linkedPositionGroup;
+
+  /**
+   * Asserts that there is an [Assist] of the given [kind] at [offset] which
+   * produces the [expected] code when applied to [testCode].
+   */
+  void assertHasAssist(AssistKind kind, String expected) {
+    assist = _assertHasAssist(kind);
+    change = assist.change;
+    // apply to "file"
+    List<FileEdit> fileEdits = change.edits;
+    expect(fileEdits, hasLength(1));
+    resultCode = _applyEdits(testCode, change.edits[0].edits);
+    // verify
+    expect(resultCode, expected);
+  }
+
+  /**
+   * Calls [assertHasAssist] at the offset of [offsetSearch] in [testCode].
+   */
+  void assertHasAssistAt(String offsetSearch, AssistKind kind,
+      String expected) {
+    offset = findOffset(offsetSearch);
+    assertHasAssist(kind, expected);
+  }
+
+  void assertHasPositionGroup(String id, List<Position> expectedPositions) {
+    List<LinkedPositionGroup> linkedPositionGroups =
+        change.linkedPositionGroups;
+    for (LinkedPositionGroup group in linkedPositionGroups) {
+      if (group.id == id) {
+        expect(group.positions, unorderedEquals(expectedPositions));
+        linkedPositionGroup = group;
+        return;
+      }
+    }
+    fail('No PositionGroup with id=$id found in $linkedPositionGroups');
+  }
+
+  /**
+   * Asserts that there is no [Assist] of the given [kind] at [offset].
+   */
+  void assertNoAssist(AssistKind kind) {
+    List<Assist> assists =
+        computeAssists(searchEngine, testUnit, offset, length);
+    for (Assist assist in assists) {
+      if (assist.kind == kind) {
+        throw fail('Unexpected assist $kind in\n${assists.join('\n')}');
+      }
+    }
+  }
+
+  /**
+   * Calls [assertNoAssist] at the offset of [offsetSearch] in [testCode].
+   */
+  void assertNoAssistAt(String offsetSearch, AssistKind kind) {
+    offset = findOffset(offsetSearch);
+    assertNoAssist(kind);
+  }
+
+  Position expectedPosition(String search) {
+    int offset = resultCode.indexOf(search);
+    int length = getLeadingIdentifierLength(search);
+    return new Position(testFile, offset, length);
+  }
+
+  List<Position> expectedPositions(List<String> patterns) {
+    List<Position> positions = <Position>[];
+    patterns.forEach((String search) {
+      positions.add(expectedPosition(search));
+    });
+    return positions;
+  }
+
+  void setUp() {
+    super.setUp();
+    index = createLocalMemoryIndex();
+    searchEngine = new SearchEngineImpl(index);
+    offset = 0;
+    length = 0;
+  }
+
+  void test_addTypeAnnotation_classField_OK_final() {
+    _indexTestUnit('''
+class A {
+  final f = 0;
+}
+''');
+    assertHasAssistAt('final ', AssistKind.ADD_TYPE_ANNOTATION, '''
+class A {
+  final int f = 0;
+}
+''');
+  }
+
+  void test_addTypeAnnotation_classField_OK_int() {
+    _indexTestUnit('''
+class A {
+  var f = 0;
+}
+''');
+    assertHasAssistAt('var ', AssistKind.ADD_TYPE_ANNOTATION, '''
+class A {
+  int f = 0;
+}
+''');
+  }
+
+  void test_addTypeAnnotation_local_OK_Function() {
+    _indexTestUnit('''
+main() {
+  var v = () => 1;
+}
+''');
+    assertHasAssistAt('v =', AssistKind.ADD_TYPE_ANNOTATION, '''
+main() {
+  Function v = () => 1;
+}
+''');
+  }
+
+  void test_addTypeAnnotation_local_OK_List() {
+    _indexTestUnit('''
+main() {
+  var v = <String>[];
+}
+''');
+    assertHasAssistAt('v =', AssistKind.ADD_TYPE_ANNOTATION, '''
+main() {
+  List<String> v = <String>[];
+}
+''');
+  }
+
+  void test_addTypeAnnotation_local_OK_int() {
+    _indexTestUnit('''
+main() {
+  var v = 0;
+}
+''');
+    assertHasAssistAt('v =', AssistKind.ADD_TYPE_ANNOTATION, '''
+main() {
+  int v = 0;
+}
+''');
+  }
+
+  void test_addTypeAnnotation_local_OK_onInitializer() {
+    _indexTestUnit('''
+main() {
+  var v = 123;
+}
+''');
+    assertHasAssistAt('23', AssistKind.ADD_TYPE_ANNOTATION, '''
+main() {
+  int v = 123;
+}
+''');
+  }
+
+  void test_addTypeAnnotation_local_OK_onName() {
+    _indexTestUnit('''
+main() {
+  var abc = 0;
+}
+''');
+    assertHasAssistAt('bc', AssistKind.ADD_TYPE_ANNOTATION, '''
+main() {
+  int abc = 0;
+}
+''');
+  }
+
+  void test_addTypeAnnotation_local_OK_onVar() {
+    _indexTestUnit('''
+main() {
+  var v = 0;
+}
+''');
+    assertHasAssistAt('var ', AssistKind.ADD_TYPE_ANNOTATION, '''
+main() {
+  int v = 0;
+}
+''');
+  }
+
+  void test_addTypeAnnotation_local_wrong_hasTypeAnnotation() {
+    _indexTestUnit('''
+main() {
+  int v = 42;
+}
+''');
+    assertNoAssistAt(' = 42', AssistKind.ADD_TYPE_ANNOTATION);
+  }
+
+  void test_addTypeAnnotation_local_wrong_multiple() {
+    _indexTestUnit('''
+main() {
+  var a = 1, b = '';
+}
+''');
+    assertNoAssistAt('var ', AssistKind.ADD_TYPE_ANNOTATION);
+  }
+
+  void test_addTypeAnnotation_local_wrong_noValue() {
+    verifyNoTestUnitErrors = false;
+    _indexTestUnit('''
+main() {
+  var v;
+}
+''');
+    assertNoAssistAt('var ', AssistKind.ADD_TYPE_ANNOTATION);
+  }
+
+  void test_addTypeAnnotation_local_wrong_null() {
+    _indexTestUnit('''
+main() {
+  var v = null;
+}
+''');
+    assertNoAssistAt('var ', AssistKind.ADD_TYPE_ANNOTATION);
+  }
+
+  void test_addTypeAnnotation_local_wrong_unknown() {
+    verifyNoTestUnitErrors = false;
+    _indexTestUnit('''
+main() {
+  var v = unknownVar;
+}
+''');
+    assertNoAssistAt('var ', AssistKind.ADD_TYPE_ANNOTATION);
+  }
+
+  void test_addTypeAnnotation_topLevelField_OK_int() {
+    _indexTestUnit('''
+var V = 0;
+''');
+    assertHasAssistAt('var ', AssistKind.ADD_TYPE_ANNOTATION, '''
+int V = 0;
+''');
+  }
+
+  void test_addTypeAnnotation_topLevelField_wrong_multiple() {
+    _indexTestUnit('''
+var A = 1, V = '';
+''');
+    assertNoAssistAt('var ', AssistKind.ADD_TYPE_ANNOTATION);
+  }
+
+  void test_addTypeAnnotation_topLevelField_wrong_noValue() {
+    _indexTestUnit('''
+var V;
+''');
+    assertNoAssistAt('var ', AssistKind.ADD_TYPE_ANNOTATION);
+  }
+
+  void test_assignToLocalVariable() {
+    _indexTestUnit('''
+main() {
+  List<int> bytes;
+  readBytes();
+}
+List<int> readBytes() => <int>[];
+''');
+    assertHasAssistAt('readBytes();', AssistKind.ASSIGN_TO_LOCAL_VARIABLE, '''
+main() {
+  List<int> bytes;
+  var readBytes = readBytes();
+}
+List<int> readBytes() => <int>[];
+''');
+    assertHasPositionGroup('NAME', expectedPositions(['readBytes = ']));
+    expect(
+        linkedPositionGroup.proposals,
+        unorderedEquals(['list', 'bytes2', 'readBytes']));
+  }
+
+  void test_assignToLocalVariable_alreadyAssignment() {
+    _indexTestUnit('''
+main() {
+  var vvv;
+  vvv = 42;
+}
+''');
+    assertNoAssistAt('vvv =', AssistKind.ASSIGN_TO_LOCAL_VARIABLE);
+  }
+
+  void test_assignToLocalVariable_throw() {
+    _indexTestUnit('''
+main() {
+  throw 42;
+}
+''');
+    assertNoAssistAt('throw ', AssistKind.ASSIGN_TO_LOCAL_VARIABLE);
+  }
+
+  void test_assignToLocalVariable_void() {
+    _indexTestUnit('''
+main() {
+  f();
+}
+void f() {}
+''');
+    assertNoAssistAt('f();', AssistKind.ASSIGN_TO_LOCAL_VARIABLE);
+  }
+
+  void test_convertToBlockBody_OK_closure() {
+    _indexTestUnit('''
+setup(x) {}
+main() {
+  setup(() => print('done'));
+}
+''');
+    assertHasAssistAt('() => print', AssistKind.CONVERT_INTO_BLOCK_BODY, '''
+setup(x) {}
+main() {
+  setup(() {
+    return print('done');
+  });
+}
+''');
+  }
+
+  void test_convertToBlockBody_OK_method() {
+    _indexTestUnit('''
+class A {
+  mmm() => 123;
+}
+''');
+    assertHasAssistAt('mmm()', AssistKind.CONVERT_INTO_BLOCK_BODY, '''
+class A {
+  mmm() {
+    return 123;
+  }
+}
+''');
+  }
+
+  void test_convertToBlockBody_OK_onName() {
+    _indexTestUnit('''
+fff() => 123;
+''');
+    assertHasAssistAt('fff()', AssistKind.CONVERT_INTO_BLOCK_BODY, '''
+fff() {
+  return 123;
+}
+''');
+  }
+
+  void test_convertToBlockBody_OK_onValue() {
+    _indexTestUnit('''
+fff() => 123;
+''');
+    assertHasAssistAt('23;', AssistKind.CONVERT_INTO_BLOCK_BODY, '''
+fff() {
+  return 123;
+}
+''');
+  }
+
+  void test_convertToBlockBody_wrong_noEnclosingFunction() {
+    _indexTestUnit('''
+var v = 123;
+''');
+    assertNoAssistAt('v =', AssistKind.CONVERT_INTO_BLOCK_BODY);
+  }
+
+  void test_convertToBlockBody_wrong_notExpressionBlock() {
+    _indexTestUnit('''
+fff() {
+  return 123;
+}
+''');
+    assertNoAssistAt('fff() {', AssistKind.CONVERT_INTO_BLOCK_BODY);
+  }
+
+  void test_convertToExpressionBody_OK_closure() {
+    _indexTestUnit('''
+setup(x) {}
+main() {
+  setup(() {
+    return 42;
+  });
+}
+''');
+    assertHasAssistAt('42;', AssistKind.CONVERT_INTO_EXPRESSION_BODY, '''
+setup(x) {}
+main() {
+  setup(() => 42);
+}
+''');
+  }
+
+  void test_convertToExpressionBody_OK_function_onBlock() {
+    _indexTestUnit('''
+fff() {
+  return 42;
+}
+''');
+    assertHasAssistAt('{', AssistKind.CONVERT_INTO_EXPRESSION_BODY, '''
+fff() => 42;
+''');
+  }
+
+  void test_convertToExpressionBody_OK_function_onName() {
+    _indexTestUnit('''
+fff() {
+  return 42;
+}
+''');
+    assertHasAssistAt('ff()', AssistKind.CONVERT_INTO_EXPRESSION_BODY, '''
+fff() => 42;
+''');
+  }
+
+  void test_convertToExpressionBody_OK_method_onBlock() {
+    _indexTestUnit('''
+class A {
+  m() { // marker
+    return 42;
+  }
+}
+''');
+    assertHasAssistAt(
+        '{ // marker',
+        AssistKind.CONVERT_INTO_EXPRESSION_BODY,
+        '''
+class A {
+  m() => 42;
+}
+''');
+  }
+
+  void test_convertToExpressionBody_OK_topFunction_onReturnStatement() {
+    _indexTestUnit('''
+fff() {
+  return 42;
+}
+''');
+    assertHasAssistAt('return', AssistKind.CONVERT_INTO_EXPRESSION_BODY, '''
+fff() => 42;
+''');
+  }
+
+  void test_convertToExpressionBody_wrong_already() {
+    _indexTestUnit('''
+fff() => 42;
+''');
+    assertNoAssistAt('fff()', AssistKind.CONVERT_INTO_EXPRESSION_BODY);
+  }
+
+  void test_convertToExpressionBody_wrong_moreThanOneStatement() {
+    _indexTestUnit('''
+fff() {
+  var v = 42;
+  return v;
+}
+''');
+    assertNoAssistAt('fff()', AssistKind.CONVERT_INTO_EXPRESSION_BODY);
+  }
+
+  void test_convertToExpressionBody_wrong_noEnclosingFunction() {
+    _indexTestUnit('''
+var V = 42;
+''');
+    assertNoAssistAt('V = ', AssistKind.CONVERT_INTO_EXPRESSION_BODY);
+  }
+
+  void test_convertToExpressionBody_wrong_noReturn() {
+    _indexTestUnit('''
+fff() {
+  var v = 42;
+}
+''');
+    assertNoAssistAt('fff()', AssistKind.CONVERT_INTO_EXPRESSION_BODY);
+  }
+
+  void test_convertToExpressionBody_wrong_noReturnValue() {
+    _indexTestUnit('''
+fff() {
+  return;
+}
+''');
+    assertNoAssistAt('fff()', AssistKind.CONVERT_INTO_EXPRESSION_BODY);
+  }
+
+  void test_convertToIsNotEmpty_OK_on_isEmpty() {
+    _indexTestUnit('''
+main(String str) {
+  !str.isEmpty;
+}
+''');
+    assertHasAssistAt('isEmpty', AssistKind.CONVERT_INTO_IS_NOT_EMPTY, '''
+main(String str) {
+  str.isNotEmpty;
+}
+''');
+  }
+
+  void test_convertToIsNotEmpty_OK_on_str() {
+    _indexTestUnit('''
+main(String str) {
+  !str.isEmpty;
+}
+''');
+    assertHasAssistAt('str.', AssistKind.CONVERT_INTO_IS_NOT_EMPTY, '''
+main(String str) {
+  str.isNotEmpty;
+}
+''');
+  }
+
+  void test_convertToIsNotEmpty_OK_propertyAccess() {
+    _indexTestUnit('''
+main(String str) {
+  !'text'.isEmpty;
+}
+''');
+    assertHasAssistAt('isEmpty', AssistKind.CONVERT_INTO_IS_NOT_EMPTY, '''
+main(String str) {
+  'text'.isNotEmpty;
+}
+''');
+  }
+
+  void test_convertToIsNotEmpty_wrong_notInPrefixExpression() {
+    _indexTestUnit('''
+main(String str) {
+  str.isEmpty;
+}
+''');
+    assertNoAssistAt('isEmpty;', AssistKind.CONVERT_INTO_IS_NOT_EMPTY);
+  }
+
+  void test_convertToIsNotEmpty_wrong_notIsEmpty() {
+    _indexTestUnit('''
+main(int p) {
+  !p.isEven;
+}
+''');
+    assertNoAssistAt('isEven;', AssistKind.CONVERT_INTO_IS_NOT_EMPTY);
+  }
+
+  void test_convertToIsNotEmpty_wrote_noIsNotEmpty() {
+    _indexTestUnit('''
+class A {
+  bool get isEmpty => false;
+}
+main(A a) {
+  !a.isEmpty;
+}
+''');
+    assertNoAssistAt('isEmpty;', AssistKind.CONVERT_INTO_IS_NOT_EMPTY);
+  }
+
+  void test_convertToIsNot_OK_childOfIs_left() {
+    _indexTestUnit('''
+main(p) {
+  !(p is String);
+}
+''');
+    assertHasAssistAt('p is', AssistKind.CONVERT_INTO_IS_NOT, '''
+main(p) {
+  p is! String;
+}
+''');
+  }
+
+  void test_convertToIsNot_OK_childOfIs_right() {
+    _indexTestUnit('''
+main(p) {
+  !(p is String);
+}
+''');
+    assertHasAssistAt('String)', AssistKind.CONVERT_INTO_IS_NOT, '''
+main(p) {
+  p is! String;
+}
+''');
+  }
+
+  void test_convertToIsNot_OK_is() {
+    _indexTestUnit('''
+main(p) {
+  !(p is String);
+}
+''');
+    assertHasAssistAt('is String', AssistKind.CONVERT_INTO_IS_NOT, '''
+main(p) {
+  p is! String;
+}
+''');
+  }
+
+  void test_convertToIsNot_OK_is_higherPrecedencePrefix() {
+    _indexTestUnit('''
+main(p) {
+  !!(p is String);
+}
+''');
+    assertHasAssistAt('is String', AssistKind.CONVERT_INTO_IS_NOT, '''
+main(p) {
+  !(p is! String);
+}
+''');
+  }
+
+  void test_convertToIsNot_OK_is_not_higherPrecedencePrefix() {
+    _indexTestUnit('''
+main(p) {
+  !!(p is String);
+}
+''');
+    assertHasAssistAt('!(p', AssistKind.CONVERT_INTO_IS_NOT, '''
+main(p) {
+  !(p is! String);
+}
+''');
+  }
+
+  void test_convertToIsNot_OK_not() {
+    _indexTestUnit('''
+main(p) {
+  !(p is String);
+}
+''');
+    assertHasAssistAt('!(p', AssistKind.CONVERT_INTO_IS_NOT, '''
+main(p) {
+  p is! String;
+}
+''');
+  }
+
+  void test_convertToIsNot_OK_parentheses() {
+    _indexTestUnit('''
+main(p) {
+  !(p is String);
+}
+''');
+    assertHasAssistAt('(p is', AssistKind.CONVERT_INTO_IS_NOT, '''
+main(p) {
+  p is! String;
+}
+''');
+  }
+
+  void test_convertToIsNot_wrong_is_alreadyIsNot() {
+    _indexTestUnit('''
+main(p) {
+  p is! String;
+}
+''');
+    assertNoAssistAt('is!', AssistKind.CONVERT_INTO_IS_NOT);
+  }
+
+  void test_convertToIsNot_wrong_is_noEnclosingParenthesis() {
+    _indexTestUnit('''
+main(p) {
+  p is String;
+}
+''');
+    assertNoAssistAt('is String', AssistKind.CONVERT_INTO_IS_NOT);
+  }
+
+  void test_convertToIsNot_wrong_is_noPrefix() {
+    _indexTestUnit('''
+main(p) {
+  (p is String);
+}
+''');
+    assertNoAssistAt('is String', AssistKind.CONVERT_INTO_IS_NOT);
+  }
+
+  void test_convertToIsNot_wrong_is_notIsExpression() {
+    _indexTestUnit('''
+main(p) {
+  123 + 456;
+}
+''');
+    assertNoAssistAt('123 +', AssistKind.CONVERT_INTO_IS_NOT);
+  }
+
+  void test_convertToIsNot_wrong_is_notTheNotOperator() {
+    verifyNoTestUnitErrors = false;
+    _indexTestUnit('''
+main(p) {
+  ++(p is String);
+}
+''');
+    assertNoAssistAt('is String', AssistKind.CONVERT_INTO_IS_NOT);
+  }
+
+  void test_convertToIsNot_wrong_not_alreadyIsNot() {
+    _indexTestUnit('''
+main(p) {
+  !(p is! String);
+}
+''');
+    assertNoAssistAt('!(p', AssistKind.CONVERT_INTO_IS_NOT);
+  }
+
+  void test_convertToIsNot_wrong_not_noEnclosingParenthesis() {
+    _indexTestUnit('''
+main(p) {
+  !p;
+}
+''');
+    assertNoAssistAt('!p', AssistKind.CONVERT_INTO_IS_NOT);
+  }
+
+  void test_convertToIsNot_wrong_not_notIsExpression() {
+    _indexTestUnit('''
+main(p) {
+  !(p == null);
+}
+''');
+    assertNoAssistAt('!(p', AssistKind.CONVERT_INTO_IS_NOT);
+  }
+
+  void test_convertToIsNot_wrong_not_notTheNotOperator() {
+    verifyNoTestUnitErrors = false;
+    _indexTestUnit('''
+main(p) {
+  ++(p is String);
+}
+''');
+    assertNoAssistAt('++(', AssistKind.CONVERT_INTO_IS_NOT);
+  }
+
+  void test_exchangeBinaryExpressionArguments_OK_extended_mixOperator_1() {
+    _indexTestUnit('''
+main() {
+  1 * 2 * 3 + 4;
+}
+''');
+    assertHasAssistAt('* 2', AssistKind.EXCHANGE_OPERANDS, '''
+main() {
+  2 * 3 * 1 + 4;
+}
+''');
+  }
+
+  void test_exchangeBinaryExpressionArguments_OK_extended_mixOperator_2() {
+    _indexTestUnit('''
+main() {
+  1 + 2 - 3 + 4;
+}
+''');
+    assertHasAssistAt('+ 2', AssistKind.EXCHANGE_OPERANDS, '''
+main() {
+  2 + 1 - 3 + 4;
+}
+''');
+  }
+
+  void
+      test_exchangeBinaryExpressionArguments_OK_extended_sameOperator_afterFirst() {
+    _indexTestUnit('''
+main() {
+  1 + 2 + 3;
+}
+''');
+    assertHasAssistAt('+ 2', AssistKind.EXCHANGE_OPERANDS, '''
+main() {
+  2 + 3 + 1;
+}
+''');
+  }
+
+  void
+      test_exchangeBinaryExpressionArguments_OK_extended_sameOperator_afterSecond() {
+    _indexTestUnit('''
+main() {
+  1 + 2 + 3;
+}
+''');
+    assertHasAssistAt('+ 3', AssistKind.EXCHANGE_OPERANDS, '''
+main() {
+  3 + 1 + 2;
+}
+''');
+  }
+
+  void test_exchangeBinaryExpressionArguments_OK_simple_afterOperator() {
+    _indexTestUnit('''
+main() {
+  1 + 2;
+}
+''');
+    assertHasAssistAt(' 2', AssistKind.EXCHANGE_OPERANDS, '''
+main() {
+  2 + 1;
+}
+''');
+  }
+
+  void test_exchangeBinaryExpressionArguments_OK_simple_beforeOperator() {
+    _indexTestUnit('''
+main() {
+  1 + 2;
+}
+''');
+    assertHasAssistAt('+ 2', AssistKind.EXCHANGE_OPERANDS, '''
+main() {
+  2 + 1;
+}
+''');
+  }
+
+  void test_exchangeBinaryExpressionArguments_OK_simple_fullSelection() {
+    _indexTestUnit('''
+main() {
+  1 + 2;
+}
+''');
+    length = '1 + 2'.length;
+    assertHasAssistAt('1 + 2', AssistKind.EXCHANGE_OPERANDS, '''
+main() {
+  2 + 1;
+}
+''');
+  }
+
+  void test_exchangeBinaryExpressionArguments_OK_simple_withLength() {
+    _indexTestUnit('''
+main() {
+  1 + 2;
+}
+''');
+    length = 2;
+    assertHasAssistAt('+ 2', AssistKind.EXCHANGE_OPERANDS, '''
+main() {
+  2 + 1;
+}
+''');
+  }
+
+  void test_exchangeBinaryExpressionArguments_wrong_extraLength() {
+    _indexTestUnit('''
+main() {
+  111 + 222;
+}
+''');
+    length = 3;
+    assertNoAssistAt('+ 222', AssistKind.EXCHANGE_OPERANDS);
+  }
+
+  void test_exchangeBinaryExpressionArguments_wrong_onOperand() {
+    _indexTestUnit('''
+main() {
+  111 + 222;
+}
+''');
+    length = 3;
+    assertNoAssistAt('11 +', AssistKind.EXCHANGE_OPERANDS);
+  }
+
+  void test_exchangeBinaryExpressionArguments_wrong_selectionWithBinary() {
+    _indexTestUnit('''
+main() {
+  1 + 2 + 3;
+}
+''');
+    length = '1 + 2 + 3'.length;
+    assertNoAssistAt('1 + 2 + 3', AssistKind.EXCHANGE_OPERANDS);
+  }
+
+  void test_joinVariableDeclaration_onAssignment_OK() {
+    _indexTestUnit('''
+main() {
+  var v;
+  v = 1;
+}
+''');
+    assertHasAssistAt('v =', AssistKind.JOIN_VARIABLE_DECLARATION, '''
+main() {
+  var v = 1;
+}
+''');
+  }
+
+  void test_joinVariableDeclaration_onAssignment_wrong_hasInitializer() {
+    _indexTestUnit('''
+main() {
+  var v = 1;
+  v = 2;
+}
+''');
+    assertNoAssistAt('v = 2', AssistKind.JOIN_VARIABLE_DECLARATION);
+  }
+
+  void test_joinVariableDeclaration_onAssignment_wrong_notAdjacent() {
+    _indexTestUnit('''
+main() {
+  var v;
+  var bar;
+  v = 1;
+}
+''');
+    assertNoAssistAt('v = 1', AssistKind.JOIN_VARIABLE_DECLARATION);
+  }
+
+  void test_joinVariableDeclaration_onAssignment_wrong_notAssignment() {
+    _indexTestUnit('''
+main() {
+  var v;
+  v += 1;
+}
+''');
+    assertNoAssistAt('v += 1', AssistKind.JOIN_VARIABLE_DECLARATION);
+  }
+
+  void test_joinVariableDeclaration_onAssignment_wrong_notDeclaration() {
+    _indexTestUnit('''
+main(var v) {
+  v = 1;
+}
+''');
+    assertNoAssistAt('v = 1', AssistKind.JOIN_VARIABLE_DECLARATION);
+  }
+
+  void test_joinVariableDeclaration_onAssignment_wrong_notLeftArgument() {
+    _indexTestUnit('''
+main() {
+  var v;
+  1 + v; // marker
+}
+''');
+    assertNoAssistAt('v; // marker', AssistKind.JOIN_VARIABLE_DECLARATION);
+  }
+
+  void test_joinVariableDeclaration_onAssignment_wrong_notOneVariable() {
+    _indexTestUnit('''
+main() {
+  var v, v2;
+  v = 1;
+}
+''');
+    assertNoAssistAt('v = 1', AssistKind.JOIN_VARIABLE_DECLARATION);
+  }
+
+  void test_joinVariableDeclaration_onAssignment_wrong_notResolved() {
+    verifyNoTestUnitErrors = false;
+    _indexTestUnit('''
+main() {
+  var v;
+  x = 1;
+}
+''');
+    assertNoAssistAt('x = 1', AssistKind.JOIN_VARIABLE_DECLARATION);
+  }
+
+  void test_joinVariableDeclaration_onAssignment_wrong_notSameBlock() {
+    _indexTestUnit('''
+main() {
+  var v;
+  {
+    v = 1;
+  }
+}
+''');
+    assertNoAssistAt('v = 1', AssistKind.JOIN_VARIABLE_DECLARATION);
+  }
+
+  void test_joinVariableDeclaration_onDeclaration_OK_onName() {
+    _indexTestUnit('''
+main() {
+  var v;
+  v = 1;
+}
+''');
+    assertHasAssistAt('v;', AssistKind.JOIN_VARIABLE_DECLARATION, '''
+main() {
+  var v = 1;
+}
+''');
+  }
+
+  void test_joinVariableDeclaration_onDeclaration_OK_onType() {
+    _indexTestUnit('''
+main() {
+  int v;
+  v = 1;
+}
+''');
+    assertHasAssistAt('int v', AssistKind.JOIN_VARIABLE_DECLARATION, '''
+main() {
+  int v = 1;
+}
+''');
+  }
+
+  void test_joinVariableDeclaration_onDeclaration_OK_onVar() {
+    _indexTestUnit('''
+main() {
+  var v;
+  v = 1;
+}
+''');
+    assertHasAssistAt('var v', AssistKind.JOIN_VARIABLE_DECLARATION, '''
+main() {
+  var v = 1;
+}
+''');
+  }
+
+  void test_joinVariableDeclaration_onDeclaration_wrong_hasInitializer() {
+    _indexTestUnit('''
+main() {
+  var v = 1;
+  v = 2;
+}
+''');
+    assertNoAssistAt('v = 1', AssistKind.JOIN_VARIABLE_DECLARATION);
+  }
+
+  void test_joinVariableDeclaration_onDeclaration_wrong_lastStatement() {
+    _indexTestUnit('''
+main() {
+  if (true)
+    var v;
+}
+''');
+    assertNoAssistAt('v;', AssistKind.JOIN_VARIABLE_DECLARATION);
+  }
+
+  void
+      test_joinVariableDeclaration_onDeclaration_wrong_nextNotAssignmentExpression() {
+    _indexTestUnit('''
+main() {
+  var v;
+  42;
+}
+''');
+    assertNoAssistAt('v;', AssistKind.JOIN_VARIABLE_DECLARATION);
+  }
+
+  void
+      test_joinVariableDeclaration_onDeclaration_wrong_nextNotExpressionStatement() {
+    _indexTestUnit('''
+main() {
+  var v;
+  if (true) return;
+}
+''');
+    assertNoAssistAt('v;', AssistKind.JOIN_VARIABLE_DECLARATION);
+  }
+
+  void
+      test_joinVariableDeclaration_onDeclaration_wrong_nextNotPureAssignment() {
+    _indexTestUnit('''
+main() {
+  var v;
+  v += 1;
+}
+''');
+    assertNoAssistAt('v;', AssistKind.JOIN_VARIABLE_DECLARATION);
+  }
+
+  void test_joinVariableDeclaration_onDeclaration_wrong_notOneVariable() {
+    _indexTestUnit('''
+main() {
+  var v, v2;
+  v = 1;
+}
+''');
+    assertNoAssistAt('v, ', AssistKind.JOIN_VARIABLE_DECLARATION);
+  }
+
+  void test_removeTypeAnnotation_classField_OK() {
+    _indexTestUnit('''
+class A {
+  int v = 1;
+}
+''');
+    assertHasAssistAt('v = ', AssistKind.REMOVE_TYPE_ANNOTATION, '''
+class A {
+  var v = 1;
+}
+''');
+  }
+
+  void test_removeTypeAnnotation_localVariable_OK() {
+    _indexTestUnit('''
+main() {
+  int a = 1, b = 2;
+}
+''');
+    assertHasAssistAt('int ', AssistKind.REMOVE_TYPE_ANNOTATION, '''
+main() {
+  var a = 1, b = 2;
+}
+''');
+  }
+
+  void test_removeTypeAnnotation_topLevelVariable_OK() {
+    _indexTestUnit('''
+int V = 1;
+''');
+    assertHasAssistAt('int ', AssistKind.REMOVE_TYPE_ANNOTATION, '''
+var V = 1;
+''');
+  }
+
+  void test_replaceConditionalWithIfElse_OK_assignment() {
+    _indexTestUnit('''
+main() {
+  var v;
+  v = true ? 111 : 222;
+}
+''');
+    // on conditional
+    assertHasAssistAt('11 :', AssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE, '''
+main() {
+  var v;
+  if (true) {
+    v = 111;
+  } else {
+    v = 222;
+  }
+}
+''');
+    // on variable
+    assertHasAssistAt('v =', AssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE, '''
+main() {
+  var v;
+  if (true) {
+    v = 111;
+  } else {
+    v = 222;
+  }
+}
+''');
+  }
+
+  void test_replaceConditionalWithIfElse_OK_return() {
+    _indexTestUnit('''
+main() {
+  return true ? 111 : 222;
+}
+''');
+    assertHasAssistAt(
+        'return ',
+        AssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE,
+        '''
+main() {
+  if (true) {
+    return 111;
+  } else {
+    return 222;
+  }
+}
+''');
+  }
+
+  void test_replaceConditionalWithIfElse_OK_variableDeclaration() {
+    _indexTestUnit('''
+main() {
+  int a = 1, vvv = true ? 111 : 222, b = 2;
+}
+''');
+    assertHasAssistAt('11 :', AssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE, '''
+main() {
+  int a = 1, vvv, b = 2;
+  if (true) {
+    vvv = 111;
+  } else {
+    vvv = 222;
+  }
+}
+''');
+  }
+
+  String _applyEdits(String code, List<Edit> edits) {
+    edits.sort((a, b) => b.offset - a.offset);
+    edits.forEach((Edit edit) {
+      code = code.substring(0, edit.offset) +
+          edit.replacement +
+          code.substring(edit.end);
+    });
+    return code;
+  }
+
+  /**
+   * Computes assists and verifies that there is an assist of the given kind.
+   */
+  Assist _assertHasAssist(AssistKind kind) {
+    List<Assist> assists =
+        computeAssists(searchEngine, testUnit, offset, length);
+    for (Assist assist in assists) {
+      if (assist.kind == kind) {
+        return assist;
+      }
+    }
+    throw fail('Expected to find assist $kind in\n${assists.join('\n')}');
+  }
+
+  void _assertHasLinkedPositions(String groupId, List<String> expectedStrings) {
+    List<Position> expectedPositions = _findResultPositions(expectedStrings);
+    List<LinkedPositionGroup> groups = change.linkedPositionGroups;
+    for (LinkedPositionGroup group in groups) {
+      if (group.id == groupId) {
+        List<Position> actualPositions = group.positions;
+        expect(actualPositions, unorderedEquals(expectedPositions));
+        return;
+      }
+    }
+    fail('No group with ID=$groupId foind in\n${groups.join('\n')}');
+  }
+
+  void _assertHasLinkedProposals(String groupId, List<String> expected) {
+    List<LinkedPositionGroup> groups = change.linkedPositionGroups;
+    for (LinkedPositionGroup group in groups) {
+      if (group.id == groupId) {
+        expect(group.proposals, expected);
+        return;
+      }
+    }
+    fail('No group with ID=$groupId foind in\n${groups.join('\n')}');
+  }
+
+  List<Position> _findResultPositions(List<String> searchStrings) {
+    List<Position> positions = <Position>[];
+    for (String search in searchStrings) {
+      int offset = resultCode.indexOf(search);
+      int length = getLeadingIdentifierLength(search);
+      positions.add(new Position(testFile, offset, length));
+    }
+    return positions;
+  }
+
+  void _indexTestUnit(String code) {
+    resolveTestUnit(code);
+    index.indexUnit(context, testUnit);
+  }
+}
diff --git a/pkg/analysis_services/test/correction/fix_test.dart b/pkg/analysis_services/test/correction/fix_test.dart
index 3d606dc..052051d 100644
--- a/pkg/analysis_services/test/correction/fix_test.dart
+++ b/pkg/analysis_services/test/correction/fix_test.dart
@@ -12,9 +12,13 @@
 import 'package:analysis_services/index/index.dart';
 import 'package:analysis_services/index/local_memory_index.dart';
 import 'package:analysis_services/src/search/search_engine.dart';
+import 'package:analysis_testing/abstract_context.dart';
 import 'package:analysis_testing/abstract_single_unit.dart';
 import 'package:analysis_testing/reflective_tests.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:unittest/unittest.dart';
 
 
@@ -858,6 +862,256 @@
 ''');
   }
 
+  void test_importLibraryPackage_withType() {
+    provider.newFile('/packages/my_pkg/lib/my_lib.dart', '''
+library my_lib;
+class Test {}
+''');
+    {
+      Folder myPkgFolder = provider.getResource('/packages/my_pkg/lib');
+      UriResolver pkgResolver = new PackageMapUriResolver(provider, {
+        'my_pkg': [myPkgFolder]
+      });
+      context.sourceFactory = new SourceFactory(
+          [AbstractContextTest.SDK_RESOLVER, resourceResolver, pkgResolver]);
+    }
+    // force 'my_pkg' resolution
+    addSource('/tmp/other.dart', "import 'package:my_pkg/my_lib.dart';");
+    // try to find a fix
+    _indexTestUnit('''
+main() {
+  Test test = null;
+}
+''');
+    performAllAnalysisTasks();
+    assertHasFix(FixKind.IMPORT_LIBRARY_PROJECT, '''
+import 'package:my_pkg/my_lib.dart';
+
+main() {
+  Test test = null;
+}
+''');
+  }
+
+  void test_importLibraryPrefix_withTopLevelVariable() {
+    _indexTestUnit('''
+import 'dart:math' as pref;
+main() {
+  print(pref.E);
+  print(PI);
+}
+''');
+    assertHasFix(FixKind.IMPORT_LIBRARY_PREFIX, '''
+import 'dart:math' as pref;
+main() {
+  print(pref.E);
+  print(pref.PI);
+}
+''');
+  }
+
+  void test_importLibraryPrefix_withType() {
+    _indexTestUnit('''
+import 'dart:async' as pref;
+main() {
+  pref.Stream s = null;
+  Future f = null;
+}
+''');
+    assertHasFix(FixKind.IMPORT_LIBRARY_PREFIX, '''
+import 'dart:async' as pref;
+main() {
+  pref.Stream s = null;
+  pref.Future f = null;
+}
+''');
+  }
+
+  void test_importLibraryProject_withFunction() {
+    addSource('/lib.dart', '''
+library lib;
+myFunction() {}
+''');
+    _indexTestUnit('''
+main() {
+  myFunction();
+}
+''');
+    performAllAnalysisTasks();
+    assertHasFix(FixKind.IMPORT_LIBRARY_PROJECT, '''
+import 'lib.dart';
+
+main() {
+  myFunction();
+}
+''');
+  }
+
+  void test_importLibraryProject_withTopLevelVariable() {
+    addSource('/lib.dart', '''
+library lib;
+int MY_VAR = 42;
+''');
+    _indexTestUnit('''
+main() {
+  print(MY_VAR);
+}
+''');
+    performAllAnalysisTasks();
+    assertHasFix(FixKind.IMPORT_LIBRARY_PROJECT, '''
+import 'lib.dart';
+
+main() {
+  print(MY_VAR);
+}
+''');
+  }
+
+  void test_importLibraryProject_withType_inParentFolder() {
+    testFile = '/project/bin/test.dart';
+    addSource('/project/lib.dart', '''
+library lib;
+class Test {}
+''');
+    _indexTestUnit('''
+main() {
+  Test t = null;
+}
+''');
+    performAllAnalysisTasks();
+    assertHasFix(FixKind.IMPORT_LIBRARY_PROJECT, '''
+import '../lib.dart';
+
+main() {
+  Test t = null;
+}
+''');
+  }
+
+  void test_importLibraryProject_withType_inRelativeFolder() {
+    testFile = '/project/bin/test.dart';
+    addSource('/project/lib/sub/folder/lib.dart', '''
+library lib;
+class Test {}
+''');
+    _indexTestUnit('''
+main() {
+  Test t = null;
+}
+''');
+    performAllAnalysisTasks();
+    assertHasFix(FixKind.IMPORT_LIBRARY_PROJECT, '''
+import '../lib/sub/folder/lib.dart';
+
+main() {
+  Test t = null;
+}
+''');
+  }
+
+  void test_importLibraryProject_withType_inSameFolder() {
+    testFile = '/project/bin/test.dart';
+    addSource('/project/bin/lib.dart', '''
+library lib;
+class Test {}
+''');
+    _indexTestUnit('''
+main() {
+  Test t = null;
+}
+''');
+    performAllAnalysisTasks();
+    assertHasFix(FixKind.IMPORT_LIBRARY_PROJECT, '''
+import 'lib.dart';
+
+main() {
+  Test t = null;
+}
+''');
+  }
+
+  void test_importLibrarySdk_withTopLevelVariable() {
+    _ensureSdkMathLibraryResolved();
+    _indexTestUnit('''
+main() {
+  print(PI);
+}
+''');
+    performAllAnalysisTasks();
+    assertHasFix(FixKind.IMPORT_LIBRARY_SDK, '''
+import 'dart:math';
+
+main() {
+  print(PI);
+}
+''');
+  }
+
+  void test_importLibrarySdk_withType_invocationTarget() {
+    _ensureSdkAsyncLibraryResolved();
+    _indexTestUnit('''
+main() {
+  Future.wait(null);
+}
+''');
+    assertHasFix(FixKind.IMPORT_LIBRARY_SDK, '''
+import 'dart:async';
+
+main() {
+  Future.wait(null);
+}
+''');
+  }
+
+  void test_importLibrarySdk_withType_typeAnnotation() {
+    _ensureSdkAsyncLibraryResolved();
+    _indexTestUnit('''
+main() {
+  Future f = null;
+}
+''');
+    assertHasFix(FixKind.IMPORT_LIBRARY_SDK, '''
+import 'dart:async';
+
+main() {
+  Future f = null;
+}
+''');
+  }
+
+  void test_importLibrarySdk_withType_typeAnnotation_PrefixedIdentifier() {
+    _ensureSdkAsyncLibraryResolved();
+    _indexTestUnit('''
+main() {
+  Future.wait;
+}
+''');
+    assertHasFix(FixKind.IMPORT_LIBRARY_SDK, '''
+import 'dart:async';
+
+main() {
+  Future.wait;
+}
+''');
+  }
+
+  void test_importLibraryShow() {
+    _indexTestUnit('''
+import 'dart:async' show Stream;
+main() {
+  Stream s = null;
+  Future f = null;
+}
+''');
+    assertHasFix(FixKind.IMPORT_LIBRARY_SHOW, '''
+import 'dart:async' show Future, Stream;
+main() {
+  Stream s = null;
+  Future f = null;
+}
+''');
+  }
+
   void test_isNotNull() {
     _indexTestUnit('''
 main(p) {
@@ -1579,6 +1833,22 @@
     fail('No group with ID=$groupId foind in\n${groups.join('\n')}');
   }
 
+  /**
+   * We search for elements only already resolved lbiraries, and we use
+   * `dart:async` elements in tests.
+   */
+  void _ensureSdkAsyncLibraryResolved() {
+    resolveLibraryUnit(addSource('/other.dart', 'import "dart:async";'));
+  }
+
+  /**
+   * We search for elements only already resolved lbiraries, and we use
+   * `dart:async` elements in tests.
+   */
+  void _ensureSdkMathLibraryResolved() {
+    resolveLibraryUnit(addSource('/other.dart', 'import "dart:math";'));
+  }
+
   AnalysisError _findErrorToFix() {
     List<AnalysisError> errors = context.computeErrors(testSource);
     expect(
diff --git a/pkg/analysis_services/test/correction/test_all.dart b/pkg/analysis_services/test/correction/test_all.dart
index 7daed8bb..6a7094e 100644
--- a/pkg/analysis_services/test/correction/test_all.dart
+++ b/pkg/analysis_services/test/correction/test_all.dart
@@ -6,6 +6,7 @@
 
 import 'package:unittest/unittest.dart';
 
+import 'assist_test.dart' as assist_test;
 import 'change_test.dart' as change_test;
 import 'fix_test.dart' as fix_test;
 import 'levenshtein_test.dart' as levenshtein_test;
@@ -17,6 +18,7 @@
 main() {
   groupSep = ' | ';
   group('correction', () {
+    assist_test.main();
     change_test.main();
     fix_test.main();
     levenshtein_test.main();
diff --git a/pkg/analysis_services/test/index/local_file_index_test.dart b/pkg/analysis_services/test/index/local_file_index_test.dart
index 8ac5fef..cc0dbf4 100644
--- a/pkg/analysis_services/test/index/local_file_index_test.dart
+++ b/pkg/analysis_services/test/index/local_file_index_test.dart
@@ -4,8 +4,6 @@
 
 library test.services.src.index.local_file_index;
 
-import 'dart:io';
-
 import 'package:analysis_services/index/index.dart';
 import 'package:analysis_services/index/local_file_index.dart';
 import 'package:unittest/unittest.dart';
@@ -14,13 +12,8 @@
 main() {
   groupSep = ' | ';
   test('createLocalFileIndex', () {
-    Directory indexDirectory = Directory.systemTemp.createTempSync(
-        'AnalysisServer_index');
-    try {
-    Index index = createLocalFileIndex(indexDirectory);
+    Index index = createLocalFileIndex();
     expect(index, isNotNull);
-    } finally {
-      indexDirectory.delete(recursive: true);
-    }
+    index.clear();
   });
 }
diff --git a/pkg/analysis_services/test/index/store/separate_file_manager_test.dart b/pkg/analysis_services/test/index/store/temporary_folder_file_manager_test.dart
similarity index 66%
rename from pkg/analysis_services/test/index/store/separate_file_manager_test.dart
rename to pkg/analysis_services/test/index/store/temporary_folder_file_manager_test.dart
index 223fe2c..99aae9b 100644
--- a/pkg/analysis_services/test/index/store/separate_file_manager_test.dart
+++ b/pkg/analysis_services/test/index/store/temporary_folder_file_manager_test.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library test.services.src.index.store.separate_file_mananer;
+library test.services.src.index.store.temporary_folder_file_mananer;
 
 import 'dart:io';
 
-import 'package:analysis_services/src/index/store/separate_file_manager.dart';
+import 'package:analysis_services/src/index/store/temporary_folder_file_manager.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:path/path.dart';
 import 'package:unittest/unittest.dart';
@@ -20,16 +20,14 @@
 
 @ReflectiveTestCase()
 class _SeparateFileManagerTest {
-  Directory tempDir;
-  SeparateFileManager fileManager;
+  TemporaryFolderFileManager fileManager;
 
   void setUp() {
-    tempDir = Directory.systemTemp.createTempSync('AnalysisServer_index');
-    fileManager = new SeparateFileManager(tempDir);
+    fileManager = new TemporaryFolderFileManager();
   }
 
   void tearDown() {
-    tempDir.delete(recursive: true);
+    fileManager.clear();
   }
 
   test_clear() {
@@ -45,6 +43,13 @@
   }
 
   test_delete_doesNotExist() {
+    return fileManager.write('other.index', <int>[1, 2, 3, 4]).then((_) {
+      String name = "42.index";
+      fileManager.delete(name);
+    });
+  }
+
+  test_delete_noDirectory() {
     String name = "42.index";
     fileManager.delete(name);
   }
@@ -68,7 +73,18 @@
     });
   }
 
+  test_read_noDirectory() {
+    String name = "42.index";
+    return fileManager.read(name).then((bytes) {
+      expect(bytes, isNull);
+    });
+  }
+
   bool _existsSync(String name) {
-    return new File(join(tempDir.path, name)).existsSync();
+    Directory directory = fileManager.test_directory;
+    if (directory == null) {
+      return false;
+    }
+    return new File(join(directory.path, name)).existsSync();
   }
 }
diff --git a/pkg/analysis_services/test/index/store/test_all.dart b/pkg/analysis_services/test/index/store/test_all.dart
index e0a8d1f..4d3884a 100644
--- a/pkg/analysis_services/test/index/store/test_all.dart
+++ b/pkg/analysis_services/test/index/store/test_all.dart
@@ -8,8 +8,8 @@
 
 import 'codec_test.dart' as codec_test;
 import 'collection_test.dart' as collection_test;
-import 'separate_file_manager_test.dart' as separate_file_manager_test;
 import 'split_store_test.dart' as split_store_test;
+import 'temporary_folder_file_manager_test.dart' as tmp_file_manager_test;
 
 
 /**
@@ -20,7 +20,7 @@
   group('store', () {
     codec_test.main();
     collection_test.main();
-    separate_file_manager_test.main();
+    tmp_file_manager_test.main();
     split_store_test.main();
   });
 }
diff --git a/pkg/analysis_services/test/test_all.dart b/pkg/analysis_services/test/test_all.dart
index 23de4a6..419bdfc 100644
--- a/pkg/analysis_services/test/test_all.dart
+++ b/pkg/analysis_services/test/test_all.dart
@@ -4,6 +4,7 @@
 
 import 'package:unittest/unittest.dart';
 
+import 'completion/test_all.dart' as completion_all;
 import 'correction/test_all.dart' as correction_all;
 import 'index/test_all.dart' as index_all;
 import 'search/test_all.dart' as search_all;
@@ -11,6 +12,7 @@
 /// Utility for manually running all tests.
 main() {
   groupSep = ' | ';
+  completion_all.main();
   correction_all.main();
   index_all.main();
   search_all.main();
diff --git a/pkg/analysis_testing/lib/abstract_context.dart b/pkg/analysis_testing/lib/abstract_context.dart
index fe2b740..f3805db 100644
--- a/pkg/analysis_testing/lib/abstract_context.dart
+++ b/pkg/analysis_testing/lib/abstract_context.dart
@@ -40,10 +40,13 @@
 
 class AbstractContextTest {
   static final DartSdk SDK = new MockSdk();
+  static final UriResolver SDK_RESOLVER = new DartUriResolver(SDK);
 
   MemoryResourceProvider provider = new MemoryResourceProvider();
+  UriResolver resourceResolver;
   AnalysisContext context;
 
+
   Source addSource(String path, String content) {
     File file = provider.newFile(path, content);
     Source source = file.createSource(UriKind.FILE_URI);
@@ -54,6 +57,18 @@
     return source;
   }
 
+  /**
+   * Performs all analysis tasks in [context].
+   */
+  void performAllAnalysisTasks() {
+    while (true) {
+      AnalysisResult result = context.performAnalysisTask();
+      if (!result.hasMoreWork) {
+        break;
+      }
+    }
+  }
+
   CompilationUnit resolveDartUnit(Source unitSource, Source librarySource) {
     return context.resolveCompilationUnit2(unitSource, librarySource);
   }
@@ -63,9 +78,9 @@
   }
 
   void setUp() {
+    resourceResolver = new ResourceUriResolver(provider);
     context = AnalysisEngine.instance.createAnalysisContext();
-    context.sourceFactory = new SourceFactory(<UriResolver>[new DartUriResolver(
-        SDK), new ResourceUriResolver(provider)]);
+    context.sourceFactory = new SourceFactory([SDK_RESOLVER, resourceResolver]);
   }
 
   void tearDown() {
diff --git a/pkg/analysis_testing/lib/mock_sdk.dart b/pkg/analysis_testing/lib/mock_sdk.dart
index 224d438..f1e414d 100644
--- a/pkg/analysis_testing/lib/mock_sdk.dart
+++ b/pkg/analysis_testing/lib/mock_sdk.dart
@@ -15,76 +15,88 @@
   final resource.MemoryResourceProvider provider =
       new resource.MemoryResourceProvider();
 
+  static const _MockSdkLibrary LIB_CORE =
+      const _MockSdkLibrary('dart:core', '/lib/core/core.dart', '''
+library dart.core;
+class Object {}
+class Function {}
+class StackTrace {}
+class Symbol {}
+class Type {}
+
+abstract class Comparable<T> {
+  int compareTo(T other);
+}
+
+class String implements Comparable<String> {
+  bool get isEmpty => false;
+  bool get isNotEmpty => false;
+}
+
+class bool extends Object {}
+abstract class num implements Comparable<num> {
+  num operator +(num other);
+  num operator -(num other);
+  num operator *(num other);
+  num operator /(num other);
+  int toInt();
+}
+abstract class int extends num {
+  bool get isEven => false;
+  int operator -();
+}
+class double extends num {}
+class DateTime extends Object {}
+class Null extends Object {}
+
+class Deprecated extends Object {
+  final String expires;
+  const Deprecated(this.expires);
+}
+const Object deprecated = const Deprecated("next release");
+
+abstract class List<E> extends Object {
+  void add(E value);
+  E operator [](int index);
+  void operator []=(int index, E value);
+}
+class Map<K, V> extends Object {}
+
+void print(Object object) {}
+''');
+
+  static const _MockSdkLibrary LIB_ASYNC =
+      const _MockSdkLibrary('dart:async', '/lib/async/async.dart', '''
+library dart.async;
+class Future {
+  static Future wait(List<Future> futures) => null;
+}
+
+class Stream<T> {}
+''');
+
+  static const _MockSdkLibrary LIB_MATH =
+      const _MockSdkLibrary('dart:math', '/lib/math/math.dart', '''
+library dart.math;
+const double E = 2.718281828459045;
+const double PI = 3.1415926535897932;
+''');
+
+  static const _MockSdkLibrary LIB_HTML =
+      const _MockSdkLibrary('dart:html', '/lib/html/dartium/html_dartium.dart', '''
+library dart.html;
+class HtmlElement {}
+''');
+
+  static const List<SdkLibrary> LIBRARIES = const [
+      LIB_CORE,
+      LIB_ASYNC,
+      LIB_MATH,
+      LIB_HTML,];
+
   MockSdk() {
-    // TODO(paulberry): Add to this as needed.
-    const Map<String, String> pathToContent = const {
-      "/lib/core/core.dart": '''
-          library dart.core;
-          class Object {}
-          class Function {}
-          class StackTrace {}
-          class Symbol {}
-          class Type {}
-
-          abstract class Comparable<T> {
-            int compareTo(T other);
-          }
-
-          class String implements Comparable<String> {
-          }
-
-          class bool extends Object {}
-          abstract class num implements Comparable<num> {
-            num operator +(num other);
-            num operator -(num other);
-            num operator *(num other);
-            num operator /(num other);
-            int toInt();
-          }
-          abstract class int extends num {
-            int operator -();
-          }
-          class double extends num {}
-          class DateTime extends Object {}
-          class Null extends Object {}
-
-          class Deprecated extends Object {
-            final String expires;
-            const Deprecated(this.expires);
-          }
-          const Object deprecated = const Deprecated("next release");
-
-          abstract class List<E> extends Object {
-            void add(E value);
-            E operator [](int index);
-            void operator []=(int index, E value);
-          }
-          class Map<K, V> extends Object {}
-
-          void print(Object object) {}
-          ''',
-
-      "/lib/html/dartium/html_dartium.dart": '''
-          library dart.html;
-          class HtmlElement {}
-          ''',
-
-      "/lib/async/async.dart": '''
-          library dart.async;
-          class Future {
-            static Future wait(List<Future> futures) => null;
-          }
-          ''',
-
-      "/lib/math/math.dart": '''
-          library dart.math;
-          const double E = 2.718281828459045;
-          const double PI = 3.1415926535897932;
-          '''
-    };
-
-    pathToContent.forEach((String path, String content) {
-      provider.newFile(path, content);
+    LIBRARIES.forEach((_MockSdkLibrary library) {
+      provider.newFile(library.path, library.content);
     });
   }
 
@@ -93,7 +105,7 @@
   AnalysisContext get context => throw unimplemented;
 
   @override
-  List<SdkLibrary> get sdkLibraries => throw unimplemented;
+  List<SdkLibrary> get sdkLibraries => LIBRARIES;
 
   @override
   String get sdkVersion => throw unimplemented;
@@ -143,3 +155,35 @@
     throw unimplemented;
   }
 }
+
+
+class _MockSdkLibrary implements SdkLibrary {
+  final String shortName;
+  final String path;
+  final String content;
+
+  const _MockSdkLibrary(this.shortName, this.path, this.content);
+
+  @override
+  String get category => throw unimplemented;
+
+  @override
+  bool get isDart2JsLibrary => throw unimplemented;
+
+  @override
+  bool get isDocumented => throw unimplemented;
+
+  @override
+  bool get isImplementation => throw unimplemented;
+
+  @override
+  bool get isInternal => throw unimplemented;
+
+  @override
+  bool get isShared => throw unimplemented;
+
+  @override
+  bool get isVmLibrary => throw unimplemented;
+
+  UnimplementedError get unimplemented => new UnimplementedError();
+}
diff --git a/pkg/analyzer/lib/file_system/memory_file_system.dart b/pkg/analyzer/lib/file_system/memory_file_system.dart
index b9c70e4..4ca4e61 100644
--- a/pkg/analyzer/lib/file_system/memory_file_system.dart
+++ b/pkg/analyzer/lib/file_system/memory_file_system.dart
@@ -217,7 +217,7 @@
   int get hashCode => _file.hashCode;
 
   @override
-  bool get isInSystemLibrary => false;
+  bool get isInSystemLibrary => uriKind == UriKind.DART_URI;
 
   @override
   int get modificationStamp => _file._timestamp;
diff --git a/pkg/analysis_server/lib/src/package_uri_resolver.dart b/pkg/analyzer/lib/source/package_map_resolver.dart
similarity index 81%
rename from pkg/analysis_server/lib/src/package_uri_resolver.dart
rename to pkg/analyzer/lib/source/package_map_resolver.dart
index 9f6d042..f083f9f 100644
--- a/pkg/analysis_server/lib/src/package_uri_resolver.dart
+++ b/pkg/analyzer/lib/source/package_map_resolver.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library resolver.package;
+library source.package_map_resolver;
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -81,10 +81,25 @@
     // Return a NonExistingSource instance.
     // This helps provide more meaningful error messages to users
     // (a missing file error, as opposed to an invalid URI error).
-    // TODO(scheglov) move NonExistingSource to "source.dart"
     return new NonExistingSource(uri.toString(), UriKind.PACKAGE_URI);
   }
 
+  @override
+  Uri restoreAbsolute(Source source) {
+    String sourcePath = source.fullName;
+    for (String pkgName in packageMap.keys) {
+      List<Folder> pkgFolders = packageMap[pkgName];
+      for (Folder pkgFolder in pkgFolders) {
+        String pkgFolderPath = pkgFolder.path;
+        if (sourcePath.startsWith(pkgFolderPath)) {
+          String relPath = sourcePath.substring(pkgFolderPath.length);
+          return new Uri(path: '${PACKAGE_SCHEME}:$pkgName$relPath');
+        }
+      }
+    }
+    return null;
+  }
+
   /**
    * Returns `true` if [uri] is a `package` URI.
    */
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index ba77c11..185d4da 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -11837,7 +11837,7 @@
     try {
       node.accept(this);
     } on NodeLocator_NodeFoundException catch (exception) {
-    } on JavaException catch (exception) {
+    } catch (exception) {
       AnalysisEngine.instance.logger.logInformation2("Unable to locate element at offset (${_startOffset} - ${_endOffset})", exception);
       return null;
     }
@@ -11858,7 +11858,7 @@
       node.visitChildren(this);
     } on NodeLocator_NodeFoundException catch (exception) {
       throw exception;
-    } on JavaException catch (exception) {
+    } catch (exception) {
       // Ignore the exception and proceed in order to visit the rest of the structure.
       AnalysisEngine.instance.logger.logInformation2("Exception caught while traversing an AST structure.", exception);
     }
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index f5f6b72..45a774b 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -315,7 +315,7 @@
    * Determine whether the given string is a valid name for a public symbol (i.e. whether it is
    * allowed for a call to the Symbol constructor).
    */
-  static bool isValidPublicSymbol(String name) => name.isEmpty || new JavaPatternMatcher(_PUBLIC_SYMBOL_PATTERN, name).matches();
+  static bool isValidPublicSymbol(String name) => name.isEmpty || name == "void" || new JavaPatternMatcher(_PUBLIC_SYMBOL_PATTERN, name).matches();
 
   /**
    * The type provider used to access the known types.
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 5c83632..166fc82 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -4667,17 +4667,7 @@
    * @return the field element that will return the correctly substituted types
    */
   static FieldElement from(FieldElement baseField, InterfaceType definingType) {
-    if (baseField == null || definingType.typeArguments.length == 0) {
-      return baseField;
-    }
-    DartType baseType = baseField.type;
-    if (baseType == null) {
-      return baseField;
-    }
-    List<DartType> argumentTypes = definingType.typeArguments;
-    List<DartType> parameterTypes = definingType.element.type.typeArguments;
-    DartType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
-    if (baseType == substitutedType) {
+    if (!_isChangedByTypeSubstitution(baseField, definingType)) {
       return baseField;
     }
     // TODO(brianwilkerson) Consider caching the substituted type in the instance. It would use more
@@ -4686,6 +4676,39 @@
   }
 
   /**
+   * Determine whether the given field's type is changed when type parameters from the defining
+   * type's declaration are replaced with the actual type arguments from the defining type.
+   *
+   * @param baseField the base field
+   * @param definingType the type defining the parameters and arguments to be used in the
+   *          substitution
+   * @return true if the type is changed by type substitution.
+   */
+  static bool _isChangedByTypeSubstitution(FieldElement baseField, InterfaceType definingType) {
+    List<DartType> argumentTypes = definingType.typeArguments;
+    if (baseField != null && argumentTypes.length != 0) {
+      DartType baseType = baseField.type;
+      List<DartType> parameterTypes = definingType.element.type.typeArguments;
+      if (baseType != null) {
+        DartType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
+        if (baseType != substitutedType) {
+          return true;
+        }
+      }
+      // If the field has a propagated type, then we need to check whether the propagated type
+      // needs substitution.
+      DartType basePropagatedType = baseField.propagatedType;
+      if (basePropagatedType != null) {
+        DartType substitutedPropagatedType = basePropagatedType.substitute2(argumentTypes, parameterTypes);
+        if (basePropagatedType != substitutedPropagatedType) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
    * Initialize a newly created element to represent a field of the given parameterized type.
    *
    * @param baseElement the element on which the parameterized element was created
@@ -4715,6 +4738,15 @@
   bool get isStatic => baseElement.isStatic;
 
   @override
+  String toString() {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append(type);
+    builder.append(" ");
+    builder.append(displayName);
+    return builder.toString();
+  }
+
+  @override
   InterfaceType get definingType => super.definingType as InterfaceType;
 }
 
@@ -7413,14 +7445,21 @@
  * Combination of [AngularTagSelectorElementImpl] and [HasAttributeSelectorElementImpl].
  */
 class IsTagHasAttributeSelectorElementImpl extends AngularSelectorElementImpl {
-  final String tagName;
+  String _tagName;
 
-  final String attributeName;
+  String _attributeName;
 
-  IsTagHasAttributeSelectorElementImpl(this.tagName, this.attributeName) : super(null, -1);
+  IsTagHasAttributeSelectorElementImpl(String tagName, String attributeName) : super("${tagName}[${attributeName}]", -1) {
+    this._tagName = tagName;
+    this._attributeName = attributeName;
+  }
 
   @override
-  bool apply(XmlTagNode node) => node.tag == tagName && node.getAttribute(attributeName) != null;
+  bool apply(XmlTagNode node) => node.tag == _tagName && node.getAttribute(_attributeName) != null;
+
+  String get attributeName => _attributeName;
+
+  String get tagName => _tagName;
 }
 
 /**
@@ -9900,14 +9939,7 @@
    * @return the property accessor element that will return the correctly substituted types
    */
   static PropertyAccessorElement from(PropertyAccessorElement baseAccessor, InterfaceType definingType) {
-    if (baseAccessor == null || definingType.typeArguments.length == 0) {
-      return baseAccessor;
-    }
-    FunctionType baseType = baseAccessor.type;
-    List<DartType> argumentTypes = definingType.typeArguments;
-    List<DartType> parameterTypes = definingType.element.type.typeArguments;
-    FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
-    if (baseType == substitutedType) {
+    if (!_isChangedByTypeSubstitution(baseAccessor, definingType)) {
       return baseAccessor;
     }
     // TODO(brianwilkerson) Consider caching the substituted type in the instance. It would use more
@@ -9916,6 +9948,40 @@
   }
 
   /**
+   * Determine whether the given property accessor's type is changed when type parameters from the
+   * defining type's declaration are replaced with the actual type arguments from the defining type.
+   *
+   * @param baseAccessor the base property accessor
+   * @param definingType the type defining the parameters and arguments to be used in the
+   *          substitution
+   * @return true if the type is changed by type substitution.
+   */
+  static bool _isChangedByTypeSubstitution(PropertyAccessorElement baseAccessor, InterfaceType definingType) {
+    List<DartType> argumentTypes = definingType.typeArguments;
+    if (baseAccessor != null && argumentTypes.length != 0) {
+      FunctionType baseType = baseAccessor.type;
+      List<DartType> parameterTypes = definingType.element.type.typeArguments;
+      FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
+      if (baseType != substitutedType) {
+        return true;
+      }
+      // If this property accessor is based on a field, that field might have a propagated type.
+      // In which case we need to check whether the propagated type of the field needs substitution.
+      PropertyInducingElement field = baseAccessor.variable;
+      if (!field.isSynthetic) {
+        DartType baseFieldType = field.propagatedType;
+        if (baseFieldType != null) {
+          DartType substitutedFieldType = baseFieldType.substitute2(argumentTypes, parameterTypes);
+          if (baseFieldType != substitutedFieldType) {
+            return true;
+          }
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
    * Initialize a newly created element to represent a property accessor of the given parameterized
    * type.
    *
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 94bee4a..3641a1e 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -2406,7 +2406,7 @@
         dartEntry = new ScanDartTask(this, source, dartEntry.modificationTime, dartEntry.getValue(SourceEntry.CONTENT)).perform(_resultRecorder) as DartEntry;
       } on AnalysisException catch (exception) {
         throw exception;
-      } on JavaException catch (exception, stackTrace) {
+      } catch (exception, stackTrace) {
         throw new AnalysisException("Exception", new CaughtException(exception, stackTrace));
       }
       state = dartEntry.getState(descriptor);
@@ -2488,7 +2488,7 @@
         htmlEntry = new ParseHtmlTask(this, source, htmlEntry.modificationTime, htmlEntry.getValue(SourceEntry.CONTENT)).perform(_resultRecorder) as HtmlEntry;
       } on AnalysisException catch (exception) {
         throw exception;
-      } on JavaException catch (exception, stackTrace) {
+      } catch (exception, stackTrace) {
         throw new AnalysisException("Exception", new CaughtException(exception, stackTrace));
       }
       state = htmlEntry.getState(descriptor);
@@ -3307,6 +3307,14 @@
    * @return the next task that needs to be performed for the given source
    */
   AnalysisContextImpl_TaskData _getNextAnalysisTaskForSource(Source source, SourceEntry sourceEntry, bool isPriority, bool hintsEnabled) {
+    // Refuse to generate tasks for html based files that are above 1500 KB
+//    if (sourceEntry is HtmlEntryImpl && source is FileBasedSource) {
+//      // TODO (jwren) we still need to report an error of some kind back to the client.
+//      JavaFile file = (source as FileBasedSource).file;
+//      if (file.length() > (1500 * 1024)) {
+//        return new AnalysisContextImpl_TaskData(null, false);
+//      }
+//    }
     if (sourceEntry == null) {
       return new AnalysisContextImpl_TaskData(null, false);
     }
@@ -5696,18 +5704,21 @@
     List<CycleBuilder_SourceEntryPair> pairs = new List<CycleBuilder_SourceEntryPair>();
     Source librarySource = library.librarySource;
     DartEntry libraryEntry = AnalysisContextImpl_this._getReadableDartEntry(librarySource);
-    if (libraryEntry != null && libraryEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) {
-      _ensureResolvableCompilationUnit(librarySource, libraryEntry);
-      pairs.add(new CycleBuilder_SourceEntryPair(librarySource, libraryEntry));
-      List<Source> partSources = _getSources(librarySource, libraryEntry, DartEntry.INCLUDED_PARTS);
-      int count = partSources.length;
-      for (int i = 0; i < count; i++) {
-        Source partSource = partSources[i];
-        DartEntry partEntry = AnalysisContextImpl_this._getReadableDartEntry(partSource);
-        if (partEntry != null && partEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) {
-          _ensureResolvableCompilationUnit(partSource, partEntry);
-          pairs.add(new CycleBuilder_SourceEntryPair(partSource, partEntry));
-        }
+    if (libraryEntry == null) {
+      throw new AnalysisException("Cannot find entry for ${librarySource.fullName}");
+    } else if (libraryEntry.getState(DartEntry.PARSED_UNIT) == CacheState.ERROR) {
+      throw new AnalysisException("Cannot compute parsed unit for ${librarySource.fullName}");
+    }
+    _ensureResolvableCompilationUnit(librarySource, libraryEntry);
+    pairs.add(new CycleBuilder_SourceEntryPair(librarySource, libraryEntry));
+    List<Source> partSources = _getSources(librarySource, libraryEntry, DartEntry.INCLUDED_PARTS);
+    int count = partSources.length;
+    for (int i = 0; i < count; i++) {
+      Source partSource = partSources[i];
+      DartEntry partEntry = AnalysisContextImpl_this._getReadableDartEntry(partSource);
+      if (partEntry != null && partEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) {
+        _ensureResolvableCompilationUnit(partSource, partEntry);
+        pairs.add(new CycleBuilder_SourceEntryPair(partSource, partEntry));
       }
     }
     return pairs;
@@ -6635,7 +6646,7 @@
       internalPerform();
     } on AnalysisException catch (exception) {
       throw exception;
-    } on JavaException catch (exception, stackTrace) {
+    } catch (exception, stackTrace) {
       throw new AnalysisException("Exception", new CaughtException(exception, stackTrace));
     }
   }
@@ -13309,7 +13320,7 @@
       _unit.accept(new RecursiveXmlVisitor_ParseHtmlTask_internalPerform(this, errorListener));
       _errors = errorListener.getErrorsForSource(source);
       _referencedLibraries = librarySources;
-    } on JavaException catch (exception, stackTrace) {
+    } catch (exception, stackTrace) {
       throw new AnalysisException("Exception", new CaughtException(exception, stackTrace));
     }
   }
@@ -14916,7 +14927,7 @@
       _tokenStream = scanner.tokenize();
       _lineInfo = new LineInfo(scanner.lineStarts);
       _errors = errorListener.getErrorsForSource(source);
-    } on JavaException catch (exception, stackTrace) {
+    } catch (exception, stackTrace) {
       throw new AnalysisException("Exception", new CaughtException(exception, stackTrace));
     } finally {
       timeCounterScan.stop();
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index acf9405..94a648b 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -499,6 +499,13 @@
   static const CompileTimeErrorCode CONST_CONSTRUCTOR_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_THROWS_EXCEPTION', 15, "'const' constructors cannot throw exceptions");
 
   /**
+   * 10.6.3 Constant Constructors: It is a compile-time error if a constant constructor is declared
+   * by a class C if any instance variable declared in C is initialized with an expression that is
+   * not a constant expression.
+   */
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST', 16, "Can't define the 'const' constructor because the field '%s' is initialized with a non-constant value");
+
+  /**
    * 7.6.3 Constant Constructors: The superinitializer that appears, explicitly or implicitly, in
    * the initializer list of a constant constructor must specify a constant constructor of the
    * superclass of the immediately enclosing class or a compile-time error occurs.
@@ -506,14 +513,14 @@
    * 9 Mixins: For each generative constructor named ... an implicitly declared constructor named
    * ... is declared.
    */
-  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_MIXIN = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_MIXIN', 16, "Constant constructor cannot be declared for a class with a mixin");
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_MIXIN = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_MIXIN', 17, "Constant constructor cannot be declared for a class with a mixin");
 
   /**
    * 7.6.3 Constant Constructors: The superinitializer that appears, explicitly or implicitly, in
    * the initializer list of a constant constructor must specify a constant constructor of the
    * superclass of the immediately enclosing class or a compile-time error occurs.
    */
-  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER', 17, "Constant constructor cannot call non-constant super constructor of '%s'");
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER', 18, "Constant constructor cannot call non-constant super constructor of '%s'");
 
   /**
    * 7.6.3 Constant Constructors: It is a compile-time error if a constant constructor is declared
@@ -521,12 +528,12 @@
    *
    * The above refers to both locally declared and inherited instance variables.
    */
-  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 18, "Cannot define the 'const' constructor for a class with non-final fields");
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 19, "Cannot define the 'const' constructor for a class with non-final fields");
 
   /**
    * 12.12.2 Const: It is a compile-time error if <i>T</i> is a deferred type.
    */
-  static const CompileTimeErrorCode CONST_DEFERRED_CLASS = const CompileTimeErrorCode.con1('CONST_DEFERRED_CLASS', 19, "Deferred classes cannot be created with 'const'");
+  static const CompileTimeErrorCode CONST_DEFERRED_CLASS = const CompileTimeErrorCode.con1('CONST_DEFERRED_CLASS', 20, "Deferred classes cannot be created with 'const'");
 
   /**
    * 7.6.1 Generative Constructors: In checked mode, it is a dynamic type error if o is not
@@ -539,19 +546,19 @@
    * @param initializerType the name of the type of the initializer expression
    * @param fieldType the name of the type of the field
    */
-  static const CompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE', 20, "The initializer type '%s' cannot be assigned to the field type '%s'");
+  static const CompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE', 21, "The initializer type '%s' cannot be assigned to the field type '%s'");
 
   /**
    * 6.2 Formal Parameters: It is a compile-time error if a formal parameter is declared as a
    * constant variable.
    */
-  static const CompileTimeErrorCode CONST_FORMAL_PARAMETER = const CompileTimeErrorCode.con1('CONST_FORMAL_PARAMETER', 21, "Parameters cannot be 'const'");
+  static const CompileTimeErrorCode CONST_FORMAL_PARAMETER = const CompileTimeErrorCode.con1('CONST_FORMAL_PARAMETER', 22, "Parameters cannot be 'const'");
 
   /**
    * 5 Variables: A constant variable must be initialized to a compile-time constant or a
    * compile-time error occurs.
    */
-  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 22, "'const' variables must be constant value");
+  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 23, "'const' variables must be constant value");
 
   /**
    * 5 Variables: A constant variable must be initialized to a compile-time constant or a
@@ -560,20 +567,20 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY', 23, "Constant values from a deferred library cannot be used to initialized a 'const' variable");
+  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY', 24, "Constant values from a deferred library cannot be used to initialized a 'const' variable");
 
   /**
    * 7.5 Instance Variables: It is a compile-time error if an instance variable is declared to be
    * constant.
    */
-  static const CompileTimeErrorCode CONST_INSTANCE_FIELD = const CompileTimeErrorCode.con1('CONST_INSTANCE_FIELD', 24, "Only static fields can be declared as 'const'");
+  static const CompileTimeErrorCode CONST_INSTANCE_FIELD = const CompileTimeErrorCode.con1('CONST_INSTANCE_FIELD', 25, "Only static fields can be declared as 'const'");
 
   /**
    * 12.8 Maps: It is a compile-time error if the key of an entry in a constant map literal is an
    * instance of a class that implements the operator <i>==</i> unless the key is a string or
    * integer.
    */
-  static const CompileTimeErrorCode CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 25, "The constant map entry key expression type '%s' cannot override the == operator");
+  static const CompileTimeErrorCode CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 26, "The constant map entry key expression type '%s' cannot override the == operator");
 
   /**
    * 5 Variables: A constant variable must be initialized to a compile-time constant (12.1) or a
@@ -581,45 +588,45 @@
    *
    * @param name the name of the uninitialized final variable
    */
-  static const CompileTimeErrorCode CONST_NOT_INITIALIZED = const CompileTimeErrorCode.con1('CONST_NOT_INITIALIZED', 26, "The const variable '%s' must be initialized");
+  static const CompileTimeErrorCode CONST_NOT_INITIALIZED = const CompileTimeErrorCode.con1('CONST_NOT_INITIALIZED', 27, "The const variable '%s' must be initialized");
 
   /**
    * 12.11.2 Const: An expression of one of the forms !e, e1 && e2 or e1 || e2, where e, e1 and e2
    * are constant expressions that evaluate to a boolean value.
    */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL', 27, "An expression of type 'bool' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL', 28, "An expression of type 'bool' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms e1 == e2 or e1 != e2 where e1 and e2 are
    * constant expressions that evaluate to a numeric, string or boolean value or to null.
    */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL_NUM_STRING', 28, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL_NUM_STRING', 29, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms ~e, e1 ^ e2, e1 & e2, e1 | e2, e1 >> e2 or e1
    * << e2, where e, e1 and e2 are constant expressions that evaluate to an integer value or to
    * null.
    */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_INT = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_INT', 29, "An expression of type 'int' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_INT = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_INT', 30, "An expression of type 'int' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms e, e1 + e2, e1 - e2, e1 * e2, e1 / e2, e1 ~/
    * e2, e1 > e2, e1 < e2, e1 >= e2, e1 <= e2 or e1 % e2, where e, e1 and e2 are constant
    * expressions that evaluate to a numeric value or to null..
    */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_NUM = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_NUM', 30, "An expression of type 'num' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_NUM = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_NUM', 31, "An expression of type 'num' was expected");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static const CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_EXCEPTION', 31, "Evaluation of this constant expression causes exception");
+  static const CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_EXCEPTION', 32, "Evaluation of this constant expression causes exception");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static const CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_IDBZE', 32, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
+  static const CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_IDBZE', 33, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
 
   /**
    * 12.11.2 Const: If <i>T</i> is a parameterized type <i>S&lt;U<sub>1</sub>, &hellip;,
@@ -632,7 +639,7 @@
    * @see CompileTimeErrorCode#NEW_WITH_INVALID_TYPE_PARAMETERS
    * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
    */
-  static const CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_INVALID_TYPE_PARAMETERS', 33, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static const CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_INVALID_TYPE_PARAMETERS', 34, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
 
   /**
    * 12.11.2 Const: If <i>e</i> is of the form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
@@ -640,13 +647,13 @@
    * compile-time error if the type <i>T</i> does not declare a constant constructor with the same
    * name as the declaration of <i>T</i>.
    */
-  static const CompileTimeErrorCode CONST_WITH_NON_CONST = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONST', 34, "The constructor being called is not a 'const' constructor");
+  static const CompileTimeErrorCode CONST_WITH_NON_CONST = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONST', 35, "The constructor being called is not a 'const' constructor");
 
   /**
    * 12.11.2 Const: In all of the above cases, it is a compile-time error if <i>a<sub>i</sub>, 1
    * &lt;= i &lt;= n + k</i>, is not a compile-time constant expression.
    */
-  static const CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONSTANT_ARGUMENT', 35, "Arguments of a constant creation must be constant expressions");
+  static const CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONSTANT_ARGUMENT', 36, "Arguments of a constant creation must be constant expressions");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
@@ -659,12 +666,12 @@
    *
    * @param name the name of the non-type element
    */
-  static const CompileTimeErrorCode CONST_WITH_NON_TYPE = const CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 36, "The name '%s' is not a class");
+  static const CompileTimeErrorCode CONST_WITH_NON_TYPE = const CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 37, "The name '%s' is not a class");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> includes any type parameters.
    */
-  static const CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_TYPE_PARAMETERS', 37, "The constant creation cannot use a type parameter");
+  static const CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_TYPE_PARAMETERS', 38, "The constant creation cannot use a type parameter");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
@@ -673,7 +680,7 @@
    * @param typeName the name of the type
    * @param constructorName the name of the requested constant constructor
    */
-  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR', 38, "The class '%s' does not have a constant constructor '%s'");
+  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR', 39, "The class '%s' does not have a constant constructor '%s'");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
@@ -681,32 +688,32 @@
    *
    * @param typeName the name of the type
    */
-  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 39, "The class '%s' does not have a default constant constructor");
+  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 40, "The class '%s' does not have a default constant constructor");
 
   /**
    * 15.3.1 Typedef: It is a compile-time error if any default values are specified in the signature
    * of a function type alias.
    */
-  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 40, "Default values aren't allowed in typedefs");
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 41, "Default values aren't allowed in typedefs");
 
   /**
    * 6.2.1 Required Formals: By means of a function signature that names the parameter and describes
    * its type as a function type. It is a compile-time error if any default values are specified in
    * the signature of such a function type.
    */
-  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER', 41, "Default values aren't allowed in function type parameters");
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER', 42, "Default values aren't allowed in function type parameters");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> explicitly specifies a default value
    * for an optional parameter.
    */
-  static const CompileTimeErrorCode DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR', 42, "Default values aren't allowed in factory constructors that redirect to another constructor");
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR', 43, "Default values aren't allowed in factory constructors that redirect to another constructor");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
    * declared in the same scope.
    */
-  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_DEFAULT', 43, "The default constructor is already defined");
+  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_DEFAULT', 44, "The default constructor is already defined");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
@@ -714,7 +721,7 @@
    *
    * @param duplicateName the name of the duplicate entity
    */
-  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 44, "The constructor with name '%s' is already defined");
+  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 45, "The constructor with name '%s' is already defined");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
@@ -727,7 +734,7 @@
    *
    * @param duplicateName the name of the duplicate entity
    */
-  static const CompileTimeErrorCode DUPLICATE_DEFINITION = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 45, "The name '%s' is already defined");
+  static const CompileTimeErrorCode DUPLICATE_DEFINITION = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 46, "The name '%s' is already defined");
 
   /**
    * 7. Classes: It is a compile-time error if a class has an instance member and a static member
@@ -739,21 +746,21 @@
    * @param name the name of the conflicting members
    * @see #DUPLICATE_DEFINITION
    */
-  static const CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 46, "The name '%s' is already defined in '%s'");
+  static const CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 47, "The name '%s' is already defined in '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a compile-time error if <i>q<sub>i</sub> =
    * q<sub>j</sub></i> for any <i>i != j</i> [where <i>q<sub>i</sub></i> is the label for a named
    * argument].
    */
-  static const CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = const CompileTimeErrorCode.con1('DUPLICATE_NAMED_ARGUMENT', 47, "The argument for the named parameter '%s' was already specified");
+  static const CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = const CompileTimeErrorCode.con1('DUPLICATE_NAMED_ARGUMENT', 48, "The argument for the named parameter '%s' was already specified");
 
   /**
    * SDK implementation libraries can be exported only by other SDK libraries.
    *
    * @param uri the uri pointing to a library
    */
-  static const CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_INTERNAL_LIBRARY', 48, "The library '%s' is internal and cannot be exported");
+  static const CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_INTERNAL_LIBRARY', 49, "The library '%s' is internal and cannot be exported");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -761,12 +768,12 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static const CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_OF_NON_LIBRARY', 49, "The exported library '%s' must not have a part-of directive");
+  static const CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_OF_NON_LIBRARY', 50, "The exported library '%s' must not have a part-of directive");
 
   /**
    * Enum proposal: It is a compile-time error to subclass, mix-in or implement an enum.
    */
-  static const CompileTimeErrorCode EXTENDS_ENUM = const CompileTimeErrorCode.con1('EXTENDS_ENUM', 50, "Classes cannot extend an enum");
+  static const CompileTimeErrorCode EXTENDS_ENUM = const CompileTimeErrorCode.con1('EXTENDS_ENUM', 51, "Classes cannot extend an enum");
 
   /**
    * 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
@@ -774,7 +781,7 @@
    *
    * @param typeName the name of the superclass that was not found
    */
-  static const CompileTimeErrorCode EXTENDS_NON_CLASS = const CompileTimeErrorCode.con1('EXTENDS_NON_CLASS', 51, "Classes can only extend other classes");
+  static const CompileTimeErrorCode EXTENDS_NON_CLASS = const CompileTimeErrorCode.con1('EXTENDS_NON_CLASS', 52, "Classes can only extend other classes");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -793,7 +800,7 @@
    * @param typeName the name of the type that cannot be extended
    * @see #IMPLEMENTS_DISALLOWED_CLASS
    */
-  static const CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DISALLOWED_CLASS', 52, "Classes cannot extend '%s'");
+  static const CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DISALLOWED_CLASS', 53, "Classes cannot extend '%s'");
 
   /**
    * 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
@@ -803,7 +810,7 @@
    * @see #IMPLEMENTS_DEFERRED_CLASS
    * @see #MIXIN_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode EXTENDS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DEFERRED_CLASS', 53, "This class cannot extend the deferred class '%s'");
+  static const CompileTimeErrorCode EXTENDS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DEFERRED_CLASS', 54, "This class cannot extend the deferred class '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -815,21 +822,21 @@
    * @param requiredCount the maximum number of positional arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static const CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = const CompileTimeErrorCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 54, "%d positional arguments expected, but %d found");
+  static const CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = const CompileTimeErrorCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 55, "%d positional arguments expected, but %d found");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if more than one initializer corresponding to a given instance variable appears in
    * <i>k</i>'s list.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 55, "The field '%s' cannot be initialized twice in the same constructor");
+  static const CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 56, "The field '%s' cannot be initialized twice in the same constructor");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if <i>k</i>'s initializer list contains an initializer for a variable that is initialized
    * by means of an initializing formal of <i>k</i>.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 56, "Fields cannot be initialized in both the parameter list and the initializers");
+  static const CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 57, "Fields cannot be initialized in both the parameter list and the initializers");
 
   /**
    * 5 Variables: It is a compile-time error if a final instance variable that has is initialized by
@@ -838,19 +845,19 @@
    *
    * @param name the name of the field in question
    */
-  static const CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = const CompileTimeErrorCode.con1('FINAL_INITIALIZED_MULTIPLE_TIMES', 57, "'%s' is a final field and so can only be set once");
+  static const CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = const CompileTimeErrorCode.con1('FINAL_INITIALIZED_MULTIPLE_TIMES', 58, "'%s' is a final field and so can only be set once");
 
   /**
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 58, "Initializing formal fields cannot be used in factory constructors");
+  static const CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 59, "Initializing formal fields cannot be used in factory constructors");
 
   /**
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 59, "Initializing formal fields can only be used in constructors");
+  static const CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 60, "Initializing formal fields can only be used in constructors");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -859,7 +866,7 @@
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 60, "The redirecting constructor cannot have a field initializer");
+  static const CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 61, "The redirecting constructor cannot have a field initializer");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -867,7 +874,7 @@
    *
    * @param name the conflicting name of the getter and method
    */
-  static const CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = const CompileTimeErrorCode.con1('GETTER_AND_METHOD_WITH_SAME_NAME', 61, "'%s' cannot be used to name a getter, there is already a method with the same name");
+  static const CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = const CompileTimeErrorCode.con1('GETTER_AND_METHOD_WITH_SAME_NAME', 62, "'%s' cannot be used to name a getter, there is already a method with the same name");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
@@ -877,7 +884,7 @@
    * @see #EXTENDS_DEFERRED_CLASS
    * @see #MIXIN_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode IMPLEMENTS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DEFERRED_CLASS', 62, "This class cannot implement the deferred class '%s'");
+  static const CompileTimeErrorCode IMPLEMENTS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DEFERRED_CLASS', 63, "This class cannot implement the deferred class '%s'");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -896,18 +903,18 @@
    * @param typeName the name of the type that cannot be implemented
    * @see #EXTENDS_DISALLOWED_CLASS
    */
-  static const CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DISALLOWED_CLASS', 63, "Classes cannot implement '%s'");
+  static const CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DISALLOWED_CLASS', 64, "Classes cannot implement '%s'");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class includes
    * type dynamic.
    */
-  static const CompileTimeErrorCode IMPLEMENTS_DYNAMIC = const CompileTimeErrorCode.con1('IMPLEMENTS_DYNAMIC', 64, "Classes cannot implement 'dynamic'");
+  static const CompileTimeErrorCode IMPLEMENTS_DYNAMIC = const CompileTimeErrorCode.con1('IMPLEMENTS_DYNAMIC', 65, "Classes cannot implement 'dynamic'");
 
   /**
    * Enum proposal: It is a compile-time error to subclass, mix-in or implement an enum.
    */
-  static const CompileTimeErrorCode IMPLEMENTS_ENUM = const CompileTimeErrorCode.con1('IMPLEMENTS_ENUM', 65, "Classes cannot implement an enum");
+  static const CompileTimeErrorCode IMPLEMENTS_ENUM = const CompileTimeErrorCode.con1('IMPLEMENTS_ENUM', 66, "Classes cannot implement an enum");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
@@ -916,7 +923,7 @@
    *
    * @param typeName the name of the interface that was not found
    */
-  static const CompileTimeErrorCode IMPLEMENTS_NON_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_NON_CLASS', 66, "Classes can only implement other classes");
+  static const CompileTimeErrorCode IMPLEMENTS_NON_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_NON_CLASS', 67, "Classes can only implement other classes");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if a type <i>T</i> appears more than once in
@@ -924,7 +931,7 @@
    *
    * @param className the name of the class that is implemented more than once
    */
-  static const CompileTimeErrorCode IMPLEMENTS_REPEATED = const CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 67, "'%s' can only be implemented once");
+  static const CompileTimeErrorCode IMPLEMENTS_REPEATED = const CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 68, "'%s' can only be implemented once");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the superclass of a class <i>C</i> appears
@@ -932,7 +939,7 @@
    *
    * @param className the name of the class that appears in both "extends" and "implements" clauses
    */
-  static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_SUPER_CLASS', 68, "'%s' cannot be used in both 'extends' and 'implements' clauses");
+  static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_SUPER_CLASS', 69, "'%s' cannot be used in both 'extends' and 'implements' clauses");
 
   /**
    * 7.6.1 Generative Constructors: Note that <b>this</b> is not in scope on the right hand side of
@@ -944,14 +951,14 @@
    *
    * @param name the name of the type in question
    */
-  static const CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = const CompileTimeErrorCode.con1('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 69, "Only static members can be accessed in initializers");
+  static const CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = const CompileTimeErrorCode.con1('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 70, "Only static members can be accessed in initializers");
 
   /**
    * SDK implementation libraries can be imported only by other SDK libraries.
    *
    * @param uri the uri pointing to a library
    */
-  static const CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_INTERNAL_LIBRARY', 70, "The library '%s' is internal and cannot be imported");
+  static const CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_INTERNAL_LIBRARY', 71, "The library '%s' is internal and cannot be imported");
 
   /**
    * 14.1 Imports: It is a compile-time error if the specified URI of an immediate import does not
@@ -960,7 +967,7 @@
    * @param uri the uri pointing to a non-library declaration
    * @see StaticWarningCode#IMPORT_OF_NON_LIBRARY
    */
-  static const CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_OF_NON_LIBRARY', 71, "The imported library '%s' must not have a part-of directive");
+  static const CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_OF_NON_LIBRARY', 72, "The imported library '%s' must not have a part-of directive");
 
   /**
    * 13.9 Switch: It is a compile-time error if values of the expressions <i>e<sub>k</sub></i> are
@@ -969,7 +976,7 @@
    * @param expressionSource the expression source code that is the unexpected type
    * @param expectedType the name of the expected type
    */
-  static const CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES = const CompileTimeErrorCode.con1('INCONSISTENT_CASE_EXPRESSION_TYPES', 72, "Case expressions must have the same types, '%s' is not a '%s'");
+  static const CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES = const CompileTimeErrorCode.con1('INCONSISTENT_CASE_EXPRESSION_TYPES', 73, "Case expressions must have the same types, '%s' is not a '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
@@ -980,7 +987,7 @@
    *          immediately enclosing class
    * @see #INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD
    */
-  static const CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_NON_EXISTANT_FIELD', 73, "'%s' is not a variable in the enclosing class");
+  static const CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_NON_EXISTANT_FIELD', 74, "'%s' is not a variable in the enclosing class");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
@@ -991,7 +998,7 @@
    *          enclosing class
    * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
    */
-  static const CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_STATIC_FIELD', 74, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+  static const CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_STATIC_FIELD', 75, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -1003,7 +1010,7 @@
    * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
    * @see #INITIALIZER_FOR_NON_EXISTANT_FIELD
    */
-  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD', 75, "'%s' is not a variable in the enclosing class");
+  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD', 76, "'%s' is not a variable in the enclosing class");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -1014,32 +1021,32 @@
    *          enclosing class
    * @see #INITIALIZER_FOR_STATIC_FIELD
    */
-  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 76, "'%s' is a static field in the enclosing class, fields initialized in a constructor cannot be static");
+  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 77, "'%s' is a static field in the enclosing class, fields initialized in a constructor cannot be static");
 
   /**
    * 12.30 Identifier Reference: Otherwise, e is equivalent to the property extraction
    * <b>this</b>.<i>id</i>.
    */
-  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_FACTORY = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_FACTORY', 77, "Instance members cannot be accessed from a factory constructor");
+  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_FACTORY = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_FACTORY', 78, "Instance members cannot be accessed from a factory constructor");
 
   /**
    * 12.30 Identifier Reference: Otherwise, e is equivalent to the property extraction
    * <b>this</b>.<i>id</i>.
    */
-  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 78, "Instance members cannot be accessed from a static method");
+  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 79, "Instance members cannot be accessed from a static method");
 
   /**
    * Enum proposal: It is also a compile-time error to explicitly instantiate an enum via 'new' or
    * 'const' or to access its private fields.
    */
-  static const CompileTimeErrorCode INSTANTIATE_ENUM = const CompileTimeErrorCode.con1('INSTANTIATE_ENUM', 79, "Enums cannot be instantiated");
+  static const CompileTimeErrorCode INSTANTIATE_ENUM = const CompileTimeErrorCode.con1('INSTANTIATE_ENUM', 80, "Enums cannot be instantiated");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode.con1('INVALID_ANNOTATION', 80, "Annotation can be only constant variable or constant constructor invocation");
+  static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode.con1('INVALID_ANNOTATION', 81, "Annotation can be only constant variable or constant constructor invocation");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
@@ -1049,7 +1056,7 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY', 81, "Constant values from a deferred library cannot be used as annotations");
+  static const CompileTimeErrorCode INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY', 82, "Constant values from a deferred library cannot be used as annotations");
 
   /**
    * TODO(brianwilkerson) Remove this when we have decided on how to report errors in compile-time
@@ -1057,26 +1064,26 @@
    *
    * See TODOs in ConstantVisitor
    */
-  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 82, "Invalid constant value");
+  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 83, "Invalid constant value");
 
   /**
    * 7.6 Constructors: It is a compile-time error if the name of a constructor is not a constructor
    * name.
    */
-  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 83, "Invalid constructor name");
+  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 84, "Invalid constructor name");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>M</i> is not the name of the immediately
    * enclosing class.
    */
-  static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = const CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 84, "The name of the immediately enclosing class expected");
+  static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = const CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 85, "The name of the immediately enclosing class expected");
 
   /**
    * 12.10 This: It is a compile-time error if this appears in a top-level function or variable
    * initializer, in a factory constructor, or in a static method or variable initializer, or in the
    * initializer of an instance variable.
    */
-  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 85, "Invalid reference to 'this' expression");
+  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 86, "Invalid reference to 'this' expression");
 
   /**
    * 12.6 Lists: It is a compile time error if the type argument of a constant list literal includes
@@ -1084,7 +1091,7 @@
    *
    * @name the name of the type parameter
    */
-  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 86, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 87, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
 
   /**
    * 12.7 Maps: It is a compile time error if the type arguments of a constant map literal include a
@@ -1092,7 +1099,7 @@
    *
    * @name the name of the type parameter
    */
-  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 87, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 88, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1107,7 +1114,7 @@
    * @param uri the URI that is invalid
    * @see #URI_DOES_NOT_EXIST
    */
-  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 88, "Invalid URI syntax: '%s'");
+  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 89, "Invalid URI syntax: '%s'");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1118,7 +1125,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 89, "Cannot reference label '%s' declared in an outer method");
+  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 90, "Cannot reference label '%s' declared in an outer method");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1129,7 +1136,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 90, "Cannot reference undefined label '%s'");
+  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 91, "Cannot reference undefined label '%s'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
@@ -1143,7 +1150,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 91, "The element type '%s' cannot be assigned to the list type '%s'");
+  static const CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 92, "The element type '%s' cannot be assigned to the list type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1157,7 +1164,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 92, "The element type '%s' cannot be assigned to the map key type '%s'");
+  static const CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 93, "The element type '%s' cannot be assigned to the map key type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1171,13 +1178,13 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 93, "The element type '%s' cannot be assigned to the map value type '%s'");
+  static const CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 94, "The element type '%s' cannot be assigned to the map value type '%s'");
 
   /**
    * 7 Classes: It is a compile time error if a class <i>C</i> declares a member with the same name
    * as <i>C</i>.
    */
-  static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = const CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 94, "Class members cannot have the same name as the enclosing class");
+  static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = const CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 95, "Class members cannot have the same name as the enclosing class");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -1185,17 +1192,17 @@
    *
    * @param name the conflicting name of the getter and method
    */
-  static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = const CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 95, "'%s' cannot be used to name a method, there is already a getter with the same name");
+  static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = const CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 96, "'%s' cannot be used to name a method, there is already a getter with the same name");
 
   /**
    * 12.1 Constants: A constant expression is ... a constant list literal.
    */
-  static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 96, "List literals must be prefixed with 'const' when used as a constant expression");
+  static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 97, "List literals must be prefixed with 'const' when used as a constant expression");
 
   /**
    * 12.1 Constants: A constant expression is ... a constant map literal.
    */
-  static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 97, "Map literals must be prefixed with 'const' when used as a constant expression");
+  static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 98, "Map literals must be prefixed with 'const' when used as a constant expression");
 
   /**
    * Enum proposal: It is a static warning if all of the following conditions hold:
@@ -1207,7 +1214,7 @@
    *
    * @param constantName the name of the constant that is missing
    */
-  static const CompileTimeErrorCode MISSING_ENUM_CONSTANT_IN_SWITCH = const CompileTimeErrorCode.con2('MISSING_ENUM_CONSTANT_IN_SWITCH', 98, "Missing case clause for '%s'", "Add a case clause for the missing constant or add a default clause.");
+  static const CompileTimeErrorCode MISSING_ENUM_CONSTANT_IN_SWITCH = const CompileTimeErrorCode.con2('MISSING_ENUM_CONSTANT_IN_SWITCH', 99, "Missing case clause for '%s'", "Add a case clause for the missing constant or add a default clause.");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin explicitly declares a
@@ -1215,7 +1222,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 99, "The class '%s' cannot be used as a mixin because it declares a constructor");
+  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 100, "The class '%s' cannot be used as a mixin because it declares a constructor");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if the with clause of a mixin application
@@ -1225,7 +1232,7 @@
    * @see #EXTENDS_DEFERRED_CLASS
    * @see #IMPLEMENTS_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 100, "This class cannot mixin the deferred class '%s'");
+  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 101, "This class cannot mixin the deferred class '%s'");
 
   /**
    * 9 Mixins: It is a compile-time error if a mixin is derived from a class whose superclass is not
@@ -1233,7 +1240,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = const CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 101, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
+  static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = const CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 102, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -1252,48 +1259,48 @@
    * @param typeName the name of the type that cannot be extended
    * @see #IMPLEMENTS_DISALLOWED_CLASS
    */
-  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 102, "Classes cannot mixin '%s'");
+  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 103, "Classes cannot mixin '%s'");
 
   /**
    * Enum proposal: It is a compile-time error to subclass, mix-in or implement an enum.
    */
-  static const CompileTimeErrorCode MIXIN_OF_ENUM = const CompileTimeErrorCode.con1('MIXIN_OF_ENUM', 103, "Classes cannot mixin an enum");
+  static const CompileTimeErrorCode MIXIN_OF_ENUM = const CompileTimeErrorCode.con1('MIXIN_OF_ENUM', 104, "Classes cannot mixin an enum");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if <i>M</i> does not denote a class or mixin
    * available in the immediately enclosing scope.
    */
-  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 104, "Classes can only mixin other classes");
+  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 105, "Classes can only mixin other classes");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin refers to super.
    */
-  static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER = const CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 105, "The class '%s' cannot be used as a mixin because it references 'super'");
+  static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER = const CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 106, "The class '%s' cannot be used as a mixin because it references 'super'");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if <i>S</i> does not denote a class available
    * in the immediately enclosing scope.
    */
-  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 106, "Mixin can only be applied to class");
+  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 107, "Mixin can only be applied to class");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 107, "Constructor may have at most one 'this' redirection");
+  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 108, "Constructor may have at most one 'this' redirection");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. Then <i>k</i> may
    * include at most one superinitializer in its initializer list or a compile time error occurs.
    */
-  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 108, "Constructor may have at most one 'super' initializer");
+  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 109, "Constructor may have at most one 'super' initializer");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 109, "Annotation creation must have arguments");
+  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 110, "Annotation creation must have arguments");
 
   /**
    * 7.6.1 Generative Constructors: If no superinitializer is provided, an implicit superinitializer
@@ -1303,7 +1310,7 @@
    * 7.6.1 Generative constructors. It is 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 const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 110, "The class '%s' does not have a default constructor");
+  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 111, "The class '%s' does not have a default constructor");
 
   /**
    * 7.6 Constructors: Iff no constructor is specified for a class <i>C</i>, it implicitly has a
@@ -1312,13 +1319,13 @@
    * 7.6.1 Generative constructors. It is 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 const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 111, "The class '%s' does not have a default constructor");
+  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 112, "The class '%s' does not have a default constructor");
 
   /**
    * 13.2 Expression Statements: It is a compile-time error if a non-constant map literal that has
    * no explicit type arguments appears in a place where a statement is expected.
    */
-  static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = const CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 112, "A non-constant map literal without type arguments cannot be used as an expression statement");
+  static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = const CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 113, "A non-constant map literal without type arguments cannot be used as an expression statement");
 
   /**
    * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
@@ -1329,7 +1336,7 @@
    * s<sub>n</sub>}</i>, it is a compile-time error if the expressions <i>e<sub>k</sub></i> are not
    * compile-time constants, for all <i>1 &lt;= k &lt;= n</i>.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 113, "Case expressions must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 114, "Case expressions must be constant");
 
   /**
    * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
@@ -1343,13 +1350,13 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY', 114, "Constant values from a deferred library cannot be used as a case expression");
+  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY', 115, "Constant values from a deferred library cannot be used as a case expression");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
    * parameter is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 115, "Default values of an optional parameter must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 116, "Default values of an optional parameter must be constant");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
@@ -1358,13 +1365,13 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY', 116, "Constant values from a deferred library cannot be used as a default parameter value");
+  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY', 117, "Constant values from a deferred library cannot be used as a default parameter value");
 
   /**
    * 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
    * compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 117, "'const' lists must have all constant values");
+  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 118, "'const' lists must have all constant values");
 
   /**
    * 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
@@ -1373,13 +1380,13 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY', 118, "Constant values from a deferred library cannot be used as values in a 'const' list");
+  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY', 119, "Constant values from a deferred library cannot be used as values in a 'const' list");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
    * literal is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 119, "The keys in a map must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 120, "The keys in a map must be constant");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
@@ -1388,13 +1395,13 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY', 120, "Constant values from a deferred library cannot be used as keys in a map");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY', 121, "Constant values from a deferred library cannot be used as keys in a map");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
    * literal is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 121, "The values in a 'const' map must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 122, "The values in a 'const' map must be constant");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
@@ -1403,7 +1410,7 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY', 122, "Constant values from a deferred library cannot be used as values in a 'const' map");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY', 123, "Constant values from a deferred library cannot be used as values in a 'const' map");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
@@ -1413,13 +1420,13 @@
    * "From deferred library" case is covered by
    * [CompileTimeErrorCode#INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY].
    */
-  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 123, "Annotation creation can use only 'const' constructor");
+  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 124, "Annotation creation can use only 'const' constructor");
 
   /**
    * 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
    * constant constructor must be a potentially constant expression, or a compile-time error occurs.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 124, "Initializer expressions in constant constructors must be constants");
+  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 125, "Initializer expressions in constant constructors must be constants");
 
   /**
    * 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
@@ -1428,7 +1435,7 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY', 125, "Constant values from a deferred library cannot be used as constant initializers");
+  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY', 126, "Constant values from a deferred library cannot be used as constant initializers");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
@@ -1439,7 +1446,7 @@
    * @param requiredCount the expected number of required arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 126, "%d required argument(s) expected, but %d found");
+  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 127, "%d required argument(s) expected, but %d found");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1447,17 +1454,17 @@
    * 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 const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 127, "The generative constructor '%s' expected, but factory found");
+  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 128, "The generative constructor '%s' expected, but factory found");
 
   /**
    * 7.9 Superclasses: It is a compile-time error to specify an extends clause for class Object.
    */
-  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 128, "");
+  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 129, "");
 
   /**
    * 7.1.1 Operators: It is a compile-time error to declare an optional parameter in an operator.
    */
-  static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 129, "Optional parameters are not allowed when defining an operator");
+  static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 130, "Optional parameters are not allowed when defining an operator");
 
   /**
    * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
@@ -1465,25 +1472,25 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 130, "The included part '%s' must have a part-of directive");
+  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 131, "The included part '%s' must have a part-of directive");
 
   /**
    * 14.1 Imports: It is a compile-time error if the current library declares a top-level member
    * named <i>p</i>.
    */
-  static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = const CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 131, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
+  static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = const CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 132, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the name of a named optional parameter
    * begins with an '_' character.
    */
-  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 132, "Named optional parameters cannot start with an underscore");
+  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 133, "Named optional parameters cannot start with an underscore");
 
   /**
    * 12.1 Constants: It is a compile-time error if the value of a compile-time constant expression
    * depends on itself.
    */
-  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 133, "");
+  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 134, "");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -1494,13 +1501,13 @@
    *
    * https://code.google.com/p/dart/issues/detail?id=954
    */
-  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 134, "Cycle in redirecting generative constructors");
+  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 135, "Cycle in redirecting generative constructors");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if a redirecting factory constructor redirects to
    * itself, either directly or indirectly via a sequence of redirections.
    */
-  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 135, "Cycle in redirecting factory constructors");
+  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 136, "Cycle in redirecting factory constructors");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1513,7 +1520,7 @@
    * @param className the name of the class that implements itself recursively
    * @param strImplementsPath a string representation of the implements loop
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 136, "'%s' cannot be a superinterface of itself: %s");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 137, "'%s' cannot be a superinterface of itself: %s");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1525,7 +1532,7 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 137, "'%s' cannot extend itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 138, "'%s' cannot extend itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1537,7 +1544,7 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 138, "'%s' cannot implement itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 139, "'%s' cannot implement itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1549,61 +1556,61 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH', 139, "'%s' cannot use itself as a mixin");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH', 140, "'%s' cannot use itself as a mixin");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 140, "The constructor '%s' could not be found in '%s'");
+  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 141, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 141, "The name '%s' is not a type and cannot be used in a redirected constructor");
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 142, "The name '%s' is not a type and cannot be used in a redirected constructor");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 142, "Constant factory constructor cannot delegate to a non-constant constructor");
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 143, "Constant factory constructor cannot delegate to a non-constant constructor");
 
   /**
    * 7.6.1 Generative constructors: A generative constructor may be <i>redirecting</i>, in which
    * case its only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR', 143, "The constructor '%s' could not be found in '%s'");
+  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR', 144, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.1 Generative constructors: A generative constructor may be <i>redirecting</i>, in which
    * case its only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR', 144, "Generative constructor cannot redirect to a factory constructor");
+  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR', 145, "Generative constructor cannot redirect to a factory constructor");
 
   /**
    * 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 const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 145, "Local variables cannot be referenced before they are declared");
+  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 146, "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 const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 146, "rethrow must be inside of a catch clause");
+  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 147, "rethrow must be inside of a catch clause");
 
   /**
    * 13.12 Return: It is a compile-time error if a return statement of the form <i>return e;</i>
    * appears in a generative constructor.
    */
-  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 147, "Constructors cannot return a value");
+  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 148, "Constructors cannot return a value");
 
   /**
    * 14.1 Imports: It is a compile-time error if a prefix used in a deferred import is used in
    * another import clause.
    */
-  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 148, "The prefix of a deferred import cannot be used in other import directives");
+  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 149, "The prefix of a deferred import cannot be used in other import directives");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -1613,19 +1620,19 @@
    * initializer list, in class Object, in a factory constructor, or in a static method or variable
    * initializer.
    */
-  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 149, "Invalid context for 'super' invocation");
+  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 150, "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 const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 150, "The redirecting constructor cannot have a 'super' initializer");
+  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 151, "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 const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 151, "");
+  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 152, "");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -1644,19 +1651,19 @@
    * @param boundingTypeName the name of the bounding type
    * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
-  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 152, "'%s' does not extend '%s'");
+  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 153, "'%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 const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 153, "Type alias cannot reference itself directly or recursively via another typedef");
+  static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 154, "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 const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 154, "Undefined class '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 155, "Undefined class '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1664,7 +1671,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 const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 155, "The class '%s' does not have a generative constructor '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 156, "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
@@ -1672,7 +1679,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 const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 156, "The class '%s' does not have a default generative constructor");
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 157, "The class '%s' does not have a default generative constructor");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -1684,7 +1691,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 157, "The named parameter '%s' is not defined");
+  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 158, "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
@@ -1699,7 +1706,7 @@
    * @param uri the URI pointing to a non-existent file
    * @see #INVALID_URI
    */
-  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 158, "Target of URI does not exist: '%s'");
+  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 159, "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
@@ -1711,7 +1718,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 const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 159, "URIs cannot use string interpolation");
+  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 160, "URIs cannot use string interpolation");
 
   /**
    * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator []= is
@@ -1724,7 +1731,7 @@
    * @param expectedNumberOfParameters the number of parameters expected
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 160, "Operator '%s' should declare exactly %d parameter(s), but %d found");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 161, "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
@@ -1732,13 +1739,13 @@
    *
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 161, "Operator '-' should declare 0 or 1 parameter, but %d found");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 162, "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 const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 162, "Setters should declare exactly one required parameter");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 163, "Setters should declare exactly one required parameter");
 
   static const List<CompileTimeErrorCode> values = const [
       ACCESS_PRIVATE_ENUM_FIELD,
@@ -1757,6 +1764,7 @@
       CONFLICTING_TYPE_VARIABLE_AND_CLASS,
       CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
       CONST_CONSTRUCTOR_THROWS_EXCEPTION,
+      CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST,
       CONST_CONSTRUCTOR_WITH_MIXIN,
       CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
       CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index e7da1e0..129168f 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -1301,7 +1301,7 @@
         }
       } on InsufficientContextException catch (exception) {
         advanceToParent = true;
-      } on JavaException catch (exception) {
+      } catch (exception) {
         return null;
       }
       if (advanceToParent) {
@@ -4109,7 +4109,7 @@
         // long term approach.
         return null;
       }
-    } on JavaException catch (exception) {
+    } catch (exception) {
     }
     return null;
   }
@@ -6214,6 +6214,8 @@
         string = andAdvance;
         hasMore = _matches(TokenType.STRING_INTERPOLATION_EXPRESSION) || _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER);
         elements.add(new InterpolationString(string, _computeStringValue(string.lexeme, false, !hasMore)));
+      } else {
+        hasMore = false;
       }
     }
     return new StringInterpolation(elements);
@@ -6340,6 +6342,8 @@
       }
     } else if (_currentToken.isOperator) {
       components.add(andAdvance);
+    } else if (_tokenMatchesKeyword(_currentToken, Keyword.VOID)) {
+      components.add(andAdvance);
     } else {
       _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []);
       components.add(_createSyntheticToken(TokenType.IDENTIFIER));
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 6d39b3b..239522b 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1386,7 +1386,8 @@
   @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     if (node.constKeyword != null) {
-      _validateInitializers(node);
+      _validateConstructorInitializers(node);
+      _validateFieldInitializers(node.parent as ClassDeclaration, node);
     }
     _validateDefaultValues(node.parameters);
     return super.visitConstructorDeclaration(node);
@@ -1651,6 +1652,31 @@
   }
 
   /**
+   * Validates that the expressions of the given initializers (of a constant constructor) are all
+   * compile time constants.
+   *
+   * @param constructor the constant constructor declaration to validate
+   */
+  void _validateConstructorInitializers(ConstructorDeclaration constructor) {
+    List<ParameterElement> parameterElements = constructor.parameters.parameterElements;
+    NodeList<ConstructorInitializer> initializers = constructor.initializers;
+    for (ConstructorInitializer initializer in initializers) {
+      if (initializer is ConstructorFieldInitializer) {
+        ConstructorFieldInitializer fieldInitializer = initializer;
+        _validateInitializerExpression(parameterElements, fieldInitializer.expression);
+      }
+      if (initializer is RedirectingConstructorInvocation) {
+        RedirectingConstructorInvocation invocation = initializer;
+        _validateInitializerInvocationArguments(parameterElements, invocation.argumentList);
+      }
+      if (initializer is SuperConstructorInvocation) {
+        SuperConstructorInvocation invocation = initializer;
+        _validateInitializerInvocationArguments(parameterElements, invocation.argumentList);
+      }
+    }
+  }
+
+  /**
    * Validate that the default value associated with each of the parameters in the given list is a
    * compile time constant.
    *
@@ -1677,6 +1703,34 @@
   }
 
   /**
+   * Validates that the expressions of any field initializers in the class declaration are all
+   * compile time constants. Since this is only required if the class has a constant constructor,
+   * the error is reported at the constructor site.
+   *
+   * @param classDeclaration the class which should be validated
+   * @param errorSite the site at which errors should be reported.
+   */
+  void _validateFieldInitializers(ClassDeclaration classDeclaration, ConstructorDeclaration errorSite) {
+    NodeList<ClassMember> members = classDeclaration.members;
+    for (ClassMember member in members) {
+      if (member is FieldDeclaration) {
+        FieldDeclaration fieldDeclaration = member;
+        if (!fieldDeclaration.isStatic) {
+          for (VariableDeclaration variableDeclaration in fieldDeclaration.fields.variables) {
+            Expression initializer = variableDeclaration.initializer;
+            if (initializer != null) {
+              EvaluationResultImpl result = initializer.accept(new ConstantVisitor.con1(_typeProvider));
+              if (result is! ValidResult) {
+                _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST, errorSite, [variableDeclaration.name.name]);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  /**
    * Validates that the given expression is a compile time constant.
    *
    * @param parameterElements the elements of parameters of constant constructor, they are
@@ -1708,31 +1762,6 @@
   }
 
   /**
-   * Validates that the expressions of the given initializers (of a constant constructor) are all
-   * compile time constants.
-   *
-   * @param constructor the constant constructor declaration to validate
-   */
-  void _validateInitializers(ConstructorDeclaration constructor) {
-    List<ParameterElement> parameterElements = constructor.parameters.parameterElements;
-    NodeList<ConstructorInitializer> initializers = constructor.initializers;
-    for (ConstructorInitializer initializer in initializers) {
-      if (initializer is ConstructorFieldInitializer) {
-        ConstructorFieldInitializer fieldInitializer = initializer;
-        _validateInitializerExpression(parameterElements, fieldInitializer.expression);
-      }
-      if (initializer is RedirectingConstructorInvocation) {
-        RedirectingConstructorInvocation invocation = initializer;
-        _validateInitializerInvocationArguments(parameterElements, invocation.argumentList);
-      }
-      if (initializer is SuperConstructorInvocation) {
-        SuperConstructorInvocation invocation = initializer;
-        _validateInitializerInvocationArguments(parameterElements, invocation.argumentList);
-      }
-    }
-  }
-
-  /**
    * Validate that if the passed instance creation is 'const' then all its arguments are constant
    * expressions.
    *
@@ -3859,7 +3888,7 @@
         }
       }
       holder.validate();
-    } on JavaException catch (ex) {
+    } catch (ex) {
       if (node.name.staticElement == null) {
         ClassDeclaration classNode = node.getAncestor((node) => node is ClassDeclaration);
         JavaStringBuilder builder = new JavaStringBuilder();
@@ -15286,7 +15315,7 @@
    * @param errorListener the listener that is to be informed when an error is encountered
    */
   LibraryImportScope(this._definingLibrary, this.errorListener) {
-    _createImportedNamespaces(_definingLibrary);
+    _createImportedNamespaces();
   }
 
   @override
@@ -15302,7 +15331,8 @@
     if (foundElement != null) {
       return foundElement;
     }
-    for (Namespace nameSpace in _importedNamespaces) {
+    for (int i = 0; i < _importedNamespaces.length; i++) {
+      Namespace nameSpace = _importedNamespaces[i];
       Element element = nameSpace.get(name);
       if (element != null) {
         if (foundElement == null) {
@@ -15321,7 +15351,7 @@
       int count = conflictingMembers.length;
       List<String> libraryNames = new List<String>(count);
       for (int i = 0; i < count; i++) {
-        libraryNames[i] = _getLibraryName(conflictingMembers[i], "");
+        libraryNames[i] = _getLibraryName(conflictingMembers[i]);
       }
       libraryNames.sort();
       errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.AMBIGUOUS_IMPORT, [
@@ -15342,9 +15372,9 @@
    * @param definingLibrary the element representing the library that imports the libraries for
    *          which namespaces will be created
    */
-  void _createImportedNamespaces(LibraryElement definingLibrary) {
+  void _createImportedNamespaces() {
     NamespaceBuilder builder = new NamespaceBuilder();
-    List<ImportElement> imports = definingLibrary.imports;
+    List<ImportElement> imports = _definingLibrary.imports;
     int count = imports.length;
     _importedNamespaces = new List<Namespace>(count);
     for (int i = 0; i < count; i++) {
@@ -15356,18 +15386,47 @@
    * Returns the name of the library that defines given element.
    *
    * @param element the element to get library name
-   * @param def the default name to use
    * @return the name of the library that defines given element
    */
-  String _getLibraryName(Element element, String def) {
+  String _getLibraryName(Element element) {
     if (element == null) {
-      return def;
+      return StringUtilities.EMPTY;
     }
     LibraryElement library = element.library;
     if (library == null) {
-      return def;
+      return StringUtilities.EMPTY;
     }
-    return library.definingCompilationUnit.displayName;
+    List<ImportElement> imports = _definingLibrary.imports;
+    int count = imports.length;
+    for (int i = 0; i < count; i++) {
+      if (identical(imports[i].importedLibrary, library)) {
+        return library.definingCompilationUnit.displayName;
+      }
+    }
+    List<String> indirectSources = new List<String>();
+    for (int i = 0; i < count; i++) {
+      LibraryElement importedLibrary = imports[i].importedLibrary;
+      for (LibraryElement exportedLibrary in importedLibrary.exportedLibraries) {
+        if (identical(exportedLibrary, library)) {
+          indirectSources.add(importedLibrary.definingCompilationUnit.displayName);
+        }
+      }
+    }
+    int indirectCount = indirectSources.length;
+    JavaStringBuilder builder = new JavaStringBuilder();
+    builder.append(library.definingCompilationUnit.displayName);
+    if (indirectCount > 0) {
+      builder.append(" (via ");
+      if (indirectCount > 1) {
+        List<String> indirectNames = new List.from(indirectSources);
+        indirectNames.sort();
+        builder.append(StringUtilities.printListOfQuotedNames(indirectNames));
+      } else {
+        builder.append(indirectSources[0]);
+      }
+      builder.append(")");
+    }
+    return builder.toString();
   }
 
   /**
@@ -15393,8 +15452,8 @@
       }
     }
     if (sdkElement != null && to > 0) {
-      String sdkLibName = _getLibraryName(sdkElement, "");
-      String otherLibName = _getLibraryName(conflictingMembers[0], "");
+      String sdkLibName = _getLibraryName(sdkElement);
+      String otherLibName = _getLibraryName(conflictingMembers[0]);
       errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.CONFLICTING_DART_IMPORT, [name, sdkLibName, otherLibName]));
     }
     if (to == length) {
@@ -22976,8 +23035,22 @@
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     super.visitConstructorDeclaration(node);
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
-    if (element != null) {
-      // TODO(brianwilkerson) Figure out how the element could ever be null.
+    if (element == null) {
+      ClassDeclaration classNode = node.getAncestor((node) => node is ClassDeclaration);
+      JavaStringBuilder builder = new JavaStringBuilder();
+      builder.append("The element for the constructor ");
+      builder.append(node.name == null ? "<unnamed>" : node.name.name);
+      builder.append(" in ");
+      if (classNode == null) {
+        builder.append("<unknown class>");
+      } else {
+        builder.append(classNode.name.name);
+      }
+      builder.append(" in ");
+      builder.append(source.fullName);
+      builder.append(" was not set while trying to resolve types.");
+      AnalysisEngine.instance.logger.logError2(builder.toString(), new AnalysisException());
+    } else {
       ClassElement definingClass = element.enclosingElement as ClassElement;
       element.returnType = definingClass.type;
       FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
@@ -23036,6 +23109,15 @@
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     super.visitFunctionDeclaration(node);
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
+    if (element == null) {
+      JavaStringBuilder builder = new JavaStringBuilder();
+      builder.append("The element for the top-level function ");
+      builder.append(node.name);
+      builder.append(" in ");
+      builder.append(source.fullName);
+      builder.append(" was not set while trying to resolve types.");
+      AnalysisEngine.instance.logger.logError2(builder.toString(), new AnalysisException());
+    }
     element.returnType = _computeReturnType(node.returnType);
     FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
     ClassElement definingClass = element.getAncestor((element) => element is ClassElement);
@@ -23071,18 +23153,17 @@
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
     if (element == null) {
       ClassDeclaration classNode = node.getAncestor((node) => node is ClassDeclaration);
-      ClassElement classElement = classNode.element;
       JavaStringBuilder builder = new JavaStringBuilder();
       builder.append("The element for the method ");
-      builder.append(node.name);
+      builder.append(node.name.name);
       builder.append(" in ");
-      builder.append(classNode.name);
-      builder.append(" in ");
-      if (classElement != null) {
-        builder.append(classElement.source.fullName);
+      if (classNode == null) {
+        builder.append("<unknown class>");
       } else {
-        builder.append("<element from class also not resolved>");
+        builder.append(classNode.name.name);
       }
+      builder.append(" in ");
+      builder.append(source.fullName);
       builder.append(" was not set while trying to resolve types.");
       AnalysisEngine.instance.logger.logError2(builder.toString(), new AnalysisException());
     }
diff --git a/pkg/analyzer/lib/src/generated/sdk_io.dart b/pkg/analyzer/lib/src/generated/sdk_io.dart
index 64dbef6..c0b353d 100644
--- a/pkg/analyzer/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer/lib/src/generated/sdk_io.dart
@@ -437,7 +437,7 @@
     try {
       String contents = librariesFile.readAsStringSync();
       return new SdkLibrariesReader(useDart2jsPaths).readFromFile(librariesFile, contents);
-    } on JavaException catch (exception) {
+    } catch (exception) {
       AnalysisEngine.instance.logger.logError2("Could not initialize the library map from ${librariesFile.getAbsolutePath()}", exception);
       return new LibraryMap();
     }
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 5e410f9..0e682bf 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -543,7 +543,7 @@
         }
       }
       throw new IllegalArgumentException("No resolver for kind: ${kind}");
-    } on JavaException catch (exception) {
+    } catch (exception) {
       throw new IllegalArgumentException("Invalid URI in encoding");
     }
   }
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index 01c6fbf..08c4677 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -158,7 +158,7 @@
     try {
       Uri resolvedUri = file.toURI().resolveUri(containedUri);
       return new FileBasedSource.con2(new JavaFile.fromUri(resolvedUri), uriKind);
-    } on JavaException catch (exception) {
+    } catch (exception) {
     }
     return null;
   }
@@ -387,7 +387,7 @@
                 String relPath = sourcePath.substring(pkgCanonicalPath.length);
                 return parseUriWithException("${PACKAGE_SCHEME}:${pkgFolder.getName()}${relPath}");
               }
-            } on JavaException catch (e) {
+            } catch (e) {
             }
           }
         }
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index 288eb14..8820276 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -3536,7 +3536,7 @@
       InterfaceType argumentType = ElementFactory.classElement2("B", []).type;
       type.substitute2(<DartType> [argumentType], <DartType> []);
       JUnitTestCase.fail("Expected to encounter exception, argument and parameter type array lengths not equal.");
-    } on JavaException catch (e) {
+    } catch (e) {
     }
   }
 
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 1f593b5..770b719 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -9196,6 +9196,14 @@
     JUnitTestCase.assertEquals("a", components[0].lexeme);
   }
 
+  void test_parseSymbolLiteral_void() {
+    SymbolLiteral literal = ParserTestCase.parse4("parseSymbolLiteral", "#void", []);
+    JUnitTestCase.assertNotNull(literal.poundSign);
+    List<Token> components = literal.components;
+    EngineTestCase.assertLength(1, components);
+    JUnitTestCase.assertEquals("void", components[0].lexeme);
+  }
+
   void test_parseThrowExpression() {
     ThrowExpression expression = ParserTestCase.parse4("parseThrowExpression", "throw x;", []);
     JUnitTestCase.assertNotNull(expression.keyword);
@@ -11936,6 +11944,10 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseSymbolLiteral_single);
       });
+      _ut.test('test_parseSymbolLiteral_void', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_parseSymbolLiteral_void);
+      });
       _ut.test('test_parseThrowExpression', () {
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseThrowExpression);
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index d3a43b3..d5059a3 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -668,6 +668,34 @@
     verify([source]);
   }
 
+  void test_constConstructorWithFieldInitializedByNonConst() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  final int i = f();",
+        "  const A();",
+        "}",
+        "int f() {",
+        "  return 3;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST]);
+    verify([source]);
+  }
+
+  void test_constConstructorWithFieldInitializedByNonConst_static() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  static final int i = f();",
+        "  const A();",
+        "}",
+        "int f() {",
+        "  return 3;",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_constConstructorWithMixin() {
     Source source = addSource(EngineTestCase.createSource([
         "class M {",
@@ -4267,6 +4295,14 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_consistentCaseExpressionTypes_dynamic);
       });
+      _ut.test('test_constConstructorWithFieldInitializedByNonConst', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constConstructorWithFieldInitializedByNonConst);
+      });
+      _ut.test('test_constConstructorWithFieldInitializedByNonConst_static', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_constConstructorWithFieldInitializedByNonConst_static);
+      });
       _ut.test('test_constConstructorWithMixin', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_constConstructorWithMixin);
@@ -6461,7 +6497,7 @@
     _visitor = new ResolverVisitor.con1(library, source, _typeProvider);
     try {
       return _visitor.elementResolver_J2DAccessor as ElementResolver;
-    } on JavaException catch (exception) {
+    } catch (exception) {
       throw new IllegalArgumentException("Could not create resolver", exception);
     }
   }
@@ -6526,7 +6562,7 @@
         _visitor.enclosingClass_J2DAccessor = null;
         _visitor.nameScope_J2DAccessor = outerScope;
       }
-    } on JavaException catch (exception) {
+    } catch (exception) {
       throw new IllegalArgumentException("Could not resolve node", exception);
     }
   }
@@ -6567,7 +6603,7 @@
       } finally {
         _visitor.nameScope_J2DAccessor = outerScope;
       }
-    } on JavaException catch (exception) {
+    } catch (exception) {
       throw new IllegalArgumentException("Could not resolve node", exception);
     }
   }
@@ -6595,7 +6631,7 @@
       } finally {
         _visitor.labelScope_J2DAccessor = outerScope;
       }
-    } on JavaException catch (exception) {
+    } catch (exception) {
       throw new IllegalArgumentException("Could not resolve node", exception);
     }
   }
@@ -16096,6 +16132,24 @@
     verify([source]);
   }
 
+  void test_propagatedFieldType() {
+    // From dartbug.com/20019
+    Source source = addSource(EngineTestCase.createSource([
+        "class A { }",
+        "class X<T> {",
+        "  final x = new List<T>();",
+        "}",
+        "class Z {",
+        "  final X<A> y = new X<A>();",
+        "  foo() {",
+        "    y.x.add(new A());",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_proxy_annotation_prefixed() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -16578,6 +16632,10 @@
         final __test = new NonHintCodeTest();
         runJUnitTest(__test, __test.test_overrideOnNonOverridingSetter_inSuperclass);
       });
+      _ut.test('test_propagatedFieldType', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_propagatedFieldType);
+      });
       _ut.test('test_proxy_annotation_prefixed', () {
         final __test = new NonHintCodeTest();
         runJUnitTest(__test, __test.test_proxy_annotation_prefixed);
@@ -17216,12 +17274,14 @@
     return library;
   }
 
-  Expression findTopLevelConstantExpression(CompilationUnit compilationUnit, String name) {
+  Expression findTopLevelConstantExpression(CompilationUnit compilationUnit, String name) => findTopLevelDeclaration(compilationUnit, name).initializer;
+
+  VariableDeclaration findTopLevelDeclaration(CompilationUnit compilationUnit, String name) {
     for (CompilationUnitMember member in compilationUnit.declarations) {
       if (member is TopLevelVariableDeclaration) {
         for (VariableDeclaration variable in member.variables.variables) {
           if (variable.name.name == name) {
-            return variable.initializer;
+            return variable;
           }
         }
       }
@@ -19512,7 +19572,7 @@
   DartType _analyze4(Expression node, InterfaceType thisType, bool useStaticType) {
     try {
       _analyzer.thisType_J2DAccessor = thisType;
-    } on JavaException catch (exception) {
+    } catch (exception) {
       throw new IllegalArgumentException("Could not set type of 'this'", exception);
     }
     node.accept(_analyzer);
@@ -19618,7 +19678,7 @@
     _visitor.overrideManager.enterScope();
     try {
       return _visitor.typeAnalyzer_J2DAccessor as StaticTypeAnalyzer;
-    } on JavaException catch (exception) {
+    } catch (exception) {
       throw new IllegalArgumentException("Could not create analyzer", exception);
     }
   }
@@ -26569,10 +26629,73 @@
 }
 
 class TypePropagationTest extends ResolverTestCase {
+  void fail_mergePropagatedTypesAtJoinPoint_1() {
+    // https://code.google.com/p/dart/issues/detail?id=19929
+    _assertTypeOfMarkedExpression(EngineTestCase.createSource([
+        "f1(x) {",
+        "  var y = [];",
+        "  if (x) {",
+        "    y = 0;",
+        "  } else {",
+        "    y = '';",
+        "  }",
+        "  // Propagated type is [List] here: incorrect.",
+        "  // Best we can do is [Object]?",
+        "  return y; // marker",
+        "}"]), null, typeProvider.dynamicType);
+  }
+
+  void fail_mergePropagatedTypesAtJoinPoint_2() {
+    // https://code.google.com/p/dart/issues/detail?id=19929
+    _assertTypeOfMarkedExpression(EngineTestCase.createSource([
+        "f2(x) {",
+        "  var y = [];",
+        "  if (x) {",
+        "    y = 0;",
+        "  } else {",
+        "  }",
+        "  // Propagated type is [List] here: incorrect.",
+        "  // Best we can do is [Object]?",
+        "  return y; // marker",
+        "}"]), null, typeProvider.dynamicType);
+  }
+
+  void fail_mergePropagatedTypesAtJoinPoint_3() {
+    // https://code.google.com/p/dart/issues/detail?id=19929
+    _assertTypeOfMarkedExpression(EngineTestCase.createSource([
+        "f4(x) {",
+        "  var y = [];",
+        "  if (x) {",
+        "    y = 0;",
+        "  } else {",
+        "    y = 1.5;",
+        "  }",
+        "  // Propagated type is [List] here: incorrect.",
+        "  // A correct answer is the least upper bound of [int] and [double],",
+        "  // i.e. [num].",
+        "  return y; // marker",
+        "}"]), null, typeProvider.numType);
+  }
+
+  void fail_mergePropagatedTypesAtJoinPoint_5() {
+    // https://code.google.com/p/dart/issues/detail?id=19929
+    _assertTypeOfMarkedExpression(EngineTestCase.createSource([
+        "f6(x,y) {",
+        "  var z = [];",
+        "  if (x || (z = y) < 0) {",
+        "  } else {",
+        "    z = 0;",
+        "  }",
+        "  // Propagated type is [List] here: incorrect.",
+        "  // Best we can do is [Object]?",
+        "  return z; // marker",
+        "}"]), null, typeProvider.dynamicType);
+  }
+
   void fail_propagatedReturnType_functionExpression() {
     // TODO(scheglov) disabled because we don't resolve function expression
     String code = EngineTestCase.createSource(["main() {", "  var v = (() {return 42;})();", "}"]);
-    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+    _assertPropagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_as() {
@@ -26701,16 +26824,7 @@
         "f(A a) {",
         "  return a.v; // marker",
         "}"]);
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    {
-      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v; // marker", (node) => node is SimpleIdentifier);
-      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
-      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
-    }
+    _assertTypeOfMarkedExpression(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_finalPropertyInducingVariable_classMember_instance_inherited() {
@@ -26722,16 +26836,7 @@
         "    return v; // marker",
         "  }",
         "}"]);
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    {
-      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v; // marker", (node) => node is SimpleIdentifier);
-      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
-      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
-    }
+    _assertTypeOfMarkedExpression(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_finalPropertyInducingVariable_classMember_instance_propagatedTarget() {
@@ -26743,16 +26848,7 @@
         "    return p.v; // marker",
         "  }",
         "}"]);
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    {
-      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v; // marker", (node) => node is SimpleIdentifier);
-      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
-      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
-    }
+    _assertTypeOfMarkedExpression(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_finalPropertyInducingVariable_classMember_static() {
@@ -26762,16 +26858,7 @@
         "f() {",
         "  return A.V; // marker",
         "}"]);
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    {
-      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "V; // marker", (node) => node is SimpleIdentifier);
-      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
-      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
-    }
+    _assertTypeOfMarkedExpression(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_finalPropertyInducingVariable_topLevelVaraible_prefixed() {
@@ -26779,18 +26866,9 @@
     String code = EngineTestCase.createSource([
         "import 'lib.dart' as p;",
         "f() {",
-        "  var v2 = p.V; // prefixed",
+        "  var v2 = p.V; // marker prefixed",
         "}"]);
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    {
-      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "V; // prefixed", (node) => node is SimpleIdentifier);
-      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
-      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
-    }
+    _assertTypeOfMarkedExpression(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_finalPropertyInducingVariable_topLevelVaraible_simple() {
@@ -26798,18 +26876,9 @@
     String code = EngineTestCase.createSource([
         "import 'lib.dart';",
         "f() {",
-        "  return V; // simple",
+        "  return V; // marker simple",
         "}"]);
-    Source source = addSource(code);
-    LibraryElement library = resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = resolveCompilationUnit(source, library);
-    {
-      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "V; // simple", (node) => node is SimpleIdentifier);
-      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
-      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
-    }
+    _assertTypeOfMarkedExpression(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_forEach() {
@@ -27442,14 +27511,29 @@
     JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[1]);
   }
 
+  void test_mergePropagatedTypesAtJoinPoint_4() {
+    // https://code.google.com/p/dart/issues/detail?id=19929
+    _assertTypeOfMarkedExpression(EngineTestCase.createSource([
+        "f5(x) {",
+        "  var y = [];",
+        "  if (x) {",
+        "    y = 0;",
+        "  } else {",
+        "    return y;",
+        "  }",
+        "  // Propagated type is [int] here: correct.",
+        "  return y; // marker",
+        "}"]), null, typeProvider.intType);
+  }
+
   void test_propagatedReturnType_function_hasReturnType_returnsNull() {
     String code = EngineTestCase.createSource(["String f() => null;", "main() {", "  var v = f();", "}"]);
-    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.stringType);
+    _assertPropagatedReturnType(code, typeProvider.dynamicType, typeProvider.stringType);
   }
 
   void test_propagatedReturnType_function_lessSpecificStaticReturnType() {
     String code = EngineTestCase.createSource(["Object f() => 42;", "main() {", "  var v = f();", "}"]);
-    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+    _assertPropagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_propagatedReturnType_function_moreSpecificStaticReturnType() {
@@ -27458,7 +27542,7 @@
         "main() {",
         "  var v = f(3);",
         "}"]);
-    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+    _assertPropagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_propagatedReturnType_function_noReturnTypeName_blockBody_multipleReturns() {
@@ -27470,7 +27554,7 @@
         "main() {",
         "  var v = f();",
         "}"]);
-    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.numType);
+    _assertPropagatedReturnType(code, typeProvider.dynamicType, typeProvider.numType);
   }
 
   void test_propagatedReturnType_function_noReturnTypeName_blockBody_oneReturn() {
@@ -27482,17 +27566,17 @@
         "main() {",
         "  var v = f();",
         "}"]);
-    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+    _assertPropagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_propagatedReturnType_function_noReturnTypeName_expressionBody() {
     String code = EngineTestCase.createSource(["f() => 42;", "main() {", "  var v = f();", "}"]);
-    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+    _assertPropagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_propagatedReturnType_localFunction() {
     String code = EngineTestCase.createSource(["main() {", "  f() => 42;", "  var v = f();", "}"]);
-    _check_propagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
+    _assertPropagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_query() {
@@ -27540,7 +27624,7 @@
    * @param code the code that assigns the value to the variable "v", no matter how. We check that
    *          "v" has expected static and propagated type.
    */
-  void _check_propagatedReturnType(String code, DartType expectedStaticType, DartType expectedPropagatedType) {
+  void _assertPropagatedReturnType(String code, DartType expectedStaticType, DartType expectedPropagatedType) {
     Source source = addSource(code);
     LibraryElement library = resolve(source);
     assertNoErrors(source);
@@ -27552,6 +27636,29 @@
     JUnitTestCase.assertSame(expectedPropagatedType, identifier.propagatedType);
   }
 
+  /**
+   * Check the static and propagated types of the expression marked with "; // marker" comment.
+   *
+   * @param code source code to analyze, with the expression to check marked with "// marker".
+   * @param expectedStaticType if non-null, check actual static type is equal to this.
+   * @param expectedPropagatedType if non-null, check actual static type is equal to this.
+   * @throws Exception
+   */
+  void _assertTypeOfMarkedExpression(String code, DartType expectedStaticType, DartType expectedPropagatedType) {
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "; // marker", (node) => node is SimpleIdentifier);
+    if (expectedStaticType != null) {
+      JUnitTestCase.assertSame(expectedStaticType, identifier.staticType);
+    }
+    if (expectedPropagatedType != null) {
+      JUnitTestCase.assertSame(expectedPropagatedType, identifier.propagatedType);
+    }
+  }
+
   static dartSuite() {
     _ut.group('TypePropagationTest', () {
       _ut.test('test_CanvasElement_getContext', () {
@@ -27714,6 +27821,10 @@
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_mapLiteral_same);
       });
+      _ut.test('test_mergePropagatedTypesAtJoinPoint_4', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_mergePropagatedTypesAtJoinPoint_4);
+      });
       _ut.test('test_propagatedReturnType_function_hasReturnType_returnsNull', () {
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_propagatedReturnType_function_hasReturnType_returnsNull);
diff --git a/pkg/analysis_server/test/package_uri_resolver_test.dart b/pkg/analyzer/test/source/package_map_resolver_test.dart
similarity index 60%
rename from pkg/analysis_server/test/package_uri_resolver_test.dart
rename to pkg/analyzer/test/source/package_map_resolver_test.dart
index 47b2f28..4b6a9c8 100644
--- a/pkg/analysis_server/test/package_uri_resolver_test.dart
+++ b/pkg/analyzer/test/source/package_map_resolver_test.dart
@@ -2,35 +2,68 @@
 // for 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 test.resolver.package;
+library test.source.package_map_resolver;
 
 import 'dart:collection';
 
-import 'package:analysis_server/src/package_uri_resolver.dart';
-import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:unittest/unittest.dart';
 
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(_PackageMapUriResolverTest);
+  group('PackageMapUriResolverTest', () {
+    test('fromEncoding_nonPackage', () {
+      new _PackageMapUriResolverTest().test_fromEncoding_nonPackage();
+    });
+    test('fromEncoding_package', () {
+      new _PackageMapUriResolverTest().test_fromEncoding_package();
+    });
+    test('isPackageUri', () {
+      new _PackageMapUriResolverTest().test_isPackageUri();
+    });
+    test('isPackageUri_null_scheme', () {
+      new _PackageMapUriResolverTest().test_isPackageUri_null_scheme();
+    });
+    test('isPackageUri_other_scheme', () {
+      new _PackageMapUriResolverTest().test_isPackageUri_other_scheme();
+    });
+    test('resolve_multiple_folders', () {
+      new _PackageMapUriResolverTest().test_resolve_multiple_folders();
+    });
+    test('resolve_nonPackage', () {
+      new _PackageMapUriResolverTest().test_resolve_nonPackage();
+    });
+    test('resolve_OK', () {
+      new _PackageMapUriResolverTest().test_resolve_OK();
+    });
+    test('resolve_package_invalid_leadingSlash', () {
+      var inst = new _PackageMapUriResolverTest();
+      inst.test_resolve_package_invalid_leadingSlash();
+    });
+    test('resolve_package_invalid_noSlash', () {
+      new _PackageMapUriResolverTest().test_resolve_package_invalid_noSlash();
+    });
+    test('resolve_package_invalid_onlySlash', () {
+      new _PackageMapUriResolverTest().test_resolve_package_invalid_onlySlash();
+    });
+    test('resolve_package_notInMap', () {
+      new _PackageMapUriResolverTest().test_resolve_package_notInMap();
+    });
+    test('restoreAbsolute_OK', () {
+      new _PackageMapUriResolverTest().test_restoreAbsolute();
+    });
+  });
 }
 
 
-@ReflectiveTestCase()
 class _PackageMapUriResolverTest {
   static HashMap EMPTY_MAP = new HashMap<String, List<Folder>>();
   MemoryResourceProvider provider = new MemoryResourceProvider();
 
-  setUp() {
-  }
-
-  tearDown() {
-  }
-
   void test_fromEncoding_nonPackage() {
     UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
     Uri uri = Uri.parse('file:/does/not/exist.dart');
@@ -69,8 +102,8 @@
     const pkgFileB = '/pkgB/lib/libB.dart';
     provider.newFile(pkgFileA, 'library lib_a;');
     provider.newFile(pkgFileB, 'library lib_b;');
-    PackageMapUriResolver resolver = new PackageMapUriResolver(provider,
-        <String, List<Folder>>{
+    PackageMapUriResolver resolver =
+        new PackageMapUriResolver(provider, <String, List<Folder>>{
       'pkgA': [provider.getResource('/pkgA/lib/')],
       'pkgB': [provider.getResource('/pkgB/lib/')]
     });
@@ -97,10 +130,11 @@
     const pkgFileB = '/part2/lib/libB.dart';
     provider.newFile(pkgFileA, 'library lib_a');
     provider.newFile(pkgFileB, 'library lib_b');
-    PackageMapUriResolver resolver = new PackageMapUriResolver(provider,
-        <String, List<Folder>>{
-      'pkg': [provider.getResource('/part1/lib/'),
-              provider.getResource('/part2/lib/')]
+    PackageMapUriResolver resolver =
+        new PackageMapUriResolver(provider, <String, List<Folder>>{
+      'pkg': [
+          provider.getResource('/part1/lib/'),
+          provider.getResource('/part2/lib/')]
     });
     {
       Uri uri = Uri.parse('package:pkg/libA.dart');
@@ -156,4 +190,37 @@
     expect(result.exists(), isFalse);
     expect(result.fullName, 'package:analyzer/analyzer.dart');
   }
+
+  void test_restoreAbsolute() {
+    const pkgFileA = '/pkgA/lib/libA.dart';
+    const pkgFileB = '/pkgB/lib/src/libB.dart';
+    provider.newFile(pkgFileA, 'library lib_a;');
+    provider.newFile(pkgFileB, 'library lib_b;');
+    PackageMapUriResolver resolver =
+        new PackageMapUriResolver(provider, <String, List<Folder>>{
+      'pkgA': [provider.getResource('/pkgA/lib/')],
+      'pkgB': [provider.getResource('/pkgB/lib/')]
+    });
+    {
+      Source source = _createFileSource('/pkgA/lib/libA.dart');
+      Uri uri = resolver.restoreAbsolute(source);
+      expect(uri, isNotNull);
+      expect(uri.path, 'package:pkgA/libA.dart');
+    }
+    {
+      Source source = _createFileSource('/pkgB/lib/src/libB.dart');
+      Uri uri = resolver.restoreAbsolute(source);
+      expect(uri, isNotNull);
+      expect(uri.path, 'package:pkgB/src/libB.dart');
+    }
+    {
+      Source source = _createFileSource('/no/such/file');
+      Uri uri = resolver.restoreAbsolute(source);
+      expect(uri, isNull);
+    }
+  }
+
+  Source _createFileSource(String path) {
+    return new NonExistingSource(path, UriKind.FILE_URI);
+  }
 }
diff --git a/pkg/analyzer/test/source/test_all.dart b/pkg/analyzer/test/source/test_all.dart
new file mode 100644
index 0000000..b9a145f
--- /dev/null
+++ b/pkg/analyzer/test/source/test_all.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.source;
+
+import 'package:unittest/unittest.dart';
+
+import 'package_map_resolver_test.dart' as package_map_resolver_test;
+
+
+/// Utility for manually running all tests.
+main() {
+  groupSep = ' | ';
+  group('source', () {
+    package_map_resolver_test.main();
+  });
+}
\ No newline at end of file
diff --git a/pkg/barback/CHANGELOG.md b/pkg/barback/CHANGELOG.md
index 6edf327..fb0ab15 100644
--- a/pkg/barback/CHANGELOG.md
+++ b/pkg/barback/CHANGELOG.md
@@ -1,3 +1,14 @@
+## 0.15.0
+
+* Fully switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan`
+  class.
+
+## 0.14.2
+
+* All TransformLogger methods now accept SourceSpans from the source_span
+  package in addition to Spans from the source_maps package. In 0.15.0, only
+  SourceSpans will be accepted.
+
 ## 0.14.1+3
 
 * Add a dependency on the `pool` package.
diff --git a/pkg/barback/example/aggregate_transformer/README.md b/pkg/barback/example/aggregate_transformer/README.md
new file mode 100644
index 0000000..3e7b12f
--- /dev/null
+++ b/pkg/barback/example/aggregate_transformer/README.md
@@ -0,0 +1,4 @@
+This example shows how to write an aggregate transformer.
+
+For more information, see Writing an Aggregate Transformer at:
+https://www.dartlang.org/tools/pub/transformers/aggregate.html
diff --git a/pkg/barback/example/aggregate_transformer/lib/recipes-grammas/banana-pudding-recipe.html b/pkg/barback/example/aggregate_transformer/lib/recipes-grammas/banana-pudding-recipe.html
new file mode 100644
index 0000000..f3e3b63
--- /dev/null
+++ b/pkg/barback/example/aggregate_transformer/lib/recipes-grammas/banana-pudding-recipe.html
@@ -0,0 +1,28 @@
+
+<h2><a name="banana-pudding">Banana Pudding</a></h2>
+<ul>
+<li>1/4 cup water</li>
+<li>2 Tblsp flour</li>
+<li>1 cup sugar</li>
+<li>6 lg eggs</li>
+<li>1 can evaporated milk</li>
+<li>1 Tblsp vanilla extract</li>
+<li>16 oz sour cream</li>
+<li>3 large bananas, sliced</li>
+<li>1 (16 oz) package of vanilla wafers</li>
+</ul>
+<p>
+Add water to saucepan. Whisk in flour until smooth. Add sugar
+and mix well. Add eggs, one at a time, mixing well after each one.
+Slowly stir in milk, mixing well.</p>
+<p>
+Place pan on low heat. Cook, stirring constantly, until mixture
+is thickened to the consistency of a thick gravy, approximately
+20 minutes. The mixture will start to steam and produce bubbles,
+but you don't want a full boil.</p>
+<p>
+Remove from heat and stir in vanilla. Cool thoroughly. Fold in
+sour cream and mix well.</p>
+<p>
+Layer wafers, bananas, and pudding in a glass serving bowl, such
+as a trifle bowl. Thoroughly chill. Serve with whipped cream.</p>
diff --git a/pkg/barback/example/aggregate_transformer/lib/recipes-grammas/winter-squash-pie-recipe.html b/pkg/barback/example/aggregate_transformer/lib/recipes-grammas/winter-squash-pie-recipe.html
new file mode 100644
index 0000000..3445186
--- /dev/null
+++ b/pkg/barback/example/aggregate_transformer/lib/recipes-grammas/winter-squash-pie-recipe.html
@@ -0,0 +1,24 @@
+
+<h2><a name="winter-squash-pie">Winter Squash Pie</a></h2>
+<ul>
+<li>2 eggs</li>
+<li>3/4 cup brown sugar</li>
+<li>1 tsp cinnamon</li>
+<li>1/4 tsp ginger</li>
+<li>1/4 tsp cardamom</li>
+<li>1 cup evaporated milk</li>
+<li>1/2 cup cream</li>
+<li>1-1/2 cups winter squash (such as pumpkin), pureed</li>
+<li>1 9" (single) pie crust</li>
+</ul>
+<p>
+Mix eggs and sugar together. Add pumpkin and mix. Add salt and spices.
+Slowly stir in evaporated milk, and then the cream.</p>
+<p>
+Pour into un nbaked pie crust. Bake in a preheated 425&deg;F oven
+for 15 minutes. Turn heat down to 325&degF and bake another 45 minutes
+until center is firm.</p>
+<p>
+Remove from oven and cool on a rack before serving.</p>
+<p>
+Serve with whipped cream.</p>
diff --git a/pkg/barback/example/aggregate_transformer/lib/transformer.dart b/pkg/barback/example/aggregate_transformer/lib/transformer.dart
new file mode 100644
index 0000000..bf6b2c3
--- /dev/null
+++ b/pkg/barback/example/aggregate_transformer/lib/transformer.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as p;
+
+import 'dart:async';
+
+class MakeBook extends AggregateTransformer {
+  // All transformers need to implement "asPlugin" to let Pub know that they
+  // are transformers.
+  MakeBook.asPlugin();
+
+  // Implement the classifyPrimary method to claim any assets that you want
+  // to handle. Return a value for the assets you want to handle,
+  // or null for those that you do not want to handle.
+  classifyPrimary(AssetId id) {
+    // Only process assets where the filename ends with "recipe.html".
+    if (!id.path.endsWith('recipe.html')) return null;
+
+    // Return the path string, minus the recipe itself.
+    // This is where the output asset will be written.
+    return p.url.dirname(id.path);
+  }
+
+  // Implement the apply method to process the assets and create the
+  // output asset.
+  Future apply(AggregateTransform transform) {
+    var buffer = new StringBuffer()..write('<html><body>');
+ 
+    return transform.primaryInputs.toList().then((assets) {
+      // The order of [transform.primaryInputs] is not guaranteed
+      // to be stable across multiple runs of the transformer.
+      // Therefore, we alphabetically sort the assets by ID string.
+      assets.sort((x, y) => x.id.compareTo(y.id));
+      return Future.wait(assets.map((asset) {
+        return asset.readAsString().then((content) {
+          buffer.write(content);
+          buffer.write('<hr>');
+        });
+      }));
+    }).then((_) {
+      buffer.write('</body></html>');
+      // Write the output back to the same directory,
+      // in a file named recipes.html.
+      var id = new AssetId(transform.package,
+                           p.url.join(transform.key, ".recipes.html"));
+      transform.addOutput(new Asset.fromString(id, buffer.toString()));
+    });
+  }
+}
+
diff --git a/pkg/barback/example/aggregate_transformer/pubspec.yaml b/pkg/barback/example/aggregate_transformer/pubspec.yaml
new file mode 100644
index 0000000..c43247b
--- /dev/null
+++ b/pkg/barback/example/aggregate_transformer/pubspec.yaml
@@ -0,0 +1,15 @@
+name: aggregate_transformer
+description: This example implements an aggregate transformer.
+  It collects recipes, stored as incomplete HTML files, into
+  a single, complete HTML file.
+
+dependencies:
+  barback: ">=0.14.1 <0.16.0"
+
+# Override the barback dependency so this example always uses the version
+# of barback it's bundled with.
+dependency_overrides:
+  barback: {path: ../..}
+
+transformers:
+- aggregate_transformer
diff --git a/pkg/barback/example/markdown_converter/web/images/bison.jpg b/pkg/barback/example/markdown_converter/lib/images/bison.jpg
similarity index 100%
rename from pkg/barback/example/markdown_converter/web/images/bison.jpg
rename to pkg/barback/example/markdown_converter/lib/images/bison.jpg
Binary files differ
diff --git a/pkg/barback/example/markdown_converter/web/index.markdown b/pkg/barback/example/markdown_converter/lib/index.markdown
similarity index 100%
rename from pkg/barback/example/markdown_converter/web/index.markdown
rename to pkg/barback/example/markdown_converter/lib/index.markdown
diff --git a/pkg/barback/example/markdown_converter/web/test2.md b/pkg/barback/example/markdown_converter/lib/test2.md
similarity index 100%
rename from pkg/barback/example/markdown_converter/web/test2.md
rename to pkg/barback/example/markdown_converter/lib/test2.md
diff --git a/pkg/barback/example/markdown_converter/pubspec.yaml b/pkg/barback/example/markdown_converter/pubspec.yaml
index f212c9f..5cd04d6 100644
--- a/pkg/barback/example/markdown_converter/pubspec.yaml
+++ b/pkg/barback/example/markdown_converter/pubspec.yaml
@@ -2,9 +2,15 @@
 description: This hello world example implements a simple
              transformer that converts a markdown file (with
              a ".mdown", ".md", or a ".markdown" extension) to HTML.
+
 dependencies:
-  barback: any
+  barback: ">=0.14.1 <0.16.0"
   markdown: any
 
+# Override the barback dependency so this example always uses the version
+# of barback it's bundled with.
+dependency_overrides:
+  barback: {path: ../..}
+
 transformers:
 - markdown_converter
diff --git a/pkg/barback/example/simple_transformer/web/test.txt b/pkg/barback/example/simple_transformer/lib/test.txt
similarity index 100%
rename from pkg/barback/example/simple_transformer/web/test.txt
rename to pkg/barback/example/simple_transformer/lib/test.txt
diff --git a/pkg/barback/example/simple_transformer/lib/transformer.dart b/pkg/barback/example/simple_transformer/lib/transformer.dart
index 881e06f..b005c25 100644
--- a/pkg/barback/example/simple_transformer/lib/transformer.dart
+++ b/pkg/barback/example/simple_transformer/lib/transformer.dart
@@ -14,8 +14,8 @@
   // class to be publicly available as a loadable transformer plugin.
   InsertCopyright.asPlugin();
 
-  Future<bool> isPrimary(Asset input) {
-    return new Future.value(input.id.extension == '.txt');
+  Future<bool> isPrimary(AssetId id) {
+    return new Future.value(id.extension == '.txt');
   }
 
   Future apply(Transform transform) {
diff --git a/pkg/barback/example/simple_transformer/pubspec.yaml b/pkg/barback/example/simple_transformer/pubspec.yaml
index 13f91e8..aecd7ff 100644
--- a/pkg/barback/example/simple_transformer/pubspec.yaml
+++ b/pkg/barback/example/simple_transformer/pubspec.yaml
@@ -2,8 +2,14 @@
 description: This hello world example implements a simple
              transformer that inserts a copyright string into
              an input asset - a file that ends with ".txt".
+
 dependencies:
-  barback: any
+  barback: ">=0.14.1 <0.16.0"
+
+# Override the barback dependency so this example always uses the version
+# of barback it's bundled with.
+dependency_overrides:
+  barback: {path: ../..}
 
 transformers:
 - simple_transformer
diff --git a/pkg/barback/lib/src/graph/package_graph.dart b/pkg/barback/lib/src/graph/package_graph.dart
index e4664d9..0f9cde9 100644
--- a/pkg/barback/lib/src/graph/package_graph.dart
+++ b/pkg/barback/lib/src/graph/package_graph.dart
@@ -208,7 +208,7 @@
       buffer.write("[${entry.level} ${entry.transform}] ");
 
       if (entry.span != null) {
-        buffer.write(entry.span.getLocationMessage(entry.message));
+        buffer.write(entry.span.message(entry.message));
       } else {
         buffer.write(entry.message);
       }
diff --git a/pkg/barback/lib/src/log.dart b/pkg/barback/lib/src/log.dart
index 691f4db..f0240a4 100644
--- a/pkg/barback/lib/src/log.dart
+++ b/pkg/barback/lib/src/log.dart
@@ -4,7 +4,7 @@
 
 library barback.log;
 
-import 'package:source_maps/span.dart';
+import 'package:source_span/source_span.dart';
 
 import 'asset/asset_id.dart';
 import 'errors.dart';
@@ -34,8 +34,8 @@
   final String message;
 
   /// The location that the message pertains to or null if not associated with
-  /// a source [Span].
-  final Span span;
+  /// a [SourceSpan].
+  final SourceSpan span;
 
   LogEntry(this.transform, this.assetId, this.level, this.message, this.span);
 }
diff --git a/pkg/barback/lib/src/transformer/transform_logger.dart b/pkg/barback/lib/src/transformer/transform_logger.dart
index 6524375..5f26a97 100644
--- a/pkg/barback/lib/src/transformer/transform_logger.dart
+++ b/pkg/barback/lib/src/transformer/transform_logger.dart
@@ -4,13 +4,13 @@
 
 library barback.transformer.transform_logger;
 
-import 'package:source_maps/span.dart';
+import 'package:source_span/source_span.dart';
 
 import '../asset/asset_id.dart';
 import '../log.dart';
 
 typedef void LogFunction(AssetId asset, LogLevel level, String message,
-                         Span span);
+                         SourceSpan span);
 
 /// Object used to report warnings and errors encountered while running a
 /// transformer.
@@ -22,10 +22,10 @@
   /// Logs an informative message.
   ///
   /// If [asset] is provided, the log entry is associated with that asset.
-  /// Otherwise it's associated with the primary input of [transformer].
-  /// If [span] is provided, indicates the location in the input asset that
-  /// caused the message.
-  void info(String message, {AssetId asset, Span span}) {
+  /// Otherwise it's associated with the primary input of [transformer]. If
+  /// present, [span] indicates the location in the input asset that caused the
+  /// error.
+  void info(String message, {AssetId asset, SourceSpan span}) {
     _logFunction(asset, LogLevel.INFO, message, span);
   }
 
@@ -33,29 +33,29 @@
   /// verbose mode.
   ///
   /// If [asset] is provided, the log entry is associated with that asset.
-  /// Otherwise it's associated with the primary input of [transformer].
-  /// If [span] is provided, indicates the location in the input asset that
-  /// caused the message.
-  void fine(String message, {AssetId asset, Span span}) {
+  /// Otherwise it's associated with the primary input of [transformer]. If
+  /// present, [span] indicates the location in the input asset that caused the
+  /// error.
+  void fine(String message, {AssetId asset, SourceSpan span}) {
     _logFunction(asset, LogLevel.FINE, message, span);
   }
 
   /// Logs a warning message.
   ///
   /// If [asset] is provided, the log entry is associated with that asset.
-  /// Otherwise it's associated with the primary input of [transformer].
-  /// If present, [span] indicates the location in the input asset that caused
-  /// the warning.
-  void warning(String message, {AssetId asset, Span span}) {
+  /// Otherwise it's associated with the primary input of [transformer]. If
+  /// present, [span] indicates the location in the input asset that caused the
+  /// error.
+  void warning(String message, {AssetId asset, SourceSpan span}) {
     _logFunction(asset, LogLevel.WARNING, message, span);
   }
 
   /// Logs an error message.
   ///
   /// If [asset] is provided, the log entry is associated with that asset.
-  /// Otherwise it's associated with the primary input of [transformer].
-  /// If present, [span] indicates the location in the input asset that caused
-  /// the error.
+  /// Otherwise it's associated with the primary input of [transformer]. If
+  /// present, [span] indicates the location in the input asset that caused the
+  /// error.
   ///
   /// Logging any errors will cause Barback to consider the transformation to
   /// have failed, much like throwing an exception. This means that neither the
@@ -65,7 +65,7 @@
   /// Unlike throwing an exception, this doesn't cause a transformer to stop
   /// running. This makes it useful in cases where a single input may have
   /// multiple errors that the user wants to know about.
-  void error(String message, {AssetId asset, Span span}) {
+  void error(String message, {AssetId asset, SourceSpan span}) {
     _logFunction(asset, LogLevel.ERROR, message, span);
   }
 }
diff --git a/pkg/barback/pubspec.yaml b/pkg/barback/pubspec.yaml
index 9d6fec3..c8b3dc0 100644
--- a/pkg/barback/pubspec.yaml
+++ b/pkg/barback/pubspec.yaml
@@ -7,7 +7,7 @@
 #
 # When the minor or patch version of this is upgraded, you *must* update that
 # version constraint in pub to stay in sync with this.
-version: 0.14.1+4
+version: 0.15.0
 
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
@@ -24,7 +24,7 @@
 dependencies:
   path: ">=0.9.0 <2.0.0"
   pool: ">=1.0.0 <2.0.0"
-  source_maps: ">=0.9.0 <0.10.0"
+  source_span: ">=1.0.0 <2.0.0"
   stack_trace: ">=0.9.1 <2.0.0"
   collection: ">=0.9.1 <0.10.0"
 dev_dependencies:
diff --git a/pkg/code_transformers/CHANGELOG.md b/pkg/code_transformers/CHANGELOG.md
new file mode 100644
index 0000000..96d2f7c
--- /dev/null
+++ b/pkg/code_transformers/CHANGELOG.md
@@ -0,0 +1,16 @@
+## 0.2.0+3
+
+* Raise the lower bound on the source_maps constraint to exclude incompatible
+  versions.
+
+## 0.2.0+2
+
+* Widen the constraint on source_maps.
+
+## 0.2.0+1
+
+* Widen the constraint on barback.
+
+## 0.2.0
+
+* Switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan` class.
diff --git a/pkg/code_transformers/lib/assets.dart b/pkg/code_transformers/lib/assets.dart
index 9a76c87..60cc75d 100644
--- a/pkg/code_transformers/lib/assets.dart
+++ b/pkg/code_transformers/lib/assets.dart
@@ -9,7 +9,7 @@
 
 import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
-import 'package:source_maps/span.dart' show Span;
+import 'package:source_span/source_span.dart';
 
 /// Create an [AssetId] for a [url] seen in the [source] asset.
 ///
@@ -25,7 +25,7 @@
 /// absolute.
 // TODO(sigmund): delete once this is part of barback (dartbug.com/12610)
 AssetId uriToAssetId(AssetId source, String url, TransformLogger logger,
-    Span span, {bool errorOnAbsolute: true}) {
+    SourceSpan span, {bool errorOnAbsolute: true}) {
   if (url == null || url == '') return null;
   var uri = Uri.parse(url);
   var urlBuilder = path.url;
@@ -94,7 +94,7 @@
 }
 
 AssetId _extractOtherPackageId(int index, List segments,
-    TransformLogger logger, Span span) {
+    TransformLogger logger, SourceSpan span) {
   if (index >= segments.length) return null;
   var prefix = segments[index];
   if (prefix != 'packages' && prefix != 'assets') return null;
diff --git a/pkg/code_transformers/lib/src/resolver.dart b/pkg/code_transformers/lib/src/resolver.dart
index 95f5b1c..2d5eda9 100644
--- a/pkg/code_transformers/lib/src/resolver.dart
+++ b/pkg/code_transformers/lib/src/resolver.dart
@@ -11,7 +11,7 @@
 import 'package:analyzer/src/generated/element.dart';
 import 'package:barback/barback.dart';
 import 'package:source_maps/refactor.dart';
-import 'package:source_maps/span.dart' show SourceFile, Span;
+import 'package:source_span/source_span.dart';
 
 
 /// Class for working with a barback based resolved AST.
@@ -86,7 +86,7 @@
 
   /// Get the source span where the specified element was defined or null if
   /// the element came from the Dart SDK.
-  Span getSourceSpan(Element element);
+  SourceSpan getSourceSpan(Element element);
 
   /// Get a [SourceFile] with the contents of the file that defines [element],
   /// or null if the element came from the Dart SDK.
diff --git a/pkg/code_transformers/lib/src/resolver_impl.dart b/pkg/code_transformers/lib/src/resolver_impl.dart
index 3df7a80..52f8033 100644
--- a/pkg/code_transformers/lib/src/resolver_impl.dart
+++ b/pkg/code_transformers/lib/src/resolver_impl.dart
@@ -17,7 +17,7 @@
 import 'package:code_transformers/assets.dart';
 import 'package:path/path.dart' as native_path;
 import 'package:source_maps/refactor.dart';
-import 'package:source_maps/span.dart' show SourceFile, Span;
+import 'package:source_span/source_span.dart';
 
 import 'resolver.dart';
 import 'dart_sdk.dart' show UriAnnotatedSource;
@@ -254,7 +254,7 @@
     return null;
   }
 
-  Span getSourceSpan(Element element) {
+  SourceSpan getSourceSpan(Element element) {
     var sourceFile = getSourceFile(element);
     if (sourceFile == null) return null;
     return sourceFile.span(element.node.offset, element.node.end);
@@ -285,7 +285,7 @@
 
     var importUri = _getSourceUri(element);
     var spanPath = importUri != null ? importUri.toString() : assetId.path;
-    return new SourceFile.text(spanPath, sources[assetId].rawContents);
+    return new SourceFile(sources[assetId].rawContents, url: spanPath);
   }
 }
 
@@ -390,13 +390,13 @@
   }
 
   /// For logging errors.
-  Span _getSpan(AstNode node, [String contents]) =>
+  SourceSpan _getSpan(AstNode node, [String contents]) =>
       _getSourceFile(contents).span(node.offset, node.end);
   /// For logging errors.
   SourceFile _getSourceFile([String contents]) {
     var uri = getSourceUri();
     var path = uri != null ? uri.toString() : assetId.path;
-    return new SourceFile.text(path, contents != null ? contents : rawContents);
+    return new SourceFile(contents != null ? contents : rawContents, url: path);
   }
 
   /// Gets a URI which would be appropriate for importing this file.
@@ -448,7 +448,7 @@
 
 /// Get an asset ID for a URL relative to another source asset.
 AssetId _resolve(AssetId source, String url, TransformLogger logger,
-    Span span) {
+    SourceSpan span) {
   if (url == null || url == '') return null;
   var uri = Uri.parse(url);
 
diff --git a/pkg/code_transformers/lib/src/resolvers.dart b/pkg/code_transformers/lib/src/resolvers.dart
index e546e06..1ef98dc 100644
--- a/pkg/code_transformers/lib/src/resolvers.dart
+++ b/pkg/code_transformers/lib/src/resolvers.dart
@@ -7,6 +7,7 @@
 import 'dart:async';
 import 'package:barback/barback.dart';
 
+import 'package:analyzer/src/generated/engine.dart' show AnalysisOptions;
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
 import 'package:analyzer/src/generated/source.dart' show DartUriResolver;
 
@@ -27,19 +28,20 @@
   final Map<AssetId, Resolver> _resolvers = {};
   final DartSdk dartSdk;
   final DartUriResolver dartUriResolver;
+  final AnalysisOptions options;
 
-  Resolvers.fromSdk(this.dartSdk, this.dartUriResolver);
+  Resolvers.fromSdk(this.dartSdk, this.dartUriResolver, {this.options});
 
-  factory Resolvers(dartSdkDirectory) {
+  factory Resolvers(dartSdkDirectory, {AnalysisOptions options}) {
     var sdk = new DirectoryBasedDartSdkProxy(dartSdkDirectory);
     var uriResolver = new DartUriResolverProxy(sdk);
-    return new Resolvers.fromSdk(sdk, uriResolver);
+    return new Resolvers.fromSdk(sdk, uriResolver, options: options);
   }
 
   factory Resolvers.fromMock(Map<String, String> sources,
-      {bool reportMissing: false}) {
+      {bool reportMissing: false, AnalysisOptions options}) {
     var sdk = new MockDartSdk(sources, reportMissing: reportMissing);
-    return new Resolvers.fromSdk(sdk, sdk.resolver);
+    return new Resolvers.fromSdk(sdk, sdk.resolver, options: options);
   }
 
   /// Get a resolver for [transform]. If provided, this resolves the code
@@ -52,7 +54,7 @@
   Future<Resolver> get(Transform transform, [List<AssetId> entryPoints]) {
     var id = transform.primaryInput.id;
     var resolver = _resolvers.putIfAbsent(id,
-        () => new ResolverImpl(dartSdk, dartUriResolver));
+        () => new ResolverImpl(dartSdk, dartUriResolver, options: options));
     return resolver.resolve(transform, entryPoints);
   }
 }
diff --git a/pkg/code_transformers/pubspec.yaml b/pkg/code_transformers/pubspec.yaml
index b8b0ce7..5f07de4 100644
--- a/pkg/code_transformers/pubspec.yaml
+++ b/pkg/code_transformers/pubspec.yaml
@@ -1,13 +1,14 @@
 name: code_transformers
-version: 0.1.5
+version: 0.2.0+3
 author: "Dart Team <misc@dartlang.org>"
 description: Collection of utilities related to creating barback transformers.
 homepage: http://www.dartlang.org
 dependencies:
   analyzer: ">=0.15.6 <0.22.0"
-  barback: ">=0.11.0 <0.15.0"
+  barback: ">=0.14.2 <0.16.0"
   path: ">=0.9.0 <2.0.0"
-  source_maps: ">=0.9.0 <0.10.0"
+  source_maps: ">=0.9.4 <0.11.0"
+  source_span: ">=1.0.0 <2.0.0"
 dev_dependencies:
   unittest: ">=0.10.1 <0.11.0"
 environment:
diff --git a/pkg/csslib/CHANGELOG.md b/pkg/csslib/CHANGELOG.md
new file mode 100644
index 0000000..392de58
--- /dev/null
+++ b/pkg/csslib/CHANGELOG.md
@@ -0,0 +1,11 @@
+## 0.11.0+2
+
+* Fix another test that was failing on IE10.
+
+## 0.11.0+1
+
+* Fix a test that was failing on IE10.
+
+## 0.11.0
+
+* Switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan` class.
diff --git a/pkg/csslib/lib/css.dart b/pkg/csslib/lib/css.dart
index 2d94e5c..73400bc 100644
--- a/pkg/csslib/lib/css.dart
+++ b/pkg/csslib/lib/css.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 
 import 'package:path/path.dart' as path;
-import 'package:source_maps/span.dart' show SourceFile;
+import 'package:source_span/source_span.dart';
 
 import 'parser.dart';
 import 'visitor.dart';
@@ -36,7 +36,7 @@
     // Read the file.
     var filename = path.basename(inputPath);
     var contents = new File(inputPath).readAsStringSync();
-    var file = new SourceFile.text(inputPath, contents);
+    var file = new SourceFile(contents, url: path.toUri(inputPath));
 
     // Parse the CSS.
     var tree = _time('Parse $filename',
diff --git a/pkg/csslib/lib/parser.dart b/pkg/csslib/lib/parser.dart
index 272268b..059b75c 100644
--- a/pkg/csslib/lib/parser.dart
+++ b/pkg/csslib/lib/parser.dart
@@ -6,7 +6,7 @@
 
 import 'dart:math' as math;
 
-import 'package:source_maps/span.dart' show SourceFile, Span, FileSpan;
+import 'package:source_span/source_span.dart';
 
 import "visitor.dart";
 import 'src/messages.dart';
@@ -59,7 +59,7 @@
 
   _createMessages(errors: errors, options: options);
 
-  var file = new SourceFile.text(null, source);
+  var file = new SourceFile(source);
 
   var tree = new _Parser(file, source).parse();
 
@@ -91,7 +91,7 @@
 
   _createMessages(errors: errors, options: options);
 
-  var file = new SourceFile.text(null, source);
+  var file = new SourceFile(source);
   return new _Parser(file, source).parse();
 }
 
@@ -106,7 +106,7 @@
 
   _createMessages(errors: errors);
 
-  var file = new SourceFile.text(null, source);
+  var file = new SourceFile(source);
   return (new _Parser(file, source)
       ..tokenizer.inSelector = true)
       .parseSelector();
@@ -117,7 +117,7 @@
 
   _createMessages(errors: errors);
 
-  var file = new SourceFile.text(null, source);
+  var file = new SourceFile(source);
   return (new _Parser(file, source)
       // TODO(jmesserly): this fix should be applied to the parser. It's tricky
       // because by the time the flag is set one token has already been fetched.
@@ -320,21 +320,21 @@
     _error(message, tok.span);
   }
 
-  void _error(String message, Span location) {
+  void _error(String message, SourceSpan location) {
     if (location == null) {
       location = _peekToken.span;
     }
     messages.error(message, location);
   }
 
-  void _warning(String message, Span location) {
+  void _warning(String message, SourceSpan location) {
     if (location == null) {
       location = _peekToken.span;
     }
     messages.warning(message, location);
   }
 
-  Span _makeSpan(int start) {
+  SourceSpan _makeSpan(int start) {
     // TODO(terry): there are places where we are creating spans before we eat
     // the tokens, so using _previousToken.end is not always valid.
     var end = _previousToken != null && _previousToken.end >= start
@@ -942,7 +942,7 @@
     return tokId;
   }
 
-  IncludeDirective processInclude(Span span, {bool eatSemiColon: true}) {
+  IncludeDirective processInclude(SourceSpan span, {bool eatSemiColon: true}) {
     /* Stylet grammar:
     *
      *  @include IDENT [(args,...)];
@@ -2283,7 +2283,7 @@
   }
 
   /** Process all dimension units. */
-  LiteralTerm processDimension(Token t, var value, Span span) {
+  LiteralTerm processDimension(Token t, var value, SourceSpan span) {
     LiteralTerm term;
     var unitType = this._peek();
 
@@ -2538,7 +2538,7 @@
     }
   }
 
-  HexColorTerm _parseHex(String hexText, Span span) {
+  HexColorTerm _parseHex(String hexText, SourceSpan span) {
     var hexValue = 0;
 
      for (var i = 0; i < hexText.length; i++) {
diff --git a/pkg/csslib/lib/src/messages.dart b/pkg/csslib/lib/src/messages.dart
index 6c2ecbf..92f8451 100644
--- a/pkg/csslib/lib/src/messages.dart
+++ b/pkg/csslib/lib/src/messages.dart
@@ -5,7 +5,7 @@
 library csslib.src.messages;
 
 import 'package:logging/logging.dart' show Level;
-import 'package:source_maps/span.dart' show Span;
+import 'package:source_span/source_span.dart';
 
 import 'options.dart';
 
@@ -43,16 +43,16 @@
 class Message {
   final Level level;
   final String message;
-  final Span span;
+  final SourceSpan span;
   final bool useColors;
 
-  Message(this.level, this.message, {Span span, bool useColors: false})
+  Message(this.level, this.message, {SourceSpan span, bool useColors: false})
       : this.span = span, this.useColors = useColors;
 
   String toString() {
     var output = new StringBuffer();
     bool colors = useColors && _ERROR_COLORS.containsKey(level);
-    var levelColor =  _ERROR_COLORS[level];
+    var levelColor = colors ? _ERROR_COLORS[level] : null;
     if (colors) output.write(levelColor);
     output..write(_ERROR_LABEL[level])..write(' ');
     if (colors) output.write(NO_COLOR);
@@ -61,8 +61,7 @@
       output.write(message);
     } else {
       output.write('on ');
-      output.write(span.getLocationMessage(message, useColors: colors,
-          color: levelColor));
+      output.write(span.message(message, color: levelColor));
     }
 
     return output.toString();
@@ -87,7 +86,7 @@
       : options = options != null ? options : new PreprocessorOptions();
 
   /** Report a compile-time CSS error. */
-  void error(String message, Span span) {
+  void error(String message, SourceSpan span) {
     var msg = new Message(Level.SEVERE, message, span: span,
         useColors: options.useColors);
 
@@ -97,7 +96,7 @@
   }
 
   /** Report a compile-time CSS warning. */
-  void warning(String message, Span span) {
+  void warning(String message, SourceSpan span) {
     if (options.warningsAsErrors) {
       error(message, span);
     } else {
@@ -109,7 +108,7 @@
   }
 
   /** Report and informational message about what the compiler is doing. */
-  void info(String message, Span span) {
+  void info(String message, SourceSpan span) {
     var msg = new Message(Level.INFO, message, span: span,
         useColors: options.useColors);
 
diff --git a/pkg/csslib/lib/src/token.dart b/pkg/csslib/lib/src/token.dart
index 7e70f88..debd301 100644
--- a/pkg/csslib/lib/src/token.dart
+++ b/pkg/csslib/lib/src/token.dart
@@ -12,7 +12,7 @@
   final int kind;
 
   /** The location where this token was parsed from. */
-  final Span span;
+  final SourceSpan span;
 
   /** The start offset of this token. */
   int get start => span.start.offset;
@@ -28,7 +28,7 @@
   /** Returns a pretty representation of this token for error messages. **/
   String toString() {
     var kindText = TokenKind.kindToString(kind);
-    var actualText = text;
+    var actualText = text.trim();
     if (kindText != actualText) {
       if (actualText.length > 10) {
         actualText = '${actualText.substring(0, 8)}...';
@@ -43,13 +43,13 @@
 /** A token containing a parsed literal value. */
 class LiteralToken extends Token {
   var value;
-  LiteralToken(int kind, Span span, this.value) : super(kind, span);
+  LiteralToken(int kind, SourceSpan span, this.value) : super(kind, span);
 }
 
 /** A token containing error information. */
 class ErrorToken extends Token {
   String message;
-  ErrorToken(int kind, Span span, this.message) : super(kind, span);
+  ErrorToken(int kind, SourceSpan span, this.message) : super(kind, span);
 }
 
 /**
@@ -61,6 +61,6 @@
 class IdentifierToken extends Token {
   final String text;
 
-  IdentifierToken(this.text, int kind, Span span)
+  IdentifierToken(this.text, int kind, SourceSpan span)
       : super(kind, span);
 }
diff --git a/pkg/csslib/lib/src/tree.dart b/pkg/csslib/lib/src/tree.dart
index c5275fd..53a5f9f 100644
--- a/pkg/csslib/lib/src/tree.dart
+++ b/pkg/csslib/lib/src/tree.dart
@@ -11,7 +11,7 @@
 class Identifier extends TreeNode {
   String name;
 
-  Identifier(this.name, Span span): super(span);
+  Identifier(this.name, SourceSpan span): super(span);
 
   Identifier clone() => new Identifier(name, span);
 
@@ -21,7 +21,7 @@
 }
 
 class Wildcard extends TreeNode {
-  Wildcard(Span span): super(span);
+  Wildcard(SourceSpan span): super(span);
   Wildcard clone() => new Wildcard(span);
   visit(VisitorBase visitor) => visitor.visitWildcard(this);
 
@@ -29,7 +29,7 @@
 }
 
 class ThisOperator extends TreeNode {
-  ThisOperator(Span span): super(span);
+  ThisOperator(SourceSpan span): super(span);
   ThisOperator clone() => new ThisOperator(span);
   visit(VisitorBase visitor) => visitor.visitThisOperator(this);
 
@@ -37,7 +37,7 @@
 }
 
 class Negation extends TreeNode {
-  Negation(Span span): super(span);
+  Negation(SourceSpan span): super(span);
   Negation clone() => new Negation(span);
   visit(VisitorBase visitor) => visitor.visitNegation(this);
 
@@ -48,14 +48,14 @@
 class CssComment extends TreeNode {
   final String comment;
 
-  CssComment(this.comment, Span span): super(span);
+  CssComment(this.comment, SourceSpan span): super(span);
   CssComment clone() => new CssComment(comment, span);
   visit(VisitorBase visitor) => visitor.visitCssComment(this);
 }
 
 // CDO/CDC (Comment Definition Open <!-- and Comment Definition Close -->).
 class CommentDefinition extends CssComment {
-  CommentDefinition(String comment, Span span): super(comment, span);
+  CommentDefinition(String comment, SourceSpan span): super(comment, span);
   CommentDefinition clone() => new CommentDefinition(comment, span);
   visit(VisitorBase visitor) => visitor.visitCommentDefinition(this);
 }
@@ -63,7 +63,7 @@
 class SelectorGroup extends TreeNode {
   final List<Selector> selectors;
 
-  SelectorGroup(this.selectors, Span span): super(span);
+  SelectorGroup(this.selectors, SourceSpan span): super(span);
 
   SelectorGroup clone() => new SelectorGroup(selectors, span);
 
@@ -73,7 +73,7 @@
 class Selector extends TreeNode {
   final List<SimpleSelectorSequence> simpleSelectorSequences;
 
-  Selector(this.simpleSelectorSequences, Span span) : super(span);
+  Selector(this.simpleSelectorSequences, SourceSpan span) : super(span);
 
   void add(SimpleSelectorSequence seq) => simpleSelectorSequences.add(seq);
 
@@ -95,7 +95,7 @@
   int combinator;
   final SimpleSelector simpleSelector;
 
-  SimpleSelectorSequence(this.simpleSelector, Span span,
+  SimpleSelectorSequence(this.simpleSelector, SourceSpan span,
       [int combinator = TokenKind.COMBINATOR_NONE])
       : combinator = combinator, super(span);
 
@@ -126,7 +126,7 @@
 abstract class SimpleSelector extends TreeNode {
   final _name; // Wildcard, ThisOperator, Identifier, Negation, others?
 
-  SimpleSelector(this._name, Span span) : super(span);
+  SimpleSelector(this._name, SourceSpan span) : super(span);
 
   String get name => _name.name;
 
@@ -139,7 +139,7 @@
 
 // element name
 class ElementSelector extends SimpleSelector {
-  ElementSelector(name, Span span) : super(name, span);
+  ElementSelector(name, SourceSpan span) : super(name, span);
   visit(VisitorBase visitor) => visitor.visitElementSelector(this);
 
   ElementSelector clone() => new ElementSelector(_name, span);
@@ -151,7 +151,8 @@
 class NamespaceSelector extends SimpleSelector {
   final _namespace;           // null, Wildcard or Identifier
 
-  NamespaceSelector(this._namespace, var name, Span span) : super(name, span);
+  NamespaceSelector(this._namespace, var name, SourceSpan span)
+      : super(name, span);
 
   String get namespace =>
       _namespace is Wildcard ? '*' : _namespace == null ? '' : _namespace.name;
@@ -173,7 +174,7 @@
   final _value;
 
   AttributeSelector(Identifier name, this._op, this._value,
-      Span span) : super(name, span);
+      SourceSpan span) : super(name, span);
 
   int get operatorKind => _op;
 
@@ -237,7 +238,7 @@
 
 // #id
 class IdSelector extends SimpleSelector {
-  IdSelector(Identifier name, Span span) : super(name, span);
+  IdSelector(Identifier name, SourceSpan span) : super(name, span);
   IdSelector clone() => new IdSelector(_name, span);
   visit(VisitorBase visitor) => visitor.visitIdSelector(this);
 
@@ -246,7 +247,7 @@
 
 // .class
 class ClassSelector extends SimpleSelector {
-  ClassSelector(Identifier name, Span span) : super(name, span);
+  ClassSelector(Identifier name, SourceSpan span) : super(name, span);
   ClassSelector clone() => new ClassSelector(_name, span);
   visit(VisitorBase visitor) => visitor.visitClassSelector(this);
 
@@ -255,7 +256,7 @@
 
 // :pseudoClass
 class PseudoClassSelector extends SimpleSelector {
-  PseudoClassSelector(Identifier name, Span span) : super(name, span);
+  PseudoClassSelector(Identifier name, SourceSpan span) : super(name, span);
   visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this);
 
   PseudoClassSelector clone() => new PseudoClassSelector(_name, span);
@@ -265,7 +266,7 @@
 
 // ::pseudoElement
 class PseudoElementSelector extends SimpleSelector {
-  PseudoElementSelector(Identifier name, Span span) : super(name, span);
+  PseudoElementSelector(Identifier name, SourceSpan span) : super(name, span);
   visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this);
 
   PseudoElementSelector clone() => new PseudoElementSelector(_name, span);
@@ -277,7 +278,7 @@
 class PseudoClassFunctionSelector extends PseudoClassSelector {
   final SelectorExpression expression;
 
-  PseudoClassFunctionSelector(Identifier name, this.expression, Span span)
+  PseudoClassFunctionSelector(Identifier name, this.expression, SourceSpan span)
       : super(name, span);
 
   PseudoClassFunctionSelector clone() =>
@@ -291,7 +292,8 @@
 class PseudoElementFunctionSelector extends PseudoElementSelector {
   final SelectorExpression expression;
 
-  PseudoElementFunctionSelector(Identifier name, this.expression, Span span)
+  PseudoElementFunctionSelector(Identifier name, this.expression,
+          SourceSpan span)
       : super(name, span);
 
   PseudoElementFunctionSelector clone() =>
@@ -304,7 +306,7 @@
 class SelectorExpression extends TreeNode {
   final List<Expression> expressions;
 
-  SelectorExpression(this.expressions, Span span): super(span);
+  SelectorExpression(this.expressions, SourceSpan span): super(span);
 
   SelectorExpression clone() {
     return new SelectorExpression(
@@ -318,7 +320,7 @@
 class NegationSelector extends SimpleSelector {
   final SimpleSelector negationArg;
 
-  NegationSelector(this.negationArg, Span span)
+  NegationSelector(this.negationArg, SourceSpan span)
       : super(new Negation(span), span);
 
   NegationSelector clone() => new NegationSelector(negationArg, span);
@@ -340,14 +342,14 @@
    */
   final List<TreeNode> topLevels;
 
-  StyleSheet(this.topLevels, Span span) : super(span) {
+  StyleSheet(this.topLevels, SourceSpan span) : super(span) {
     for (final node in topLevels) {
       assert(node is TopLevelProduction || node is Directive);
     }
   }
 
   /** Selectors only in this tree. */
-  StyleSheet.selector(this.topLevels, Span span) : super(span);
+  StyleSheet.selector(this.topLevels, SourceSpan span) : super(span);
 
   StyleSheet clone() {
     var clonedTopLevels = topLevels.map((e) => e.clone()).toList();
@@ -358,7 +360,7 @@
 }
 
 class TopLevelProduction extends TreeNode {
-  TopLevelProduction(Span span) : super(span);
+  TopLevelProduction(SourceSpan span) : super(span);
   TopLevelProduction clone() => new TopLevelProduction(span);
   visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this);
 }
@@ -367,7 +369,8 @@
   final SelectorGroup _selectorGroup;
   final DeclarationGroup _declarationGroup;
 
-  RuleSet(this._selectorGroup, this._declarationGroup, Span span) : super(span);
+  RuleSet(this._selectorGroup, this._declarationGroup, SourceSpan span)
+      : super(span);
 
   SelectorGroup get selectorGroup => _selectorGroup;
   DeclarationGroup get declarationGroup => _declarationGroup;
@@ -382,7 +385,7 @@
 }
 
 class Directive extends TreeNode {
-  Directive(Span span) : super(span);
+  Directive(SourceSpan span) : super(span);
 
   bool get isBuiltIn => true;       // Known CSS directive?
   bool get isExtension => false;    // SCSS extension?
@@ -398,7 +401,8 @@
   /** Any media queries for this import. */
   final List<MediaQuery> mediaQueries;
 
-  ImportDirective(this.import, this.mediaQueries, Span span) : super(span);
+  ImportDirective(this.import, this.mediaQueries, SourceSpan span)
+      : super(span);
 
   ImportDirective clone() {
     var cloneMediaQueries = [];
@@ -420,7 +424,8 @@
   final Identifier _mediaFeature;
   final Expressions exprs;
 
-  MediaExpression(this.andOperator, this._mediaFeature, this.exprs, Span span)
+  MediaExpression(this.andOperator, this._mediaFeature, this.exprs,
+          SourceSpan span)
       : super(span);
 
   String get mediaFeature => _mediaFeature.name;
@@ -450,7 +455,8 @@
   final Identifier _mediaType;
   final List<MediaExpression> expressions;
 
-  MediaQuery(this._mediaUnary, this._mediaType, this.expressions, Span span)
+  MediaQuery(this._mediaUnary, this._mediaType, this.expressions,
+          SourceSpan span)
       : super(span);
 
   bool get hasMediaType => _mediaType != null;
@@ -474,7 +480,8 @@
   final List<MediaQuery> mediaQueries;
   final List<RuleSet> rulesets;
 
-  MediaDirective(this.mediaQueries, this.rulesets, Span span) : super(span);
+  MediaDirective(this.mediaQueries, this.rulesets, SourceSpan span)
+      : super(span);
 
   MediaDirective clone() {
     var cloneQueries = [];
@@ -494,7 +501,7 @@
 class HostDirective extends Directive {
   final List<RuleSet> rulesets;
 
-  HostDirective(this.rulesets, Span span) : super(span);
+  HostDirective(this.rulesets, SourceSpan span) : super(span);
 
   HostDirective clone() {
     var cloneRulesets = [];
@@ -513,7 +520,7 @@
   final List<DeclarationGroup> _declsMargin;
 
   PageDirective(this._ident, this._pseudoPage, this._declsMargin,
-      Span span) : super(span);
+      SourceSpan span) : super(span);
 
   PageDirective clone() {
     var cloneDeclsMargin = [];
@@ -532,7 +539,7 @@
 class CharsetDirective extends Directive {
   final String charEncoding;
 
-  CharsetDirective(this.charEncoding, Span span) : super(span);
+  CharsetDirective(this.charEncoding, SourceSpan span) : super(span);
   CharsetDirective clone() => new CharsetDirective(charEncoding, span);
   visit(VisitorBase visitor) => visitor.visitCharsetDirective(this);
 }
@@ -545,7 +552,7 @@
   final name;
   final List<KeyFrameBlock> _blocks;
 
-  KeyFrameDirective(this._keyframeName, this.name, Span span)
+  KeyFrameDirective(this._keyframeName, this.name, SourceSpan span)
       : _blocks = [], super(span);
 
   add(KeyFrameBlock block) {
@@ -577,7 +584,7 @@
   final Expressions _blockSelectors;
   final DeclarationGroup _declarations;
 
-  KeyFrameBlock(this._blockSelectors, this._declarations, Span span)
+  KeyFrameBlock(this._blockSelectors, this._declarations, SourceSpan span)
       : super(span);
 
   KeyFrameBlock clone() =>
@@ -588,7 +595,7 @@
 class FontFaceDirective extends Directive {
   final DeclarationGroup _declarations;
 
-  FontFaceDirective(this._declarations, Span span) : super(span);
+  FontFaceDirective(this._declarations, SourceSpan span) : super(span);
 
   FontFaceDirective clone() =>
       new FontFaceDirective(_declarations.clone(), span);
@@ -599,7 +606,8 @@
   final String dartClassName;
   final List<RuleSet> rulesets;
 
-  StyletDirective(this.dartClassName, this.rulesets, Span span) : super(span);
+  StyletDirective(this.dartClassName, this.rulesets, SourceSpan span)
+     : super(span);
 
   bool get isBuiltIn => false;
   bool get isExtension => true;
@@ -622,7 +630,7 @@
   /** URI associated with this namespace. */
   final String _uri;
 
-  NamespaceDirective(this._prefix, this._uri, Span span) : super(span);
+  NamespaceDirective(this._prefix, this._uri, SourceSpan span) : super(span);
 
   NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span);
 
@@ -635,7 +643,7 @@
 class VarDefinitionDirective extends Directive {
   final VarDefinition def;
 
-  VarDefinitionDirective(this.def, Span span) : super(span);
+  VarDefinitionDirective(this.def, SourceSpan span) : super(span);
 
   VarDefinitionDirective clone() =>
       new VarDefinitionDirective(def.clone(), span);
@@ -648,7 +656,7 @@
   final List definedArgs;
   final bool varArgs;
 
-  MixinDefinition(this.name, this.definedArgs, this.varArgs, Span span)
+  MixinDefinition(this.name, this.definedArgs, this.varArgs, SourceSpan span)
       : super(span);
 
   MixinDefinition clone() {
@@ -667,7 +675,7 @@
   final List<RuleSet> rulesets;
 
   MixinRulesetDirective(String name, List<VarDefinitionDirective> args,
-      bool varArgs, this.rulesets, Span span) :
+      bool varArgs, this.rulesets, SourceSpan span) :
       super(name, args, varArgs, span);
 
   MixinRulesetDirective clone() {
@@ -690,7 +698,7 @@
   final DeclarationGroup declarations;
 
   MixinDeclarationDirective(String name, List<VarDefinitionDirective>  args,
-      bool varArgs, this.declarations, Span span) :
+      bool varArgs, this.declarations, SourceSpan span) :
       super(name, args, varArgs, span);
 
   MixinDeclarationDirective clone() {
@@ -710,7 +718,7 @@
   final String name;
   final List<List<TreeNode>> args;
 
-  IncludeDirective(this.name, this.args, Span span) : super(span);
+  IncludeDirective(this.name, this.args, SourceSpan span) : super(span);
 
   IncludeDirective clone() {
     var cloneArgs = [];
@@ -727,7 +735,7 @@
 
 /** To support SASS @content. */
 class ContentDirective extends Directive {
-  ContentDirective(Span span) : super(span);
+  ContentDirective(SourceSpan span) : super(span);
 
   visit(VisitorBase visitor) => visitor.visitContentDirective(this);
 }
@@ -749,7 +757,7 @@
    */
   final bool isIE7;
 
-  Declaration(this._property, this._expression, this.dartStyle, Span span,
+  Declaration(this._property, this._expression, this.dartStyle, SourceSpan span,
               {important: false, ie7: false})
       : this.important = important, this.isIE7 = ie7, super(span);
 
@@ -774,7 +782,7 @@
 class VarDefinition extends Declaration {
   bool badUsage = false;
 
-  VarDefinition(Identifier definedName, Expression expr, Span span)
+  VarDefinition(Identifier definedName, Expression expr, SourceSpan span)
       : super(definedName, expr, null, span);
 
   String get definedName => _property.name;
@@ -796,7 +804,7 @@
 class IncludeMixinAtDeclaration extends Declaration {
   final IncludeDirective include;
 
-  IncludeMixinAtDeclaration(this.include, Span span)
+  IncludeMixinAtDeclaration(this.include, SourceSpan span)
       : super(null, null, null, span);
 
   IncludeMixinAtDeclaration clone() =>
@@ -809,7 +817,7 @@
 class ExtendDeclaration extends Declaration {
   final List<TreeNode> selectors;
 
-  ExtendDeclaration(this.selectors, Span span) :
+  ExtendDeclaration(this.selectors, SourceSpan span) :
       super(null, null, null, span);
 
   ExtendDeclaration clone() {
@@ -824,7 +832,7 @@
   /** Can be either Declaration or RuleSet (if nested selector). */
   final List declarations;
 
-  DeclarationGroup(this.declarations, Span span) : super(span);
+  DeclarationGroup(this.declarations, SourceSpan span) : super(span);
 
   DeclarationGroup clone() {
     var clonedDecls = declarations.map((d) => d.clone()).toList();
@@ -837,7 +845,7 @@
 class MarginGroup extends DeclarationGroup {
   final int margin_sym;       // TokenType for for @margin sym.
 
-  MarginGroup(this.margin_sym, List<Declaration> decls, Span span)
+  MarginGroup(this.margin_sym, List<Declaration> decls, SourceSpan span)
       : super(decls, span);
   MarginGroup clone() =>
     new MarginGroup(margin_sym, super.clone() as dynamic, span);
@@ -848,7 +856,7 @@
   final String name;
   final List<Expression> defaultValues;
 
-  VarUsage(this.name, this.defaultValues, Span span) : super(span);
+  VarUsage(this.name, this.defaultValues, SourceSpan span) : super(span);
 
   VarUsage clone() {
     var clonedValues = [];
@@ -862,25 +870,25 @@
 }
 
 class OperatorSlash extends Expression {
-  OperatorSlash(Span span) : super(span);
+  OperatorSlash(SourceSpan span) : super(span);
   OperatorSlash clone() => new OperatorSlash(span);
   visit(VisitorBase visitor) => visitor.visitOperatorSlash(this);
 }
 
 class OperatorComma extends Expression {
-  OperatorComma(Span span) : super(span);
+  OperatorComma(SourceSpan span) : super(span);
   OperatorComma clone() => new OperatorComma(span);
   visit(VisitorBase visitor) => visitor.visitOperatorComma(this);
 }
 
 class OperatorPlus extends Expression {
-  OperatorPlus(Span span) : super(span);
+  OperatorPlus(SourceSpan span) : super(span);
   OperatorPlus clone() => new OperatorPlus(span);
   visit(VisitorBase visitor) => visitor.visitOperatorPlus(this);
 }
 
 class OperatorMinus extends Expression {
-  OperatorMinus(Span span) : super(span);
+  OperatorMinus(SourceSpan span) : super(span);
   OperatorMinus clone() => new OperatorMinus(span);
   visit(VisitorBase visitor) => visitor.visitOperatorMinus(this);
 }
@@ -889,7 +897,7 @@
   final String first;
   final String second;
 
-  UnicodeRangeTerm(this.first, this.second, Span span) : super(span);
+  UnicodeRangeTerm(this.first, this.second, SourceSpan span) : super(span);
 
   bool get hasSecond => second != null;
 
@@ -905,7 +913,7 @@
   dynamic value;
   String text;
 
-  LiteralTerm(this.value, this.text, Span span) : super(span);
+  LiteralTerm(this.value, this.text, SourceSpan span) : super(span);
 
   LiteralTerm clone() => new LiteralTerm(value, text, span);
 
@@ -913,7 +921,7 @@
 }
 
 class NumberTerm extends LiteralTerm {
-  NumberTerm(value, String t, Span span) : super(value, t, span);
+  NumberTerm(value, String t, SourceSpan span) : super(value, t, span);
   NumberTerm clone() => new NumberTerm(value, text, span);
   visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
 }
@@ -921,7 +929,7 @@
 class UnitTerm extends LiteralTerm {
   final int unit;
 
-  UnitTerm(value, String t, Span span, this.unit) : super(value, t, span);
+  UnitTerm(value, String t, SourceSpan span, this.unit) : super(value, t, span);
 
   UnitTerm clone() => new UnitTerm(value, text, span, unit);
 
@@ -933,7 +941,7 @@
 }
 
 class LengthTerm extends UnitTerm {
-  LengthTerm(value, String t, Span span,
+  LengthTerm(value, String t, SourceSpan span,
       [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
     assert(this.unit == TokenKind.UNIT_LENGTH_PX ||
         this.unit == TokenKind.UNIT_LENGTH_CM ||
@@ -947,25 +955,25 @@
 }
 
 class PercentageTerm extends LiteralTerm {
-  PercentageTerm(value, String t, Span span) : super(value, t, span);
+  PercentageTerm(value, String t, SourceSpan span) : super(value, t, span);
   PercentageTerm clone() => new PercentageTerm(value, text, span);
   visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
 }
 
 class EmTerm extends LiteralTerm {
-  EmTerm(value, String t, Span span) : super(value, t, span);
+  EmTerm(value, String t, SourceSpan span) : super(value, t, span);
   EmTerm clone() => new EmTerm(value, text, span);
   visit(VisitorBase visitor) => visitor.visitEmTerm(this);
 }
 
 class ExTerm extends LiteralTerm {
-  ExTerm(value, String t, Span span) : super(value, t, span);
+  ExTerm(value, String t, SourceSpan span) : super(value, t, span);
   ExTerm clone() => new ExTerm(value, text, span);
   visit(VisitorBase visitor) => visitor.visitExTerm(this);
 }
 
 class AngleTerm extends UnitTerm {
-  AngleTerm(var value, String t, Span span,
+  AngleTerm(var value, String t, SourceSpan span,
     [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
     assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
         this.unit == TokenKind.UNIT_ANGLE_RAD ||
@@ -978,7 +986,7 @@
 }
 
 class TimeTerm extends UnitTerm {
-  TimeTerm(var value, String t, Span span,
+  TimeTerm(var value, String t, SourceSpan span,
     [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
     assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
         this.unit == TokenKind.UNIT_TIME_MS ||
@@ -990,7 +998,7 @@
 }
 
 class FreqTerm extends UnitTerm {
-  FreqTerm(var value, String t, Span span,
+  FreqTerm(var value, String t, SourceSpan span,
     [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
     assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ);
   }
@@ -1000,21 +1008,21 @@
 }
 
 class FractionTerm extends LiteralTerm {
-  FractionTerm(var value, String t, Span span) : super(value, t, span);
+  FractionTerm(var value, String t, SourceSpan span) : super(value, t, span);
 
   FractionTerm clone() => new FractionTerm(value, text, span);
   visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
 }
 
 class UriTerm extends LiteralTerm {
-  UriTerm(String value, Span span) : super(value, value, span);
+  UriTerm(String value, SourceSpan span) : super(value, value, span);
 
   UriTerm clone() => new UriTerm(value, span);
   visit(VisitorBase visitor) => visitor.visitUriTerm(this);
 }
 
 class ResolutionTerm extends UnitTerm {
-  ResolutionTerm(var value, String t, Span span,
+  ResolutionTerm(var value, String t, SourceSpan span,
     [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
     assert(unit == TokenKind.UNIT_RESOLUTION_DPI ||
         unit == TokenKind.UNIT_RESOLUTION_DPCM ||
@@ -1026,7 +1034,7 @@
 }
 
 class ChTerm extends UnitTerm {
-  ChTerm(var value, String t, Span span,
+  ChTerm(var value, String t, SourceSpan span,
     [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
     assert(unit == TokenKind.UNIT_CH);
   }
@@ -1036,7 +1044,7 @@
 }
 
 class RemTerm extends UnitTerm {
-  RemTerm(var value, String t, Span span,
+  RemTerm(var value, String t, SourceSpan span,
     [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
     assert(unit == TokenKind.UNIT_REM);
   }
@@ -1046,7 +1054,7 @@
 }
 
 class ViewportTerm extends UnitTerm {
-  ViewportTerm(var value, String t, Span span,
+  ViewportTerm(var value, String t, SourceSpan span,
     [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
     assert(unit == TokenKind.UNIT_VIEWPORT_VW ||
         unit == TokenKind.UNIT_VIEWPORT_VH ||
@@ -1062,7 +1070,7 @@
 class BAD_HEX_VALUE { }
 
 class HexColorTerm extends LiteralTerm {
-  HexColorTerm(var value, String t, Span span) : super(value, t, span);
+  HexColorTerm(var value, String t, SourceSpan span) : super(value, t, span);
 
   HexColorTerm clone() => new HexColorTerm(value, text, span);
   visit(VisitorBase visitor) => visitor.visitHexColorTerm(this);
@@ -1071,7 +1079,7 @@
 class FunctionTerm extends LiteralTerm {
   final Expressions _params;
 
-  FunctionTerm(var value, String t, this._params, Span span)
+  FunctionTerm(var value, String t, this._params, SourceSpan span)
       : super(value, t, span);
 
   FunctionTerm clone() => new FunctionTerm(value, text, _params.clone(), span);
@@ -1084,7 +1092,7 @@
  * browsers.
  */
 class IE8Term extends LiteralTerm {
-  IE8Term(Span span) : super('\\9', '\\9', span);
+  IE8Term(SourceSpan span) : super('\\9', '\\9', span);
   IE8Term clone() => new IE8Term(span);
   visit(VisitorBase visitor) => visitor.visitIE8Term(this);
 }
@@ -1092,7 +1100,7 @@
 class GroupTerm extends Expression {
   final List<LiteralTerm> _terms;
 
-  GroupTerm(Span span) : _terms =  [], super(span);
+  GroupTerm(SourceSpan span) : _terms =  [], super(span);
 
   void add(LiteralTerm term) {
     _terms.add(term);
@@ -1103,7 +1111,7 @@
 }
 
 class ItemTerm extends NumberTerm {
-  ItemTerm(var value, String t, Span span) : super(value, t, span);
+  ItemTerm(var value, String t, SourceSpan span) : super(value, t, span);
 
   ItemTerm clone() => new ItemTerm(value, text, span);
   visit(VisitorBase visitor) => visitor.visitItemTerm(this);
@@ -1112,7 +1120,7 @@
 class Expressions extends Expression {
   final List<Expression> expressions = [];
 
-  Expressions(Span span): super(span);
+  Expressions(SourceSpan span): super(span);
 
   void add(Expression expression) {
     expressions.add(expression);
@@ -1133,7 +1141,7 @@
   final Expression x;
   final Expression y;
 
-  BinaryExpression(this.op, this.x, this.y, Span span): super(span);
+  BinaryExpression(this.op, this.x, this.y, SourceSpan span): super(span);
 
   BinaryExpression clone() =>
       new BinaryExpression(op, x.clone(), y.clone(), span);
@@ -1144,7 +1152,7 @@
   final Token op;
   final Expression self;
 
-  UnaryExpression(this.op, this.self, Span span): super(span);
+  UnaryExpression(this.op, this.self, SourceSpan span): super(span);
 
   UnaryExpression clone() => new UnaryExpression(op, self.clone(), span);
   visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
@@ -1162,7 +1170,7 @@
   final int _styleType;
   int priority;
 
-  DartStyleExpression(this._styleType, Span span) : super(span);
+  DartStyleExpression(this._styleType, SourceSpan span) : super(span);
 
   /*
    * Merges give 2 DartStyleExpression (or derived from DartStyleExpression,
@@ -1191,7 +1199,7 @@
   //   font-style font-variant font-weight font-size/line-height font-family
   // TODO(terry): Only px/pt for now need to handle all possible units to
   //              support calc expressions on units.
-  FontExpression(Span span, {dynamic size, List<String> family,
+  FontExpression(SourceSpan span, {dynamic size, List<String> family,
       int weight, String style, String variant, LineHeight lineHeight}) :
         font = new Font(size : size is LengthTerm ? size.value : size,
             family: family, weight: weight, style: style, variant: variant,
@@ -1213,7 +1221,7 @@
     return new FontExpression._merge(x, y, y.span);
   }
 
-  FontExpression._merge(FontExpression x, FontExpression y, Span span)
+  FontExpression._merge(FontExpression x, FontExpression y, SourceSpan span)
       : super(DartStyleExpression.fontStyle, span),
         font = new Font.merge(x.font, y.font);
 
@@ -1228,7 +1236,7 @@
 abstract class BoxExpression extends DartStyleExpression {
   final BoxEdge box;
 
-  BoxExpression(int styleType, Span span, this.box)
+  BoxExpression(int styleType, SourceSpan span, this.box)
       : super(styleType, span);
 
   /*
@@ -1257,11 +1265,11 @@
 class MarginExpression extends BoxExpression {
   // TODO(terry): Does auto for margin need to be exposed to Dart UI framework?
   /** Margin expression ripped apart. */
-  MarginExpression(Span span, {num top, num right, num bottom, num left})
+  MarginExpression(SourceSpan span, {num top, num right, num bottom, num left})
       : super(DartStyleExpression.marginStyle, span,
               new BoxEdge(left, top, right, bottom));
 
-  MarginExpression.boxEdge(Span span, BoxEdge box)
+  MarginExpression.boxEdge(SourceSpan span, BoxEdge box)
       : super(DartStyleExpression.marginStyle, span, box);
 
   merged(MarginExpression newMarginExpr) {
@@ -1279,7 +1287,8 @@
     return new MarginExpression._merge(x, y, y.span);
   }
 
-  MarginExpression._merge(MarginExpression x, MarginExpression y, Span span)
+  MarginExpression._merge(MarginExpression x, MarginExpression y,
+          SourceSpan span)
       : super(x._styleType, span, new BoxEdge.merge(x.box, y.box));
 
   MarginExpression clone() =>
@@ -1291,11 +1300,11 @@
 
 class BorderExpression extends BoxExpression {
   /** Border expression ripped apart. */
-  BorderExpression(Span span, {num top, num right, num bottom, num left})
+  BorderExpression(SourceSpan span, {num top, num right, num bottom, num left})
       : super(DartStyleExpression.borderStyle, span,
               new BoxEdge(left, top, right, bottom));
 
-  BorderExpression.boxEdge(Span span, BoxEdge box)
+  BorderExpression.boxEdge(SourceSpan span, BoxEdge box)
       : super(DartStyleExpression.borderStyle, span, box);
 
   merged(BorderExpression newBorderExpr) {
@@ -1314,7 +1323,7 @@
   }
 
   BorderExpression._merge(BorderExpression x, BorderExpression y,
-      Span span)
+      SourceSpan span)
       : super(DartStyleExpression.borderStyle, span,
               new BoxEdge.merge(x.box, y.box));
 
@@ -1328,7 +1337,7 @@
 class HeightExpression extends DartStyleExpression {
   final height;
 
-  HeightExpression(Span span, this.height)
+  HeightExpression(SourceSpan span, this.height)
       : super(DartStyleExpression.heightStyle, span);
 
   merged(HeightExpression newHeightExpr) {
@@ -1346,7 +1355,7 @@
 class WidthExpression extends DartStyleExpression {
   final width;
 
-  WidthExpression(Span span, this.width)
+  WidthExpression(SourceSpan span, this.width)
       : super(DartStyleExpression.widthStyle, span);
 
   merged(WidthExpression newWidthExpr) {
@@ -1363,11 +1372,11 @@
 
 class PaddingExpression extends BoxExpression {
   /** Padding expression ripped apart. */
-  PaddingExpression(Span span, {num top, num right, num bottom, num left})
+  PaddingExpression(SourceSpan span, {num top, num right, num bottom, num left})
       : super(DartStyleExpression.paddingStyle, span,
               new BoxEdge(left, top, right, bottom));
 
-  PaddingExpression.boxEdge(Span span, BoxEdge box)
+  PaddingExpression.boxEdge(SourceSpan span, BoxEdge box)
       : super(DartStyleExpression.paddingStyle, span, box);
 
   merged(PaddingExpression newPaddingExpr) {
@@ -1385,7 +1394,8 @@
     return new PaddingExpression._merge(x, y, y.span);
   }
 
-  PaddingExpression._merge(PaddingExpression x, PaddingExpression y, Span span)
+  PaddingExpression._merge(PaddingExpression x, PaddingExpression y,
+          SourceSpan span)
       : super(DartStyleExpression.paddingStyle, span,
             new BoxEdge.merge(x.box, y.box));
 
diff --git a/pkg/csslib/lib/src/tree_base.dart b/pkg/csslib/lib/src/tree_base.dart
index 6dc27b1..35aef13 100644
--- a/pkg/csslib/lib/src/tree_base.dart
+++ b/pkg/csslib/lib/src/tree_base.dart
@@ -9,7 +9,7 @@
  */
 abstract class TreeNode {
   /** The source code this [TreeNode] represents. */
-  final Span span;
+  final SourceSpan span;
 
   TreeNode(this.span);
 
@@ -29,7 +29,7 @@
 
 /** The base type for expressions. */
 abstract class Expression extends TreeNode {
-  Expression(Span span): super(span);
+  Expression(SourceSpan span): super(span);
 }
 
 /** Simple class to provide a textual dump of trees for debugging. */
@@ -53,7 +53,7 @@
   void heading(String name, [span]) {
     write(name);
     if (span != null) {
-      buf.write('  (${span.getLocationMessage('')})');
+      buf.write('  (${span.message('')})');
     }
     buf.write('\n');
   }
diff --git a/pkg/csslib/lib/src/validate.dart b/pkg/csslib/lib/src/validate.dart
index d85c341..bc3a6ad 100644
--- a/pkg/csslib/lib/src/validate.dart
+++ b/pkg/csslib/lib/src/validate.dart
@@ -5,19 +5,12 @@
 library csslib.src.validate;
 
 import 'package:csslib/visitor.dart';
-import 'package:source_maps/span.dart' show Span;
+import 'package:source_span/source_span.dart';
 
 /** Can be thrown on any Css runtime problem includes source location. */
-class CssSelectorException implements Exception {
-  final String _message;
-  final Span _span;
-
-  CssSelectorException(this._message, [this._span]);
-
-  String toString() {
-    var msg = _span == null ? _message : _span.getLocationMessage(_message);
-    return 'CssSelectorException: $msg';
-  }
+class CssSelectorException extends SourceSpanException {
+  CssSelectorException(String message, [SourceSpan span])
+      : super(message, span);
 }
 
 List<String> classes = [];
diff --git a/pkg/csslib/lib/visitor.dart b/pkg/csslib/lib/visitor.dart
index 8174af9..aac7242 100644
--- a/pkg/csslib/lib/visitor.dart
+++ b/pkg/csslib/lib/visitor.dart
@@ -4,7 +4,7 @@
 
 library csslib.visitor;
 
-import 'package:source_maps/span.dart' show Span;
+import 'package:source_span/source_span.dart';
 import 'parser.dart';
 
 part 'src/css_printer.dart';
diff --git a/pkg/csslib/pubspec.yaml b/pkg/csslib/pubspec.yaml
index e1d0afe..46c34cb 100644
--- a/pkg/csslib/pubspec.yaml
+++ b/pkg/csslib/pubspec.yaml
@@ -1,5 +1,5 @@
 name: csslib
-version: 0.10.0+1
+version: 0.11.0+2
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: A library for parsing CSS.
 homepage: https://www.dartlang.org
@@ -9,7 +9,7 @@
   args: '>=0.9.0 <0.13.0'
   logging: '>=0.9.0 <0.10.0'
   path: '>=0.9.0 <2.0.0'
-  source_maps: '>=0.9.1 <0.10.0'
+  source_span: '>=1.0.0 <2.0.0'
 dev_dependencies:
   browser: '>=0.9.0 <0.10.0'
   unittest: '>=0.9.0 <0.10.0'
diff --git a/pkg/csslib/test/declaration_test.dart b/pkg/csslib/test/declaration_test.dart
index ce46f5d..857df48 100644
--- a/pkg/csslib/test/declaration_test.dart
+++ b/pkg/csslib/test/declaration_test.dart
@@ -1012,7 +1012,7 @@
   expect(errorMessage.span, isNotNull);
   expect(errorMessage.span.start.line, 7);
   expect(errorMessage.span.start.column, 0);
-  expect(errorMessage.span.text, '');
+  expect(errorMessage.span.text.trim(), '');
 }
 
 main() {
diff --git a/pkg/csslib/test/mixin_test.dart b/pkg/csslib/test/mixin_test.dart
index 853dfc4..6d3b71e 100644
--- a/pkg/csslib/test/mixin_test.dart
+++ b/pkg/csslib/test/mixin_test.dart
@@ -617,7 +617,7 @@
   expect(error.span.start.line, 9);
   expect(error.span.end.offset, 83);
   error = errors[3];
-  expect(error.message, 'expected {, but found end of file(\n)');
+  expect(error.message, 'expected {, but found end of file()');
   expect(error.span.start.line, 9);
   expect(error.span.end.offset, 86);
   error = errors[4];
diff --git a/pkg/fixnum/lib/src/int64.dart b/pkg/fixnum/lib/src/int64.dart
index 1fac096..de30656 100644
--- a/pkg/fixnum/lib/src/int64.dart
+++ b/pkg/fixnum/lib/src/int64.dart
@@ -14,6 +14,13 @@
   // integers, storing the 22 low, 22 middle, and 20 high bits of the
   // 64-bit value.  _l (low) and _m (middle) are in the range
   // [0, 2^22 - 1] and _h (high) is in the range [0, 2^20 - 1].
+  //
+  // The values being assigned to _l, _m and _h in initialization are masked to
+  // force them into the above ranges.  Sometimes we know that the value is a
+  // small non-negative integer but the dart2js compiler can't infer that, so a
+  // few of the masking operations are not needed for correctness but are
+  // helpful for dart2js code quality.
+
   final int _l, _m, _h;
 
   // Note: several functions require _BITS == 22 -- do not change this value.
@@ -141,11 +148,11 @@
     }
 
     if (negative) {
-      v0 = _MASK & ~v0;
-      v1 = _MASK & ~v1;
-      v2 = _MASK2 & ~v2;
+      v0 = ~v0;
+      v1 = ~v1;
+      v2 = ~v2;
     }
-    return new Int64._bits(v0, v1, v2);
+    return Int64._masked(v0, v1, v2);
   }
 
   factory Int64.fromBytes(List<int> bytes) {
@@ -593,12 +600,14 @@
       return Int64._masked(_l, _m, _h.toSigned(width - _BITS01));
     } else if (width > _BITS) {
       int m = _m.toSigned(width - _BITS);
-      return m.isNegative ? Int64._masked(_l, m, _MASK2) :
-          new Int64._bits(_l, m, 0);
+      return m.isNegative
+          ? Int64._masked(_l, m, _MASK2)
+          : Int64._masked(_l, m, 0);  // Masking for type inferrer.
     } else {
       int l = _l.toSigned(width);
-      return l.isNegative ? Int64._masked(l, _MASK, _MASK2) :
-          new Int64._bits(l, 0, 0);
+      return l.isNegative
+          ? Int64._masked(l, _MASK, _MASK2)
+          : Int64._masked(l, 0, 0);  // Masking for type inferrer.
     }
   }
 
@@ -1024,10 +1033,12 @@
     assert(what == _RETURN_DIV || what == _RETURN_MOD || what == _RETURN_REM);
     if (what == _RETURN_DIV) {
       if (aNeg != bNeg) return _negate(q0, q1, q2);
-      return new Int64._bits(q0, q1, q2);
+      return Int64._masked(q0, q1, q2);  // Masking for type inferrer.
     }
 
-    if (!aNeg) return new Int64._bits(r0, r1, r2);
+    if (!aNeg) {
+      return new Int64._bits(_MASK & r0, r1, r2);  // Masking for type inferrer.
+    }
 
     if (what == _RETURN_MOD) {
       if (r0 == 0 && r1 == 0 && r2 == 0) {
diff --git a/pkg/http_multi_server/CHANGELOG.md b/pkg/http_multi_server/CHANGELOG.md
index ac00908..8cab523 100644
--- a/pkg/http_multi_server/CHANGELOG.md
+++ b/pkg/http_multi_server/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.0.2
+
+* Remove the workaround for [issue 19815][].
+
 ## 1.0.1
 
 * Ignore errors from one of the servers if others are still bound. In
diff --git a/pkg/http_multi_server/lib/http_multi_server.dart b/pkg/http_multi_server/lib/http_multi_server.dart
index da12888..c055367 100644
--- a/pkg/http_multi_server/lib/http_multi_server.dart
+++ b/pkg/http_multi_server/lib/http_multi_server.dart
@@ -99,15 +99,20 @@
   /// [HttpServer.bindSecure].
   static Future<HttpServer> _loopback(int port,
       Future<HttpServer> bind(InternetAddress address, int port)) {
-    return bind(InternetAddress.LOOPBACK_IP_V4, port).then((v4Server) {
+    return Future.wait([
+      supportsIpV6,
+      bind(InternetAddress.LOOPBACK_IP_V4, port)
+    ]).then((results) {
+      var supportsIpV6 = results[0];
+      var v4Server = results[1];
+
+      if (!supportsIpV6) return v4Server;
+
       // Reuse the IPv4 server's port so that if [port] is 0, both servers use
       // the same ephemeral port.
       return bind(InternetAddress.LOOPBACK_IP_V6, v4Server.port)
-          .then((v6Server) => new HttpMultiServer([v4Server, v6Server]))
-          .catchError((error) {
-        // If we fail to bind to IPv6, just use IPv4.
-        if (error is SocketException) return v4Server;
-        throw error;
+          .then((v6Server) {
+        return new HttpMultiServer([v4Server, v6Server]);
       });
     });
   }
diff --git a/pkg/http_multi_server/lib/src/utils.dart b/pkg/http_multi_server/lib/src/utils.dart
index d615975..9e95aba 100644
--- a/pkg/http_multi_server/lib/src/utils.dart
+++ b/pkg/http_multi_server/lib/src/utils.dart
@@ -7,8 +7,6 @@
 import 'dart:async';
 import 'dart:io';
 
-// TODO(nweiz): Revert this to the version of [mergeStreams] found elsewhere in
-// the repo once issue 19815 is fixed in dart:io.
 /// Merges all streams in [streams] into a single stream that emits all of their
 /// values.
 ///
@@ -20,17 +18,9 @@
   controller = new StreamController(onListen: () {
     for (var stream in streams) {
       var subscription;
-      subscription = stream.listen(controller.add, onError: (error, trace) {
-        if (subscriptions.length == 1) {
-          // If the last subscription errored, pass it on.
-          controller.addError(error, trace);
-        } else {
-          // If only one of the subscriptions has an error (usually IPv6 failing
-          // late), then just remove that subscription and ignore the error.
-          subscriptions.remove(subscription);
-          subscription.cancel();
-        }
-      }, onDone: () {
+      subscription = stream.listen(controller.add,
+          onError: controller.addError,
+          onDone: () {
         subscriptions.remove(subscription);
         if (subscriptions.isEmpty) controller.close();
       });
@@ -52,3 +42,21 @@
 
   return controller.stream;
 }
+
+/// A cache for [supportsIpV6].
+bool _supportsIpV6;
+
+/// Returns whether this computer supports binding to IPv6 addresses.
+Future<bool> get supportsIpV6 {
+  if (_supportsIpV6 != null) return new Future.value(_supportsIpV6);
+
+  return ServerSocket.bind(InternetAddress.LOOPBACK_IP_V6, 0).then((socket) {
+    _supportsIpV6 = true;
+    socket.close();
+    return true;
+  }).catchError((error) {
+    if (error is! SocketException) throw error;
+    _supportsIpV6 = false;
+    return false;
+  });
+}
diff --git a/pkg/http_multi_server/pubspec.yaml b/pkg/http_multi_server/pubspec.yaml
index 2bdb4a2..c7361d4 100644
--- a/pkg/http_multi_server/pubspec.yaml
+++ b/pkg/http_multi_server/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http_multi_server
-version: 1.0.1
+version: 1.0.2
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description:
@@ -8,4 +8,4 @@
   unittest: ">=0.11.0 <0.12.0"
   http: ">=0.11.0 <0.12.0"
 environment:
-  sdk: ">=1.4.0 <2.0.0"
+  sdk: ">=1.6.0-dev.6.0 <2.0.0"
diff --git a/pkg/http_multi_server/test/http_multi_server_test.dart b/pkg/http_multi_server/test/http_multi_server_test.dart
index 0140ee7..a3d9062 100644
--- a/pkg/http_multi_server/test/http_multi_server_test.dart
+++ b/pkg/http_multi_server/test/http_multi_server_test.dart
@@ -108,7 +108,7 @@
       expect(http.read("http://127.0.0.1:${server.port}/"),
           completion(equals("got request")));
 
-      return _supportsIpV6.then((supportsIpV6) {
+      return supportsIpV6.then((supportsIpV6) {
         if (!supportsIpV6) return;
         expect(http.read("http://[::1]:${server.port}/"),
             completion(equals("got request")));
@@ -117,26 +117,6 @@
   });
 }
 
-/// A cache for [supportsIpV6].
-bool _supportsIpV6Cache;
-
-// TODO(nweiz): This is known to be inaccurate on Windows machines with IPv6
-// disabled (issue 19815). Tests will fail on such machines.
-/// Returns whether this computer supports binding to IPv6 addresses.
-Future<bool> get _supportsIpV6 {
-  if (_supportsIpV6Cache != null) return new Future.value(_supportsIpV6Cache);
-
-  return ServerSocket.bind(InternetAddress.LOOPBACK_IP_V6, 0).then((socket) {
-    _supportsIpV6Cache = true;
-    socket.close();
-    return true;
-  }).catchError((error) {
-    if (error is! SocketException) throw error;
-    _supportsIpV6Cache = false;
-    return false;
-  });
-}
-
 /// Makes a GET request to the root of [server] and returns the response.
 Future<http.Response> _get(HttpServer server) => http.get(_urlFor(server));
 
diff --git a/pkg/http_server/lib/src/virtual_directory.dart b/pkg/http_server/lib/src/virtual_directory.dart
index bf4e1a5..6dfec5d 100644
--- a/pkg/http_server/lib/src/virtual_directory.dart
+++ b/pkg/http_server/lib/src/virtual_directory.dart
@@ -41,19 +41,36 @@
    */
   bool jailRoot = true;
 
+  final List<String> _pathPrefixSegments;
+
+
   final RegExp _invalidPathRegExp = new RegExp("[\\\/\x00]");
 
   _ErrorCallback _errorCallback;
   _DirCallback _dirCallback;
 
+  static List<String> _parsePathPrefix(String pathPrefix) {
+    if (pathPrefix == null) return <String>[];
+    return new Uri(path: pathPrefix).pathSegments
+        .where((segment) => segment.isNotEmpty)
+        .toList();
+  }
+
   /*
    * Create a new [VirtualDirectory] for serving static file content of
    * the path [root].
    *
    * The [root] is not required to exist. If the [root] doesn't exist at time of
-   * a request, a 404 is generated.
+   * a request, a 404 response is generated.
+   *
+   * If [pathPrefix] is set, [pathPrefix] will indicate the expected path prefix
+   * of incoming requests. When locating the resource on disk, the prefix will
+   * be trimmed from the requests uri, before locating the actual resource.
+   * If the requests uri doesn't start with [pathPrefix], a 404 response is
+   * generated.
    */
-  VirtualDirectory(this.root);
+  VirtualDirectory(this.root, {String pathPrefix})
+      : _pathPrefixSegments = _parsePathPrefix(pathPrefix);
 
   /**
    * Serve a [Stream] of [HttpRequest]s, in this [VirtualDirectory].
@@ -65,7 +82,14 @@
    * Serve a single [HttpRequest], in this [VirtualDirectory].
    */
   Future serveRequest(HttpRequest request) {
-    return _locateResource('.', request.uri.pathSegments.iterator..moveNext())
+    var iterator = request.uri.pathSegments.iterator;
+    for (var segment in _pathPrefixSegments) {
+      if (!iterator.moveNext() || iterator.current != segment) {
+        _serveErrorPage(HttpStatus.NOT_FOUND, request);
+        return request.response.done;
+      }
+    }
+    return _locateResource('.', iterator..moveNext())
         .then((entity) {
           if (entity is File) {
             serveFile(entity, request);
diff --git a/pkg/http_server/pubspec.yaml b/pkg/http_server/pubspec.yaml
index fcdec00..7542e12 100644
--- a/pkg/http_server/pubspec.yaml
+++ b/pkg/http_server/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http_server
-version: 0.9.2+3
+version: 0.9.3
 author: Dart Team <misc@dartlang.org>
 description: Library of HTTP server classes.
 homepage: http://www.dartlang.org
diff --git a/pkg/http_server/test/virtual_directory_test.dart b/pkg/http_server/test/virtual_directory_test.dart
index b95abdc..bc05462 100644
--- a/pkg/http_server/test/virtual_directory_test.dart
+++ b/pkg/http_server/test/virtual_directory_test.dart
@@ -305,6 +305,44 @@
           });
       });
     });
+
+    group('path-prefix', () {
+      testVirtualDir('simple', (dir) {
+        var virDir = new VirtualDirectory(dir.path, pathPrefix: '/path');
+        virDir.allowDirectoryListing = true;
+        virDir.directoryHandler = (d, request) {
+          expect(FileSystemEntity.identicalSync(dir.path, d.path), isTrue);
+          return request.response.close();
+        };
+
+        return getStatusCodeForVirtDir(virDir, '/path')
+          .then((result) {
+            expect(result, HttpStatus.OK);
+          });
+      });
+
+      testVirtualDir('trailing-slash', (dir) {
+        var virDir = new VirtualDirectory(dir.path, pathPrefix: '/path/');
+        virDir.allowDirectoryListing = true;
+        virDir.directoryHandler = (d, request) {
+          expect(FileSystemEntity.identicalSync(dir.path, d.path), isTrue);
+          return request.response.close();
+        };
+
+        return getStatusCodeForVirtDir(virDir, '/path')
+          .then((result) {
+            expect(result, HttpStatus.OK);
+          });
+      });
+
+      testVirtualDir('not-matching', (dir) {
+        var virDir = new VirtualDirectory(dir.path, pathPrefix: '/path/');
+        return getStatusCodeForVirtDir(virDir, '/')
+          .then((result) {
+            expect(result, HttpStatus.NOT_FOUND);
+          });
+      });
+    });
   });
 
   group('links', () {
diff --git a/pkg/intl/CHANGELOG.md b/pkg/intl/CHANGELOG.md
index 1b1d25d..57765c5 100644
--- a/pkg/intl/CHANGELOG.md
+++ b/pkg/intl/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.11.4
+
+ * Broaden the pubspec constraints to allow current analyzer versions.
+
 ## 0.11.3
 
  * Add a --[no]-use-deferred-loading flag to generate_from_arb.dart and 
diff --git a/pkg/intl/lib/generate_localized.dart b/pkg/intl/lib/generate_localized.dart
index 78baaf3..026835b 100644
--- a/pkg/intl/lib/generate_localized.dart
+++ b/pkg/intl/lib/generate_localized.dart
@@ -192,7 +192,7 @@
   output.write("\nMap<String, Function> _deferredLibraries = {\n");
   for (var rawLocale in allLocales) {
     var locale = Intl.canonicalizedLocale(rawLocale);
-    var loadOperation = (useDeferredLoading) 
+    var loadOperation = (useDeferredLoading)
         ? "  '$locale' : () => ${_libraryName(locale)}.loadLibrary(),\n"
         : "  '$locale' : () => new Future.value(null),\n";
     output.write(loadOperation);
@@ -243,7 +243,7 @@
   initializeInternalMessageLookup(() => new CompositeMessageLookup());
   var lib = _deferredLibraries[Intl.canonicalizedLocale(localeName)];
   var load = lib == null ? new Future.value(false) : lib();
-  return load.then((_) => 
+  return load.then((_) =>
       messageLookup.addLocale(localeName, _findGeneratedMessagesFor));
 }
 
diff --git a/pkg/intl/lib/src/http_request_data_reader.dart b/pkg/intl/lib/src/http_request_data_reader.dart
index af0d68f..a79d16f 100644
--- a/pkg/intl/lib/src/http_request_data_reader.dart
+++ b/pkg/intl/lib/src/http_request_data_reader.dart
@@ -28,9 +28,9 @@
     return _getString('$url$locale.json?cacheBlocker=$someNumber', request)
       .then((r) => r.responseText);
   }
-  
+
   /// Read a string with the given request. This is a stripped down copy
-  /// of HttpRequest getString, but was the simplest way I could find to 
+  /// of HttpRequest getString, but was the simplest way I could find to
   /// issue a request with a timeout.
   Future<HttpRequest> _getString(String url, HttpRequest xhr) {
     var completer = new Completer<HttpRequest>();
diff --git a/pkg/intl/pubspec.yaml b/pkg/intl/pubspec.yaml
index f8e4b38..21e2e90 100644
--- a/pkg/intl/pubspec.yaml
+++ b/pkg/intl/pubspec.yaml
@@ -1,12 +1,12 @@
 name: intl
-version: 0.11.3
+version: 0.11.4
 author: Dart Team <misc@dartlang.org>
 description: Contains code to deal with internationalized/localized messages, date and number formatting and parsing, bi-directional text, and other internationalization issues.
 homepage: http://www.dartlang.org
 environment:
   sdk: '>=1.4.0 <2.0.0'
 dependencies:
-  analyzer: '>=0.13.2 <0.16.0'
+  analyzer: '>=0.13.2 <0.23.0'
   path: '>=0.9.0 <2.0.0'
 dev_dependencies:
   petitparser: '>=1.1.3 <2.0.0'
diff --git a/pkg/matcher/CHANGELOG.md b/pkg/matcher/CHANGELOG.md
index e175d94..8e7bd6f 100644
--- a/pkg/matcher/CHANGELOG.md
+++ b/pkg/matcher/CHANGELOG.md
@@ -1,3 +1,13 @@
+## 0.11.1+1
+
+* Refactored libraries and tests.
+
+* Fixed spelling mistake.
+
+## 0.11.1
+
+* Added `isNaN` and `isNotNaN` matchers.
+
 ## 0.11.0
 
 * Removed deprecated matchers.
diff --git a/pkg/matcher/lib/matcher.dart b/pkg/matcher/lib/matcher.dart
index 99fe44b..6fd18cc 100644
--- a/pkg/matcher/lib/matcher.dart
+++ b/pkg/matcher/lib/matcher.dart
@@ -16,3 +16,6 @@
 export 'src/numeric_matchers.dart';
 export 'src/operator_matchers.dart';
 export 'src/string_matchers.dart';
+export 'src/throws_matcher.dart';
+export 'src/throws_matchers.dart';
+export 'src/util.dart';
diff --git a/pkg/matcher/lib/src/core_matchers.dart b/pkg/matcher/lib/src/core_matchers.dart
index cb76d68..8de3a01 100644
--- a/pkg/matcher/lib/src/core_matchers.dart
+++ b/pkg/matcher/lib/src/core_matchers.dart
@@ -4,11 +4,9 @@
 
 library matcher.core_matchers;
 
-import 'dart:async';
-
 import 'description.dart';
-import 'expect.dart';
 import 'interfaces.dart';
+import 'util.dart';
 
 /// Returns a matcher that matches empty strings, maps or iterables
 /// (including collections).
@@ -64,6 +62,24 @@
   Description describe(Description description) => description.add('false');
 }
 
+/// A matcher that matches the numeric value NaN.
+const Matcher isNaN = const _IsNaN();
+
+/// A matcher that matches any non-NaN value.
+const Matcher isNotNaN = const _IsNotNaN();
+
+class _IsNaN extends Matcher {
+  const _IsNaN();
+  bool matches(item, Map matchState) => double.NAN.compareTo(item) == 0;
+  Description describe(Description description) => description.add('NaN');
+}
+
+class _IsNotNaN extends Matcher {
+  const _IsNotNaN();
+  bool matches(item, Map matchState) => double.NAN.compareTo(item) != 0;
+  Description describe(Description description) => description.add('not NaN');
+}
+
 /// Returns a matches that matches if the value is the same instance
 /// as [expected], using [identical].
 Matcher same(expected) => new _IsSameAs(expected);
@@ -372,36 +388,6 @@
       description.add('an instance of ${_name}');
 }
 
-/// This can be used to match two kinds of objects:
-///
-///   * A [Function] that throws an exception when called. The function cannot
-///     take any arguments. If you want to test that a function expecting
-///     arguments throws, wrap it in another zero-argument function that calls
-///     the one you want to test.
-///
-///   * A [Future] that completes with an exception. Note that this creates an
-///     asynchronous expectation. The call to `expect()` that includes this will
-///     return immediately and execution will continue. Later, when the future
-///     completes, the actual expectation will run.
-const Matcher throws = const Throws();
-
-/// This can be used to match two kinds of objects:
-///
-///   * A [Function] that throws an exception when called. The function cannot
-///     take any arguments. If you want to test that a function expecting
-///     arguments throws, wrap it in another zero-argument function that calls
-///     the one you want to test.
-///
-///   * A [Future] that completes with an exception. Note that this creates an
-///     asynchronous expectation. The call to `expect()` that includes this will
-///     return immediately and execution will continue. Later, when the future
-///     completes, the actual expectation will run.
-///
-/// In both cases, when an exception is thrown, this will test that the exception
-/// object matches [matcher]. If [matcher] is not an instance of [Matcher], it
-/// will implicitly be treated as `equals(matcher)`.
-Matcher throwsA(matcher) => new Throws(wrapMatcher(matcher));
-
 /// A matcher that matches a function call against no exception.
 /// The function will be called once. Any exceptions will be silently swallowed.
 /// The value passed to expect() should be a reference to the function.
@@ -409,77 +395,6 @@
 /// a wrapper will have to be created.
 const Matcher returnsNormally = const _ReturnsNormally();
 
-class Throws extends Matcher {
-  final Matcher _matcher;
-
-  const Throws([Matcher matcher]) : this._matcher = matcher;
-
-  bool matches(item, Map matchState) {
-    if (item is! Function && item is! Future) return false;
-    if (item is Future) {
-      var done = wrapAsync((fn) => fn());
-
-      // Queue up an asynchronous expectation that validates when the future
-      // completes.
-      item.then((value) {
-        done(() {
-          fail("Expected future to fail, but succeeded with '$value'.");
-        });
-      }, onError: (error, trace) {
-        done(() {
-          if (_matcher == null) return;
-          var reason;
-          if (trace != null) {
-            var stackTrace = trace.toString();
-            stackTrace = "  ${stackTrace.replaceAll("\n", "\n  ")}";
-            reason = "Actual exception trace:\n$stackTrace";
-          }
-          expect(error, _matcher, reason: reason);
-        });
-      });
-      // It hasn't failed yet.
-      return true;
-    }
-
-    try {
-      item();
-      return false;
-    } catch (e, s) {
-      if (_matcher == null || _matcher.matches(e, matchState)) {
-        return true;
-      } else {
-        addStateInfo(matchState, {'exception': e, 'stack': s});
-        return false;
-      }
-    }
-  }
-
-  Description describe(Description description) {
-    if (_matcher == null) {
-      return description.add("throws");
-    } else {
-      return description.add('throws ').addDescriptionOf(_matcher);
-    }
-  }
-
-  Description describeMismatch(item, Description mismatchDescription,
-                               Map matchState,
-                               bool verbose) {
-    if (item is! Function && item is! Future) {
-      return mismatchDescription.add('is not a Function or Future');
-    } else if (_matcher == null || matchState['exception'] == null) {
-      return mismatchDescription.add('did not throw');
-    } else {
-      mismatchDescription. add('threw ').
-          addDescriptionOf(matchState['exception']);
-      if (verbose) {
-        mismatchDescription.add(' at ').add(matchState['stack'].toString());
-      }
-      return mismatchDescription;
-    }
-  }
-}
-
 class _ReturnsNormally extends Matcher {
   const _ReturnsNormally();
 
diff --git a/pkg/matcher/lib/src/error_matchers.dart b/pkg/matcher/lib/src/error_matchers.dart
index dca1759..fd0445c 100644
--- a/pkg/matcher/lib/src/error_matchers.dart
+++ b/pkg/matcher/lib/src/error_matchers.dart
@@ -10,9 +10,6 @@
 /// A matcher for ArgumentErrors.
 const Matcher isArgumentError = const _ArgumentError();
 
-/// A matcher for functions that throw ArgumentError.
-const Matcher throwsArgumentError = const Throws(isArgumentError);
-
 class _ArgumentError extends TypeMatcher {
   const _ArgumentError(): super("ArgumentError");
   bool matches(item, Map matchState) => item is ArgumentError;
@@ -22,10 +19,6 @@
 const Matcher isConcurrentModificationError =
     const _ConcurrentModificationError();
 
-/// A matcher for functions that throw ConcurrentModificationError.
-const Matcher throwsConcurrentModificationError =
-  const Throws(isConcurrentModificationError);
-
 class _ConcurrentModificationError extends TypeMatcher {
   const _ConcurrentModificationError(): super("ConcurrentModificationError");
   bool matches(item, Map matchState) => item is ConcurrentModificationError;
@@ -34,10 +27,6 @@
 /// A matcher for CyclicInitializationError.
 const Matcher isCyclicInitializationError = const _CyclicInitializationError();
 
-/// A matcher for functions that throw CyclicInitializationError.
-const Matcher throwsCyclicInitializationError =
-  const Throws(isCyclicInitializationError);
-
 class _CyclicInitializationError extends TypeMatcher {
   const _CyclicInitializationError(): super("CyclicInitializationError");
   bool matches(item, Map matchState) => item is CyclicInitializationError;
@@ -46,9 +35,6 @@
 /// A matcher for Exceptions.
 const Matcher isException = const _Exception();
 
-/// A matcher for functions that throw Exception.
-const Matcher throwsException = const Throws(isException);
-
 class _Exception extends TypeMatcher {
   const _Exception(): super("Exception");
   bool matches(item, Map matchState) => item is Exception;
@@ -62,9 +48,6 @@
 /// A matcher for FormatExceptions.
 const Matcher isFormatException = const _FormatException();
 
-/// A matcher for functions that throw FormatException.
-const Matcher throwsFormatException = const Throws(isFormatException);
-
 class _FormatException extends TypeMatcher {
   const _FormatException(): super("FormatException");
   bool matches(item, Map matchState) => item is FormatException;
@@ -73,9 +56,6 @@
 /// A matcher for NoSuchMethodErrors.
 const Matcher isNoSuchMethodError = const _NoSuchMethodError();
 
-/// A matcher for functions that throw NoSuchMethodError.
-const Matcher throwsNoSuchMethodError = const Throws(isNoSuchMethodError);
-
 class _NoSuchMethodError extends TypeMatcher {
   const _NoSuchMethodError(): super("NoSuchMethodError");
   bool matches(item, Map matchState) => item is NoSuchMethodError;
@@ -84,9 +64,6 @@
 /// A matcher for NullThrownError.
 const Matcher isNullThrownError = const _NullThrownError();
 
-/// A matcher for functions that throw NullThrownError.
-const Matcher throwsNullThrownError = const Throws(isNullThrownError);
-
 class _NullThrownError extends TypeMatcher {
   const _NullThrownError(): super("NullThrownError");
   bool matches(item, Map matchState) => item is NullThrownError;
@@ -95,9 +72,6 @@
 /// A matcher for RangeErrors.
 const Matcher isRangeError = const _RangeError();
 
-/// A matcher for functions that throw RangeError.
-const Matcher throwsRangeError = const Throws(isRangeError);
-
 class _RangeError extends TypeMatcher {
   const _RangeError(): super("RangeError");
   bool matches(item, Map matchState) => item is RangeError;
@@ -106,9 +80,6 @@
 /// A matcher for StateErrors.
 const Matcher isStateError = const _StateError();
 
-/// A matcher for functions that throw StateError.
-const Matcher throwsStateError = const Throws(isStateError);
-
 class _StateError extends TypeMatcher {
   const _StateError(): super("StateError");
   bool matches(item, Map matchState) => item is StateError;
@@ -117,9 +88,6 @@
 /// A matcher for UnimplementedErrors.
 const Matcher isUnimplementedError = const _UnimplementedError();
 
-/// A matcher for functions that throw Exception.
-const Matcher throwsUnimplementedError = const Throws(isUnimplementedError);
-
 class _UnimplementedError extends TypeMatcher {
   const _UnimplementedError(): super("UnimplementedError");
   bool matches(item, Map matchState) => item is UnimplementedError;
@@ -128,9 +96,6 @@
 /// A matcher for UnsupportedError.
 const Matcher isUnsupportedError = const _UnsupportedError();
 
-/// A matcher for functions that throw UnsupportedError.
-const Matcher throwsUnsupportedError = const Throws(isUnsupportedError);
-
 class _UnsupportedError extends TypeMatcher {
   const _UnsupportedError(): super("UnsupportedError");
   bool matches(item, Map matchState) => item is UnsupportedError;
diff --git a/pkg/matcher/lib/src/expect.dart b/pkg/matcher/lib/src/expect.dart
index 073ef34..bd54747 100644
--- a/pkg/matcher/lib/src/expect.dart
+++ b/pkg/matcher/lib/src/expect.dart
@@ -7,6 +7,7 @@
 import 'core_matchers.dart';
 import 'description.dart';
 import 'interfaces.dart';
+import 'util.dart';
 
 /// The objects thrown by the default failure handler.
 class TestFailure extends Error {
@@ -17,15 +18,33 @@
   String toString() => message;
 }
 
-/// Useful utility for nesting match states.
+/// Failed matches are reported using a default IFailureHandler.
+/// The default implementation simply throws [TestFailure]s;
+/// this can be replaced by some other implementation of
+/// IFailureHandler by calling configureExpectHandler.
+abstract class FailureHandler {
+  /// This handles failures given a textual decription
+  void fail(String reason);
 
-void addStateInfo(Map matchState, Map values) {
-  var innerState = new Map.from(matchState);
-  matchState.clear();
-  matchState['state'] = innerState;
-  matchState.addAll(values);
+  /// This handles failures given the actual [value], the [matcher]
+  /// the [reason] (argument from [expect]), some additonal [matchState]
+  /// generated by the [matcher], and a verbose flag which controls in
+  /// some cases how much [matchState] information is used. It will use
+  /// these to create a detailed error message (typically by calling
+  /// an [ErrorFormatter]) and then call [fail] with this message.
+  void failMatch(actual, Matcher matcher, String reason,
+                 Map matchState, bool verbose);
 }
 
+/// The ErrorFormatter type is used for functions that
+/// can be used to build up error reports upon [expect] failures.
+/// There is one built-in implementation ([defaultErrorFormatter])
+/// which is used by the default failure handler. If the failure handler
+/// is replaced it may be desirable to replace the [stringDescription]
+/// error formatter with another.
+typedef String ErrorFormatter(actual, Matcher matcher, String reason,
+  Map matchState, bool verbose);
+
 /// Some matchers, like those for Futures and exception testing,
 /// can fail in asynchronous sections, and throw exceptions.
 /// A user of this library will typically want to catch and handle
@@ -81,20 +100,6 @@
   failureHandler.fail(message);
 }
 
-/// Takes an argument and returns an equivalent matcher.
-/// If the argument is already a matcher this does nothing,
-/// else if the argument is a function, it generates a predicate
-/// function matcher, else it generates an equals matcher.
-Matcher wrapMatcher(x) {
-  if (x is Matcher) {
-    return x;
-  } else if (x is Function) {
-    return predicate(x);
-  } else {
-    return equals(x);
-  }
-}
-
 // The handler for failed asserts.
 FailureHandler _assertFailureHandler = null;
 
diff --git a/pkg/matcher/lib/src/future_matchers.dart b/pkg/matcher/lib/src/future_matchers.dart
index 4c5a391..f1d7cb8 100644
--- a/pkg/matcher/lib/src/future_matchers.dart
+++ b/pkg/matcher/lib/src/future_matchers.dart
@@ -6,9 +6,9 @@
 
 import 'dart:async';
 
-import 'core_matchers.dart';
 import 'expect.dart';
 import 'interfaces.dart';
+import 'util.dart';
 
 /// Matches a [Future] that completes successfully with a value. Note that this
 /// creates an asynchronous expectation. The call to `expect()` that includes
diff --git a/pkg/matcher/lib/src/interfaces.dart b/pkg/matcher/lib/src/interfaces.dart
index 9fc1107..f3f0755 100644
--- a/pkg/matcher/lib/src/interfaces.dart
+++ b/pkg/matcher/lib/src/interfaces.dart
@@ -7,15 +7,6 @@
 // To decouple the reporting of errors, and allow for extensibility of
 // matchers, we make use of some interfaces.
 
-/// The ErrorFormatter type is used for functions that
-/// can be used to build up error reports upon [expect] failures.
-/// There is one built-in implementation ([defaultErrorFormatter])
-/// which is used by the default failure handler. If the failure handler
-/// is replaced it may be desirable to replace the [stringDescription]
-/// error formatter with another.
-typedef String ErrorFormatter(actual, Matcher matcher, String reason,
-    Map matchState, bool verbose);
-
 /// Matchers build up their error messages by appending to
 /// Description objects. This interface is implemented by
 /// StringDescription. This interface is unlikely to need
@@ -58,7 +49,7 @@
   /// This builds a textual description of a specific mismatch. [item]
   /// is the value that was tested by [matches]; [matchState] is
   /// the [Map] that was passed to and supplemented by [matches]
-  /// with additional information about the mismact, and [mismatchDescription]
+  /// with additional information about the mismatch, and [mismatchDescription]
   /// is the [Description] that is being built to decribe the mismatch.
   /// A few matchers make use of the [verbose] flag to provide detailed
   /// information that is not typically included but can be of help in
@@ -66,21 +57,3 @@
   Description describeMismatch(item, Description mismatchDescription,
       Map matchState, bool verbose) => mismatchDescription;
 }
-
-/// Failed matches are reported using a default IFailureHandler.
-/// The default implementation simply throws [TestFailure]s;
-/// this can be replaced by some other implementation of
-/// IFailureHandler by calling configureExpectHandler.
-abstract class FailureHandler {
-  /// This handles failures given a textual decription
-  void fail(String reason);
-
-  /// This handles failures given the actual [value], the [matcher]
-  /// the [reason] (argument from [expect]), some additonal [matchState]
-  /// generated by the [matcher], and a verbose flag which controls in
-  /// some cases how much [matchState] information is used. It will use
-  /// these to create a detailed error message (typically by calling
-  /// an [ErrorFormatter]) and then call [fail] with this message.
-  void failMatch(actual, Matcher matcher, String reason,
-                 Map matchState, bool verbose);
-}
diff --git a/pkg/matcher/lib/src/iterable_matchers.dart b/pkg/matcher/lib/src/iterable_matchers.dart
index ef7afb0..eeea0ee 100644
--- a/pkg/matcher/lib/src/iterable_matchers.dart
+++ b/pkg/matcher/lib/src/iterable_matchers.dart
@@ -6,8 +6,8 @@
 
 import 'core_matchers.dart';
 import 'description.dart';
-import 'expect.dart';
 import 'interfaces.dart';
+import 'util.dart';
 
 /// Returns a matcher which matches [Iterable]s in which all elements
 /// match the given [matcher].
diff --git a/pkg/matcher/lib/src/map_matchers.dart b/pkg/matcher/lib/src/map_matchers.dart
index a560e50..623b380 100644
--- a/pkg/matcher/lib/src/map_matchers.dart
+++ b/pkg/matcher/lib/src/map_matchers.dart
@@ -4,8 +4,8 @@
 
 library matcher.map_matchers;
 
-import 'expect.dart';
 import 'interfaces.dart';
+import 'util.dart';
 
 /// Returns a matcher which matches maps containing the given [value].
 Matcher containsValue(value) => new _ContainsValue(value);
diff --git a/pkg/matcher/lib/src/operator_matchers.dart b/pkg/matcher/lib/src/operator_matchers.dart
index fb79e8f..a6d23c2 100644
--- a/pkg/matcher/lib/src/operator_matchers.dart
+++ b/pkg/matcher/lib/src/operator_matchers.dart
@@ -4,9 +4,8 @@
 
 library matcher.operator_matchers;
 
-import 'core_matchers.dart';
-import 'expect.dart';
 import 'interfaces.dart';
+import 'util.dart';
 
 /// This returns a matcher that inverts [matcher] to its logical negation.
 Matcher isNot(matcher) => new _IsNot(wrapMatcher(matcher));
@@ -14,7 +13,7 @@
 class _IsNot extends Matcher {
   final Matcher _matcher;
 
-  const _IsNot(Matcher this._matcher);
+  const _IsNot(this._matcher);
 
   bool matches(item, Map matchState) => !_matcher.matches(item, matchState);
 
@@ -103,40 +102,21 @@
 }
 
 List<Matcher> _wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6) {
+  Iterable<Matcher> matchers;
   if (arg0 is List) {
-    // TODO(kevmoo) throw a more helpful error here if any of these args is
-    // not null
-    expect(arg1, isNull);
-    expect(arg2, isNull);
-    expect(arg3, isNull);
-    expect(arg4, isNull);
-    expect(arg5, isNull);
-    expect(arg6, isNull);
+    if (arg1 != null || arg2 != null || arg3 != null || arg4 != null ||
+        arg5 != null || arg6 != null) {
+      throw new ArgumentError('If arg0 is a List, all other arguments must be'
+          ' null.');
+    }
 
-    return arg0.map((a) => wrapMatcher(a)).toList();
+    matchers = arg0;
+  } else {
+    matchers = [arg0, arg1, arg2, arg3, arg4, arg5, arg6]
+        .where((e) => e != null);
   }
 
-  List matchers = new List();
-  if (arg0 != null) {
-    matchers.add(wrapMatcher(arg0));
-  }
-  if (arg1 != null) {
-    matchers.add(wrapMatcher(arg1));
-  }
-  if (arg2 != null) {
-    matchers.add(wrapMatcher(arg2));
-  }
-  if (arg3 != null) {
-    matchers.add(wrapMatcher(arg3));
-  }
-  if (arg4 != null) {
-    matchers.add(wrapMatcher(arg4));
-  }
-  if (arg5 != null) {
-    matchers.add(wrapMatcher(arg5));
-  }
-  if (arg6 != null) {
-    matchers.add(wrapMatcher(arg6));
-  }
-  return matchers;
+  return matchers
+      .map((e) => wrapMatcher(e))
+      .toList();
 }
diff --git a/pkg/matcher/lib/src/throws_matcher.dart b/pkg/matcher/lib/src/throws_matcher.dart
new file mode 100644
index 0000000..b3a5323
--- /dev/null
+++ b/pkg/matcher/lib/src/throws_matcher.dart
@@ -0,0 +1,113 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.throws_matcher;
+
+import 'dart:async';
+
+import 'expect.dart';
+import 'interfaces.dart';
+import 'util.dart';
+
+/// This can be used to match two kinds of objects:
+///
+///   * A [Function] that throws an exception when called. The function cannot
+///     take any arguments. If you want to test that a function expecting
+///     arguments throws, wrap it in another zero-argument function that calls
+///     the one you want to test.
+///
+///   * A [Future] that completes with an exception. Note that this creates an
+///     asynchronous expectation. The call to `expect()` that includes this will
+///     return immediately and execution will continue. Later, when the future
+///     completes, the actual expectation will run.
+const Matcher throws = const Throws();
+
+/// This can be used to match two kinds of objects:
+///
+///   * A [Function] that throws an exception when called. The function cannot
+///     take any arguments. If you want to test that a function expecting
+///     arguments throws, wrap it in another zero-argument function that calls
+///     the one you want to test.
+///
+///   * A [Future] that completes with an exception. Note that this creates an
+///     asynchronous expectation. The call to `expect()` that includes this will
+///     return immediately and execution will continue. Later, when the future
+///     completes, the actual expectation will run.
+///
+/// In both cases, when an exception is thrown, this will test that the exception
+/// object matches [matcher]. If [matcher] is not an instance of [Matcher], it
+/// will implicitly be treated as `equals(matcher)`.
+Matcher throwsA(matcher) => new Throws(wrapMatcher(matcher));
+
+class Throws extends Matcher {
+  final Matcher _matcher;
+
+  const Throws([Matcher matcher]) : this._matcher = matcher;
+
+  bool matches(item, Map matchState) {
+    if (item is! Function && item is! Future) return false;
+    if (item is Future) {
+      var done = wrapAsync((fn) => fn());
+
+      // Queue up an asynchronous expectation that validates when the future
+      // completes.
+      item.then((value) {
+        done(() {
+          fail("Expected future to fail, but succeeded with '$value'.");
+        });
+      }, onError: (error, trace) {
+        done(() {
+          if (_matcher == null) return;
+          var reason;
+          if (trace != null) {
+            var stackTrace = trace.toString();
+            stackTrace = "  ${stackTrace.replaceAll("\n", "\n  ")}";
+            reason = "Actual exception trace:\n$stackTrace";
+          }
+          expect(error, _matcher, reason: reason);
+        });
+      });
+      // It hasn't failed yet.
+      return true;
+    }
+
+    try {
+      item();
+      return false;
+    } catch (e, s) {
+      if (_matcher == null || _matcher.matches(e, matchState)) {
+        return true;
+      } else {
+        addStateInfo(matchState, {'exception': e, 'stack': s});
+        return false;
+      }
+    }
+  }
+
+  Description describe(Description description) {
+    if (_matcher == null) {
+      return description.add("throws");
+    } else {
+      return description.add('throws ').addDescriptionOf(_matcher);
+    }
+  }
+
+  Description describeMismatch(item, Description mismatchDescription,
+                               Map matchState,
+                               bool verbose) {
+    if (item is! Function && item is! Future) {
+      return mismatchDescription.add('is not a Function or Future');
+    } else if (_matcher == null || matchState['exception'] == null) {
+      return mismatchDescription.add('did not throw');
+    } else {
+      mismatchDescription. add('threw ').
+          addDescriptionOf(matchState['exception']);
+      if (verbose) {
+        mismatchDescription.add(' at ').add(matchState['stack'].toString());
+      }
+      return mismatchDescription;
+    }
+  }
+}
+
diff --git a/pkg/matcher/lib/src/throws_matchers.dart b/pkg/matcher/lib/src/throws_matchers.dart
new file mode 100644
index 0000000..35dfb39
--- /dev/null
+++ b/pkg/matcher/lib/src/throws_matchers.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.throws_matchers;
+
+import 'error_matchers.dart';
+import 'interfaces.dart';
+import 'throws_matcher.dart';
+
+/// A matcher for functions that throw ArgumentError.
+const Matcher throwsArgumentError = const Throws(isArgumentError);
+
+/// A matcher for functions that throw ConcurrentModificationError.
+const Matcher throwsConcurrentModificationError =
+    const Throws(isConcurrentModificationError);
+
+/// A matcher for functions that throw CyclicInitializationError.
+const Matcher throwsCyclicInitializationError =
+    const Throws(isCyclicInitializationError);
+
+/// A matcher for functions that throw Exception.
+const Matcher throwsException = const Throws(isException);
+
+/// A matcher for functions that throw FormatException.
+const Matcher throwsFormatException = const Throws(isFormatException);
+
+/// A matcher for functions that throw NoSuchMethodError.
+const Matcher throwsNoSuchMethodError = const Throws(isNoSuchMethodError);
+
+/// A matcher for functions that throw NullThrownError.
+const Matcher throwsNullThrownError = const Throws(isNullThrownError);
+
+/// A matcher for functions that throw RangeError.
+const Matcher throwsRangeError = const Throws(isRangeError);
+
+/// A matcher for functions that throw StateError.
+const Matcher throwsStateError = const Throws(isStateError);
+
+/// A matcher for functions that throw Exception.
+const Matcher throwsUnimplementedError = const Throws(isUnimplementedError);
+
+/// A matcher for functions that throw UnsupportedError.
+const Matcher throwsUnsupportedError = const Throws(isUnsupportedError);
diff --git a/pkg/matcher/lib/src/util.dart b/pkg/matcher/lib/src/util.dart
new file mode 100644
index 0000000..08cba77
--- /dev/null
+++ b/pkg/matcher/lib/src/util.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.util;
+
+import 'core_matchers.dart';
+import 'interfaces.dart';
+
+/// Useful utility for nesting match states.
+void addStateInfo(Map matchState, Map values) {
+  var innerState = new Map.from(matchState);
+  matchState.clear();
+  matchState['state'] = innerState;
+  matchState.addAll(values);
+}
+
+/// Takes an argument and returns an equivalent matcher.
+/// If the argument is already a matcher this does nothing,
+/// else if the argument is a function, it generates a predicate
+/// function matcher, else it generates an equals matcher.
+Matcher wrapMatcher(x) {
+  if (x is Matcher) {
+    return x;
+  } else if (x is Function) {
+    return predicate(x);
+  } else {
+    return equals(x);
+  }
+}
diff --git a/pkg/matcher/pubspec.yaml b/pkg/matcher/pubspec.yaml
index 4612c58..c6cb49d 100644
--- a/pkg/matcher/pubspec.yaml
+++ b/pkg/matcher/pubspec.yaml
@@ -1,5 +1,5 @@
 name: matcher
-version: 0.11.0
+version: 0.11.1+1
 author: Dart Team <misc@dartlang.org>
 description: Support for specifying test expectations
 homepage: https://pub.dartlang.org/packages/matcher
diff --git a/pkg/matcher/test/core_matchers_test.dart b/pkg/matcher/test/core_matchers_test.dart
index 7e9b246..99d10ac 100644
--- a/pkg/matcher/test/core_matchers_test.dart
+++ b/pkg/matcher/test/core_matchers_test.dart
@@ -33,6 +33,16 @@
     shouldFail(null, isNotNull, "Expected: not null Actual: <null>");
   });
 
+  test('isNaN', () {
+    shouldPass(double.NAN, isNaN);
+    shouldFail(3.1, isNaN, "Expected: NaN Actual: <3.1>");
+  });
+
+  test('isNotNaN', () {
+    shouldPass(3.1, isNotNaN);
+    shouldFail(double.NAN, isNotNaN, "Expected: not NaN Actual: <NaN>");
+  });
+
   test('same', () {
     var a = new Map();
     var b = new Map();
@@ -73,38 +83,6 @@
     shouldFail(a, isNot(anything), "Expected: not anything Actual: {}");
   });
 
-  test('throws', () {
-    shouldFail(doesNotThrow, throws,
-        matches(
-            r"Expected: throws"
-            r"  Actual: <Closure(: \(\) => dynamic "
-            r"from Function 'doesNotThrow': static\.)?>"
-            r"   Which: did not throw"));
-    shouldPass(doesThrow, throws);
-    shouldFail(true, throws,
-        "Expected: throws"
-        "  Actual: <true>"
-        "   Which: is not a Function or Future");
-  });
-
-  test('throwsA', () {
-    shouldPass(doesThrow, throwsA(equals('X')));
-    shouldFail(doesThrow, throwsA(equals('Y')),
-        matches(
-            r"Expected: throws 'Y'"
-            r"  Actual: <Closure(: \(\) => dynamic "
-            r"from Function 'doesThrow': static\.)?>"
-            r"   Which: threw 'X'"));
-  });
-
-  test('throwsA', () {
-    shouldPass(doesThrow, throwsA(equals('X')));
-    shouldFail(doesThrow, throwsA(equals('Y')),
-        matches("Expected: throws 'Y'.*"
-        "Actual: <Closure.*"
-        "Which: threw 'X'"));
-  });
-
   test('returnsNormally', () {
     shouldPass(doesNotThrow, returnsNormally);
     shouldFail(doesThrow, returnsNormally,
@@ -199,31 +177,4 @@
       shouldPass('cow', predicate((x) => x is String, "an instance of String"));
     });
   });
-
-  group('exception/error matchers', () {
-    test('throwsCyclicInitializationError', () {
-      expect(() => _Bicycle.foo, throwsCyclicInitializationError);
-    });
-
-    test('throwsConcurrentModificationError', () {
-      expect(() {
-        var a = { 'foo': 'bar' };
-        for (var k in a.keys) {
-          a.remove(k);
-        }
-      }, throwsConcurrentModificationError);
-    });
-
-    test('throwsNullThrownError', () {
-      expect(() => throw null, throwsNullThrownError);
-    });
-  });
-}
-
-class _Bicycle {
-  static final foo = bar();
-
-  static bar() {
-    return foo + 1;
-  }
 }
diff --git a/pkg/matcher/test/operator_matchers_test.dart b/pkg/matcher/test/operator_matchers_test.dart
index fd9627a..f82abaa 100644
--- a/pkg/matcher/test/operator_matchers_test.dart
+++ b/pkg/matcher/test/operator_matchers_test.dart
@@ -13,16 +13,47 @@
   initUtils();
 
   test('anyOf', () {
+    // with a list
     shouldFail(0, anyOf([equals(1), equals(2)]),
         "Expected: (<1> or <2>) Actual: <0>");
     shouldPass(1, anyOf([equals(1), equals(2)]));
+
+    // with individual items
+    shouldFail(0, anyOf(equals(1), equals(2)),
+        "Expected: (<1> or <2>) Actual: <0>");
+    shouldPass(1, anyOf(equals(1), equals(2)));
   });
 
   test('allOf', () {
+    // with a list
     shouldPass(1, allOf([lessThan(10), greaterThan(0)]));
     shouldFail(-1, allOf([lessThan(10), greaterThan(0)]),
         "Expected: (a value less than <10> and a value greater than <0>) "
         "Actual: <-1> "
         "Which: is not a value greater than <0>");
+
+    // with individual items
+    shouldPass(1, allOf(lessThan(10), greaterThan(0)));
+    shouldFail(-1, allOf(lessThan(10), greaterThan(0)),
+        "Expected: (a value less than <10> and a value greater than <0>) "
+        "Actual: <-1> "
+        "Which: is not a value greater than <0>");
+
+    // with maximum items
+    shouldPass(1, allOf(lessThan(10), lessThan(9), lessThan(8), lessThan(7),
+                        lessThan(6), lessThan(5), lessThan(4)));
+    shouldFail(4, allOf(lessThan(10), lessThan(9), lessThan(8), lessThan(7),
+        lessThan(6), lessThan(5), lessThan(4)),
+        "Expected: (a value less than <10> and a value less than <9> and a "
+        "value less than <8> and a value less than <7> and a value less than "
+        "<6> and a value less than <5> and a value less than <4>) "
+        "Actual: <4> "
+        "Which: is not a value less than <4>");
+  });
+
+  test('If the first argument is a List, the rest must be null', () {
+    expect(() => allOf([], 5), throwsArgumentError);
+    expect(() => anyOf([], null, null, null, null, null, 42),
+        throwsArgumentError);
   });
 }
diff --git a/pkg/matcher/test/throws_matchers_test.dart b/pkg/matcher/test/throws_matchers_test.dart
new file mode 100644
index 0000000..74ff82d
--- /dev/null
+++ b/pkg/matcher/test/throws_matchers_test.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library matcher.core_matchers_test;
+
+import 'package:matcher/matcher.dart';
+import 'package:unittest/unittest.dart' show test, group;
+
+import 'test_utils.dart';
+
+void main() {
+  initUtils();
+
+
+  test('throws', () {
+    shouldFail(doesNotThrow, throws,
+        matches(
+            r"Expected: throws"
+            r"  Actual: <Closure(: \(\) => dynamic "
+            r"from Function 'doesNotThrow': static\.)?>"
+            r"   Which: did not throw"));
+    shouldPass(doesThrow, throws);
+    shouldFail(true, throws,
+        "Expected: throws"
+        "  Actual: <true>"
+        "   Which: is not a Function or Future");
+  });
+
+  test('throwsA', () {
+    shouldPass(doesThrow, throwsA(equals('X')));
+    shouldFail(doesThrow, throwsA(equals('Y')),
+        matches(
+            r"Expected: throws 'Y'"
+            r"  Actual: <Closure(: \(\) => dynamic "
+            r"from Function 'doesThrow': static\.)?>"
+            r"   Which: threw 'X'"));
+  });
+
+  test('throwsA', () {
+    shouldPass(doesThrow, throwsA(equals('X')));
+    shouldFail(doesThrow, throwsA(equals('Y')),
+        matches("Expected: throws 'Y'.*"
+        "Actual: <Closure.*"
+        "Which: threw 'X'"));
+  });
+
+
+  group('exception/error matchers', () {
+    test('throwsCyclicInitializationError', () {
+      expect(() => _Bicycle.foo, throwsCyclicInitializationError);
+    });
+
+    test('throwsConcurrentModificationError', () {
+      expect(() {
+        var a = { 'foo': 'bar' };
+        for (var k in a.keys) {
+          a.remove(k);
+        }
+      }, throwsConcurrentModificationError);
+    });
+
+    test('throwsNullThrownError', () {
+      expect(() => throw null, throwsNullThrownError);
+    });
+  });
+}
+
+class _Bicycle {
+  static final foo = bar();
+
+  static bar() {
+    return foo + 1;
+  }
+}
+
diff --git a/pkg/observatory b/pkg/observatory
new file mode 120000
index 0000000..a4c002c
--- /dev/null
+++ b/pkg/observatory
@@ -0,0 +1 @@
+../runtime/bin/vmservice/client
\ No newline at end of file
diff --git a/pkg/observe/CHANGELOG.md b/pkg/observe/CHANGELOG.md
index 53a425f..2966b03 100644
--- a/pkg/observe/CHANGELOG.md
+++ b/pkg/observe/CHANGELOG.md
@@ -3,10 +3,33 @@
 This file contains highlights of what changes on each version of the observe
 package.
 
-#### Pub version 0.11.0-dev
-  * PathObserver.value= no longer discards changes (this is in combination with
-    a change in template_binding and polymer to improve interop with JS custom
-    elements).
+#### Pub version 0.11.0+4
+  * Raise the lower bound on the source_maps constraint to exclude incompatible
+    versions.
+
+#### Pub version 0.11.0+3
+  * Widen the constraint on source_maps.
+
+#### Pub version 0.11.0+2
+  * Widen the constraint on barback.
+
+#### Pub version 0.11.0+1
+  * Switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan`
+    class.
+
+#### Pub version 0.11.0
+  * Updated to match [observe-js#e212e74][e212e74] (release 0.3.4)
+  * ListPathObserver has been deprecated  (it was deleted a while ago in
+    observe-js). We plan to delete it in a future release. You may copy the code
+    if you still need it.
+  * PropertyPath now uses an expression syntax including indexers. For example,
+    you can write `a.b["m"]` instead of `a.b.m`.
+  * **breaking change**: PropertyPath no longer allows numbers as fields, you
+    need to use indexers instead. For example, you now need to write `a[3].d`
+    instead of `a.3.d`.
+  * **breaking change**: PathObserver.value= no longer discards changes (this is
+    in combination with a change in template_binding and polymer to improve
+    interop with JS custom elements).
 
 #### Pub version 0.10.0+3
   * minor changes to documentation, deprecated `discardListChages` in favor of
@@ -20,3 +43,7 @@
     import 'package:observe/mirrors_used.dart', and that will add a @MirrorsUsed
     annotation that preserves properties and classes labeled with @reflectable
     and properties labeled with @observable.
+  * Updated to match [observe-js#0152d54][0152d54]
+
+[0152d54]: https://github.com/Polymer/observe-js/blob/0152d542350239563d0f2cad39d22d3254bd6c2a/src/observe.js
+[e212e74]: https://github.com/Polymer/observe-js/blob/e212e7473962067c099a3d1859595c2f8baa36d7/src/observe.js
diff --git a/pkg/observe/lib/observe.dart b/pkg/observe/lib/observe.dart
index d537856..20912f9 100644
--- a/pkg/observe/lib/observe.dart
+++ b/pkg/observe/lib/observe.dart
@@ -113,5 +113,5 @@
 export 'src/observable_list.dart';
 export 'src/observable_map.dart';
 export 'src/observer_transform.dart';
-export 'src/path_observer.dart';
+export 'src/path_observer.dart' hide getSegmentsOfPropertyPathForTesting;
 export 'src/to_observable.dart';
diff --git a/pkg/observe/lib/src/list_diff.dart b/pkg/observe/lib/src/list_diff.dart
index 59a9698..cbc3f2f 100644
--- a/pkg/observe/lib/src/list_diff.dart
+++ b/pkg/observe/lib/src/list_diff.dart
@@ -6,12 +6,13 @@
 
 import 'dart:math' as math;
 import 'dart:collection' show UnmodifiableListView;
+import 'change_record.dart' show ChangeRecord;
 
 /// A summary of an individual change to a [List].
 ///
 /// Each delta represents that at the [index], [removed] sequence of items were
 /// removed, and counting forward from [index], [addedCount] items were added.
-class ListChangeRecord {
+class ListChangeRecord extends ChangeRecord {
   /// The list that changed.
   final List object;
 
diff --git a/pkg/observe/lib/src/list_path_observer.dart b/pkg/observe/lib/src/list_path_observer.dart
index bab01c23..22a8199 100644
--- a/pkg/observe/lib/src/list_path_observer.dart
+++ b/pkg/observe/lib/src/list_path_observer.dart
@@ -12,6 +12,7 @@
 // The main difference is we support anything on the rich Dart Iterable API.
 
 /// Observes a path starting from each item in the list.
+@deprecated
 class ListPathObserver<E, P> extends ChangeNotifier {
   final ObservableList<E> list;
   final String _itemPath;
@@ -59,7 +60,7 @@
     if (lengthAdjust > 0) {
       for (int i = 0; i < lengthAdjust; i++) {
         int len = _observers.length;
-        var pathObs = new PathObserver(list, '$len.$_itemPath');
+        var pathObs = new PathObserver(list, '[$len].$_itemPath');
         pathObs.open(_scheduleReduce);
         _observers.add(pathObs);
       }
diff --git a/pkg/observe/lib/src/path_observer.dart b/pkg/observe/lib/src/path_observer.dart
index a95f2bb..0ba31a67 100644
--- a/pkg/observe/lib/src/path_observer.dart
+++ b/pkg/observe/lib/src/path_observer.dart
@@ -12,6 +12,8 @@
 import 'package:observe/observe.dart';
 import 'package:smoke/smoke.dart' as smoke;
 
+import 'package:utf/utf.dart' show stringToCodepoints;
+
 /// A data-bound path starting from a view-model or model object, for example
 /// `foo.bar.baz`.
 ///
@@ -34,9 +36,9 @@
   /// See [open] and [value].
   PathObserver(Object object, [path])
       : _object = object,
-        _path = path is PropertyPath ? path : new PropertyPath(path);
+        _path = new PropertyPath(path);
 
-  bool get _isClosed => _path == null;
+  PropertyPath get path => _path;
 
   /// Sets the value at this path.
   void set value(Object newValue) {
@@ -67,7 +69,7 @@
     _object = null;
   }
 
-  void _iterateObjects(void observe(obj)) {
+  void _iterateObjects(void observe(obj, prop)) {
     _path._iterateObjects(_object, observe);
   }
 
@@ -76,7 +78,7 @@
     _value = _path.getValueFrom(_object);
     if (skipChanges || _value == oldValue) return false;
 
-    _report(_value, oldValue);
+    _report(_value, oldValue, this);
     return true;
   }
 }
@@ -106,30 +108,33 @@
   /// Note that this constructor will canonicalize identical paths in some cases
   /// to save memory, but this is not guaranteed. Use [==] for comparions
   /// purposes instead of [identical].
+  // Dart note: this is ported from `function getPath`.
   factory PropertyPath([path]) {
+    if (path is PropertyPath) return path;
+    if (path == null || (path is List && path.isEmpty)) path = '';
+
     if (path is List) {
       var copy = new List.from(path, growable: false);
       for (var segment in copy) {
-        if (segment is! int && segment is! Symbol) {
-          throw new ArgumentError('List must contain only ints and Symbols');
+        // Dart note: unlike Javascript, we don't support arbitraty objects that
+        // can be converted to a String.
+        // TODO(sigmund): consider whether we should support that here. It might
+        // be easier to add support for that if we switch first to use strings
+        // for everything instead of symbols.
+        if (segment is! int && segment is! String && segment is! Symbol) {
+          throw new ArgumentError(
+              'List must contain only ints, Strings, and Symbols');
         }
       }
       return new PropertyPath._(copy);
     }
 
-    if (path == null) path = '';
-
     var pathObj = _pathCache[path];
     if (pathObj != null) return pathObj;
 
-    if (!_isPathValid(path)) return _InvalidPropertyPath._instance;
 
-    final segments = [];
-    for (var segment in path.trim().split('.')) {
-      if (segment == '') continue;
-      var index = int.parse(segment, radix: 10, onError: (_) => null);
-      segments.add(index != null ? index : smoke.nameToSymbol(segment));
-    }
+    final segments = new _PathParser().parse(path);
+    if (segments == null) return _InvalidPropertyPath._instance;
 
     // TODO(jmesserly): we could use an UnmodifiableListView here, but that adds
     // memory overhead.
@@ -149,9 +154,26 @@
 
   String toString() {
     if (!isValid) return '<invalid path>';
-    return _segments
-        .map((s) => s is Symbol ? smoke.symbolToName(s) : s)
-        .join('.');
+    var sb = new StringBuffer();
+    bool first = true;
+    for (var key in _segments) {
+      if (key is Symbol) {
+        if (!first) sb.write('.');
+        sb.write(smoke.symbolToName(key));
+      } else {
+        _formatAccessor(sb, key);
+      }
+      first = false;
+    }
+    return sb.toString();
+  }
+
+  _formatAccessor(StringBuffer sb, Object key) {
+    if (key is int) {
+      sb.write('[$key]');
+    } else {
+      sb.write('["${key.toString().replaceAll('"', '\\"')}"]');
+    }
   }
 
   bool operator ==(other) {
@@ -206,19 +228,27 @@
     return _setObjectProperty(obj, _segments[end], value);
   }
 
-  void _iterateObjects(Object obj, void observe(obj)) {
+  void _iterateObjects(Object obj, void observe(obj, prop)) {
     if (!isValid || isEmpty) return;
 
     int i = 0, last = _segments.length - 1;
     while (obj != null) {
-      observe(obj);
+      // _segments[0] is passed to indicate that we are only observing that
+      // property of obj. See observe declaration in _ObserveSet.
+      observe(obj, _segments[0]);
 
       if (i >= last) break;
       obj = _getObjectProperty(obj, _segments[i++]);
     }
   }
+
+  // Dart note: it doesn't make sense to have compiledGetValueFromFn in Dart.
 }
 
+
+/// Visible only for testing:
+getSegmentsOfPropertyPathForTesting(p) => p._segments;
+
 class _InvalidPropertyPath extends PropertyPath {
   static final _instance = new _InvalidPropertyPath();
 
@@ -250,6 +280,8 @@
     if (object is List && property >= 0 && property < object.length) {
       return object[property];
     }
+  } else if (property is String) {
+    return object[property];
   } else if (property is Symbol) {
     // Support indexer if available, e.g. Maps or polymer_expressions Scope.
     // This is the default syntax used by polymer/nodebind and
@@ -309,21 +341,192 @@
 
 // From: https://github.com/rafaelw/ChangeSummary/blob/master/change_summary.js
 
-final _pathRegExp = () {
+final _identRegExp = () {
   const identStart = '[\$_a-zA-Z]';
   const identPart = '[\$_a-zA-Z0-9]';
-  const ident = '$identStart+$identPart*';
-  const elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';
-  const identOrElementIndex = '(?:$ident|$elementIndex)';
-  const path = '(?:$identOrElementIndex)(?:\\.$identOrElementIndex)*';
-  return new RegExp('^$path\$');
+  return new RegExp('^$identStart+$identPart*\$');
 }();
 
-bool _isPathValid(String s) {
-  s = s.trim();
-  if (s == '') return true;
-  if (s[0] == '.') return false;
-  return _pathRegExp.hasMatch(s);
+_isIdent(s) => _identRegExp.hasMatch(s);
+
+// Dart note: refactored to convert to codepoints once and operate on codepoints
+// rather than characters.
+class _PathParser {
+  List keys = [];
+  int index = -1;
+  String key;
+
+  final Map<String, List<String>> _pathStateMachine = {
+    'beforePath': {
+      'ws': ['beforePath'],
+      'ident': ['inIdent', 'append'],
+      '[': ['beforeElement'],
+      'eof': ['afterPath']
+    },
+
+    'inPath': {
+      'ws': ['inPath'],
+      '.': ['beforeIdent'],
+      '[': ['beforeElement'],
+      'eof': ['afterPath']
+    },
+
+    'beforeIdent': {
+      'ws': ['beforeIdent'],
+      'ident': ['inIdent', 'append']
+    },
+
+    'inIdent': {
+      'ident': ['inIdent', 'append'],
+      '0': ['inIdent', 'append'],
+      'number': ['inIdent', 'append'],
+      'ws': ['inPath', 'push'],
+      '.': ['beforeIdent', 'push'],
+      '[': ['beforeElement', 'push'],
+      'eof': ['afterPath', 'push']
+    },
+
+    'beforeElement': {
+      'ws': ['beforeElement'],
+      '0': ['afterZero', 'append'],
+      'number': ['inIndex', 'append'],
+      "'": ['inSingleQuote', 'append', ''],
+      '"': ['inDoubleQuote', 'append', '']
+    },
+
+    'afterZero': {
+      'ws': ['afterElement', 'push'],
+      ']': ['inPath', 'push']
+    },
+
+    'inIndex': {
+      '0': ['inIndex', 'append'],
+      'number': ['inIndex', 'append'],
+      'ws': ['afterElement'],
+      ']': ['inPath', 'push']
+    },
+
+    'inSingleQuote': {
+      "'": ['afterElement'],
+      'eof': ['error'],
+      'else': ['inSingleQuote', 'append']
+    },
+
+    'inDoubleQuote': {
+      '"': ['afterElement'],
+      'eof': ['error'],
+      'else': ['inDoubleQuote', 'append']
+    },
+
+    'afterElement': {
+      'ws': ['afterElement'],
+      ']': ['inPath', 'push']
+    }
+  };
+
+  /// From getPathCharType: determines the type of a given [code]point.
+  String _getPathCharType(code) {
+    if (code == null) return 'eof';
+    switch(code) {
+      case 0x5B: // [
+      case 0x5D: // ]
+      case 0x2E: // .
+      case 0x22: // "
+      case 0x27: // '
+      case 0x30: // 0
+        return _char(code);
+
+      case 0x5F: // _
+      case 0x24: // $
+        return 'ident';
+
+      case 0x20: // Space
+      case 0x09: // Tab
+      case 0x0A: // Newline
+      case 0x0D: // Return
+      case 0xA0:  // No-break space
+      case 0xFEFF:  // Byte Order Mark
+      case 0x2028:  // Line Separator
+      case 0x2029:  // Paragraph Separator
+        return 'ws';
+    }
+
+    // a-z, A-Z
+    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))
+      return 'ident';
+
+    // 1-9
+    if (0x31 <= code && code <= 0x39)
+      return 'number';
+
+    return 'else';
+  }
+
+  static String _char(int codepoint) => new String.fromCharCodes([codepoint]);
+
+  void push() {
+    if (key == null) return;
+
+    // Dart note: we store the keys with different types, rather than
+    // parsing/converting things later in toString.
+    if (_isIdent(key)) {
+      keys.add(smoke.nameToSymbol(key));
+    } else {
+      var index = int.parse(key, radix: 10, onError: (_) => null);
+      keys.add(index != null ? index : key);
+    }
+    key = null;
+  }
+
+  void append(newChar) {
+    key = (key == null) ? newChar : '$key$newChar';
+  }
+
+  bool _maybeUnescapeQuote(String mode, codePoints) {
+    if (index >= codePoints.length) return false;
+    var nextChar = _char(codePoints[index + 1]);
+    if ((mode == 'inSingleQuote' && nextChar == "'") ||
+        (mode == 'inDoubleQuote' && nextChar == '"')) {
+      index++;
+      append(nextChar);
+      return true;
+    }
+    return false;
+  }
+
+  /// Returns the parsed keys, or null if there was a parse error.
+  List<String> parse(String path) {
+    var codePoints = stringToCodepoints(path);
+    var mode = 'beforePath';
+
+    while (mode != null) {
+      index++;
+      var c = index >= codePoints.length ? null : codePoints[index];
+
+      if (c != null &&
+          _char(c) == '\\' && _maybeUnescapeQuote(mode, codePoints)) continue;
+
+      var type = _getPathCharType(c);
+      if (mode == 'error') return null;
+
+      var typeMap = _pathStateMachine[mode];
+      var transition = typeMap[type];
+      if (transition == null) transition = typeMap['else'];
+      if (transition == null) return null; // parse error;
+
+      mode = transition[0];
+      var actionName = transition.length > 1 ? transition[1] : null;
+      if (actionName == 'push' && key != null) push();
+      if (actionName == 'append') {
+        var newChar = transition.length > 2 && transition[2] != null
+            ? transition[2] : _char(c);
+        append(newChar);
+      }
+
+      if (mode == 'afterPath') return keys;
+    }
+    return null; // parse error
+  }
 }
 
 final Logger _logger = new Logger('observe.PathObserver');
@@ -364,11 +567,10 @@
 ///
 class CompoundObserver extends _Observer implements Bindable {
   _ObservedSet _directObserver;
+  bool _reportChangesOnOpen;
   List _observed = [];
 
-  bool get _isClosed => _observed == null;
-
-  CompoundObserver() {
+  CompoundObserver([this._reportChangesOnOpen = false]) {
     _value = [];
   }
 
@@ -387,8 +589,6 @@
   open(callback) => super.open(callback);
 
   void _connect() {
-    _check(skipChanges: true);
-
     for (var i = 0; i < _observed.length; i += 2) {
       var object = _observed[i];
       if (!identical(object, _observerSentinel)) {
@@ -396,22 +596,24 @@
         break;
       }
     }
+
+    _check(skipChanges: !_reportChangesOnOpen);
   }
 
   void _disconnect() {
+    for (var i = 0; i < _observed.length; i += 2) {
+      if (identical(_observed[i], _observerSentinel)) {
+        _observed[i + 1].close();
+      }
+    }
+
+    _observed = null;
     _value = null;
 
     if (_directObserver != null) {
       _directObserver.close(this);
       _directObserver = null;
     }
-
-    for (var i = 0; i < _observed.length; i += 2) {
-      if (identical(_observed[i], _observerSentinel)) {
-        _observed[i + 1].close();
-      }
-    }
-    _observed = null;
   }
 
   /// Adds a dependency on the property [path] accessed from [object].
@@ -422,8 +624,10 @@
       throw new StateError('Cannot add paths once started.');
     }
 
-    if (path is! PropertyPath) path = new PropertyPath(path);
+    path = new PropertyPath(path);
     _observed..add(object)..add(path);
+    if (!_reportChangesOnOpen) return;
+    _value.add(path.getValueFrom(object));
   }
 
   void addObserver(Bindable observer) {
@@ -431,11 +635,12 @@
       throw new StateError('Cannot add observers once started.');
     }
 
-    observer.open((_) => deliver());
     _observed..add(_observerSentinel)..add(observer);
+    if (!_reportChangesOnOpen) return;
+    _value.add(observer.open((_) => deliver()));
   }
 
-  void _iterateObjects(void observe(obj)) {
+  void _iterateObjects(void observe(obj, prop)) {
     for (var i = 0; i < _observed.length; i += 2) {
       var object = _observed[i];
       if (!identical(object, _observerSentinel)) {
@@ -449,11 +654,17 @@
     _value.length = _observed.length ~/ 2;
     var oldValues = null;
     for (var i = 0; i < _observed.length; i += 2) {
-      var pathOrObserver = _observed[i + 1];
       var object = _observed[i];
-      var value = identical(object, _observerSentinel) ?
-          (pathOrObserver as Bindable).value :
-          (pathOrObserver as PropertyPath).getValueFrom(object);
+      var path = _observed[i + 1];
+      var value;
+      if (identical(object, _observerSentinel)) {
+        var observable = path as Bindable;
+        value = _state == _Observer._UNOPENED ?
+            observable.open((_) => this.deliver()) :
+            observable.value;
+      } else {
+        value = (path as PropertyPath).getValueFrom(object);
+      }
 
       if (skipChanges) {
         _value[i ~/ 2] = value;
@@ -491,26 +702,28 @@
 const _observerSentinel = const _ObserverSentinel();
 class _ObserverSentinel { const _ObserverSentinel(); }
 
+// Visible for testing
+get observerSentinelForTesting => _observerSentinel;
+
 // A base class for the shared API implemented by PathObserver and
 // CompoundObserver and used in _ObservedSet.
 abstract class _Observer extends Bindable {
-  static int _nextBirthId = 0;
-
-  /// A number indicating when the object was created.
-  final int _birthId = _nextBirthId++;
-
   Function _notifyCallback;
   int _notifyArgumentCount;
   var _value;
 
   // abstract members
-  void _iterateObjects(void observe(obj));
+  void _iterateObjects(void observe(obj, prop));
   void _connect();
   void _disconnect();
-  bool get _isClosed;
   bool _check({bool skipChanges: false});
 
-  bool get _isOpen => _notifyCallback != null;
+  static int _UNOPENED = 0;
+  static int _OPENED = 1;
+  static int _CLOSED = 2;
+  int _state = _UNOPENED;
+  bool get _isOpen => _state == _OPENED;
+  bool get _isClosed => _state == _CLOSED;
 
   /// The number of arguments the subclass will pass to [_report].
   int get _reportArgumentCount;
@@ -529,6 +742,7 @@
     _notifyArgumentCount = min(_reportArgumentCount, smoke.maxArgs(callback));
 
     _connect();
+    _state = _OPENED;
     return _value;
   }
 
@@ -540,6 +754,7 @@
     _disconnect();
     _value = null;
     _notifyCallback = null;
+    _state = _CLOSED;
   }
 
   _discardChanges() {
@@ -575,6 +790,25 @@
   }
 }
 
+/// The observedSet abstraction is a perf optimization which reduces the total
+/// number of Object.observe observations of a set of objects. The idea is that
+/// groups of Observers will have some object dependencies in common and this
+/// observed set ensures that each object in the transitive closure of
+/// dependencies is only observed once. The observedSet acts as a write barrier
+/// such that whenever any change comes through, all Observers are checked for
+/// changed values.
+///
+/// Note that this optimization is explicitly moving work from setup-time to
+/// change-time.
+///
+/// TODO(rafaelw): Implement "garbage collection". In order to move work off
+/// the critical path, when Observers are closed, their observed objects are
+/// not Object.unobserve(d). As a result, it's possible that if the observedSet
+/// is kept open, but some Observers have been closed, it could cause "leaks"
+/// (prevent otherwise collectable objects from being collected). At some
+/// point, we should implement incremental "gc" which keeps a list of
+/// observedSets which may need clean-up and does small amounts of cleanup on a
+/// timeout until all is clean.
 class _ObservedSet {
   /// To prevent sequential [PathObserver]s and [CompoundObserver]s from
   /// observing the same object, we check if they are observing the same root
@@ -590,50 +824,54 @@
   /// reuse an [_ObservedSet] that starts from the same object.
   Object _rootObject;
 
+  /// Subset of properties in [_rootObject] that we care about.
+  Set _rootObjectProperties;
+
   /// Observers associated with this root object, in birth order.
-  final Map<int, _Observer> _observers = new SplayTreeMap();
+  final List<_Observer> _observers = [];
 
   // Dart note: the JS implementation is O(N^2) because Array.indexOf is used
-  // for lookup in these two arrays. We use HashMap to avoid this problem. It
+  // for lookup in this array. We use HashMap to avoid this problem. It
   // also gives us a nice way of tracking the StreamSubscription.
   Map<Object, StreamSubscription> _objects;
-  Map<Object, StreamSubscription> _toRemove;
 
-  bool _resetNeeded = false;
-
-  factory _ObservedSet(_Observer observer, Object rootObj) {
-    if (_lastSet == null || !identical(_lastSet._rootObject, rootObj)) {
-      _lastSet = new _ObservedSet._(rootObj);
+  factory _ObservedSet(_Observer observer, Object rootObject) {
+    if (_lastSet == null || !identical(_lastSet._rootObject, rootObject)) {
+      _lastSet = new _ObservedSet._(rootObject);
     }
-    _lastSet.open(observer);
+    _lastSet.open(observer, rootObject);
   }
 
-  _ObservedSet._(this._rootObject);
+  _ObservedSet._(rootObject)
+      : _rootObject = rootObject,
+        _rootObjectProperties = rootObject == null ? null : new Set();
 
-  void open(_Observer obs) {
-    _observers[obs._birthId] = obs;
+  void open(_Observer obs, Object rootObject) {
+    if (_rootObject == null) {
+      _rootObject = rootObject;
+      _rootObjectProperties = new Set();
+    }
+
+    _observers.add(obs);
     obs._iterateObjects(observe);
   }
 
   void close(_Observer obs) {
-    var anyLeft = false;
-
-    _observers.remove(obs._birthId);
-
-    if (_observers.isNotEmpty) {
-      _resetNeeded = true;
-      scheduleMicrotask(reset);
-      return;
-    }
-    _resetNeeded = false;
+    if (_observers.isNotEmpty) return;
 
     if (_objects != null) {
       for (var sub in _objects) sub.cancel();
       _objects = null;
     }
+    _rootObject = null;
+    _rootObjectProperties = null;
   }
 
-  void observe(Object obj) {
+  /// Observe now takes a second argument to indicate which property of an
+  /// object is being observed, so we don't trigger change notifications on
+  /// changes to unrelated properties.
+  void observe(Object obj, Object prop) {
+    if (identical(obj, _rootObject)) _rootObjectProperties.add(prop);
     if (obj is ObservableList) _observeStream(obj.listChanges);
     if (obj is Observable) _observeStream(obj.changes);
   }
@@ -644,37 +882,46 @@
     // going forward.
 
     if (_objects == null) _objects = new HashMap();
-    StreamSubscription sub = null;
-    if (_toRemove != null) sub = _toRemove.remove(stream);
-    if (sub != null) {
-      _objects[stream] = sub;
-    } else if (!_objects.containsKey(stream)) {
+    if (!_objects.containsKey(stream)) {
       _objects[stream] = stream.listen(_callback);
     }
   }
 
-  void reset() {
-    if (!_resetNeeded) return;
-
-    var objs = _toRemove == null ? new HashMap() : _toRemove;
-    _toRemove = _objects;
-    _objects = objs;
-    for (var observer in _observers.values) {
-      if (observer._isOpen) observer._iterateObjects(observe);
+  /// Whether we can ignore all change events in [records]. This is true if all
+  /// records are for properties in the [_rootObject] and we are not observing
+  /// any of those properties. Changes on objects other than [_rootObject], or
+  /// changes for properties in [_rootObjectProperties] can't be ignored.
+  // Dart note: renamed from `allRootObjNonObservedProps` in the JS code.
+  bool _canIgnoreRecords(List<ChangeRecord> records) {
+    for (var rec in records) {
+      if (rec is PropertyChangeRecord) {
+        if (!identical(rec.object, _rootObject) ||
+            _rootObjectProperties.contains(rec.name)) {
+          return false;
+        }
+      } else if (rec is ListChangeRecord) {
+        if (!identical(rec.object, _rootObject) ||
+            _rootObjectProperties.contains(rec.index)) {
+          return false;
+        }
+      } else {
+        // TODO(sigmund): consider adding object to MapChangeRecord, and make
+        // this more precise.
+        return false;
+      }
     }
-
-    for (var sub in _toRemove.values) sub.cancel();
-
-    _toRemove = null;
+    return true;
   }
 
   void _callback(records) {
-    for (var observer in _observers.values.toList(growable: false)) {
-      if (observer._isOpen) observer._check();
+    if (_canIgnoreRecords(records)) return;
+    for (var observer in _observers.toList(growable: false)) {
+      if (observer._isOpen) observer._iterateObjects(observe);
     }
 
-    _resetNeeded = true;
-    scheduleMicrotask(reset);
+    for (var observer in _observers.toList(growable: false)) {
+      if (observer._isOpen) observer._check();
+    }
   }
 }
 
diff --git a/pkg/observe/lib/transformer.dart b/pkg/observe/lib/transformer.dart
index 672db0b..21b08fe 100644
--- a/pkg/observe/lib/transformer.dart
+++ b/pkg/observe/lib/transformer.dart
@@ -15,7 +15,7 @@
 import 'package:analyzer/src/generated/scanner.dart';
 import 'package:barback/barback.dart';
 import 'package:source_maps/refactor.dart';
-import 'package:source_maps/span.dart' show SourceFile;
+import 'package:source_span/source_span.dart';
 
 /// A [Transformer] that replaces observables based on dirty-checking with an
 /// implementation based on change notifications.
@@ -65,7 +65,7 @@
       // TODO(sigmund): improve how we compute this url
       var url = id.path.startsWith('lib/')
             ? 'package:${id.package}/${id.path.substring(4)}' : id.path;
-      var sourceFile = new SourceFile.text(url, content);
+      var sourceFile = new SourceFile(content, url: url);
       var transaction = _transformCompilationUnit(
           content, sourceFile, transform.logger);
       if (!transaction.hasEdits) {
diff --git a/pkg/observe/pubspec.yaml b/pkg/observe/pubspec.yaml
index f2f738f..2c12f0f 100644
--- a/pkg/observe/pubspec.yaml
+++ b/pkg/observe/pubspec.yaml
@@ -1,5 +1,5 @@
 name: observe
-version: 0.11.0-dev
+version: 0.11.0+4
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Observable properties and objects for use in template_binding.
@@ -9,12 +9,14 @@
   user input into the DOM is immediately assigned to the model.
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
-  analyzer: '>=0.15.6 <0.16.0'
-  barback: '>=0.9.0 <0.15.0'
+  analyzer: '>=0.15.6 <0.22.0'
+  barback: '>=0.14.2 <0.16.0'
   logging: '>=0.9.0 <0.10.0'
   path: '>=0.9.0 <2.0.0'
-  smoke: '>=0.1.0 <0.2.0'
-  source_maps: '>=0.9.0 <0.10.0'
+  smoke: '>=0.1.0 <0.3.0'
+  source_maps: '>=0.9.4 <0.11.0'
+  source_span: '>=1.0.0 <2.0.0'
+  utf: '>=0.9.0 <0.10.0'
 dev_dependencies:
   unittest: '>=0.10.0 <0.11.0'
 environment:
diff --git a/pkg/observe/test/path_observer_test.dart b/pkg/observe/test/path_observer_test.dart
index 674f8b2..aae8887 100644
--- a/pkg/observe/test/path_observer_test.dart
+++ b/pkg/observe/test/path_observer_test.dart
@@ -5,6 +5,10 @@
 import 'dart:async';
 import 'package:observe/observe.dart';
 import 'package:unittest/unittest.dart';
+import 'package:observe/src/path_observer.dart'
+    show getSegmentsOfPropertyPathForTesting,
+         observerSentinelForTesting;
+
 import 'observe_test_utils.dart';
 
 // This file contains code ported from:
@@ -17,34 +21,100 @@
 
   group('PropertyPath', () {
     test('toString length', () {
-      expectPath(p, str, len) {
+      expectPath(p, str, len, [keys]) {
         var path = new PropertyPath(p);
         expect(path.toString(), str);
         expect(path.length, len, reason: 'expected path length $len for $path');
+        if (keys == null) {
+          expect(path.isValid, isFalse);
+        } else {
+          expect(path.isValid, isTrue);
+          expect(getSegmentsOfPropertyPathForTesting(path), keys);
+        }
       }
 
       expectPath('/foo', '<invalid path>', 0);
-      expectPath('abc', 'abc', 1);
-      expectPath('a.b.c', 'a.b.c', 3);
-      expectPath('a.b.c ', 'a.b.c', 3);
-      expectPath(' a.b.c', 'a.b.c', 3);
-      expectPath('  a.b.c   ', 'a.b.c', 3);
-      expectPath('1.abc', '1.abc', 2);
-      expectPath([#qux], 'qux', 1);
-      expectPath([1, #foo, #bar], '1.foo.bar', 3);
+      expectPath('1.abc', '<invalid path>', 0);
+      expectPath('abc', 'abc', 1, [#abc]);
+      expectPath('a.b.c', 'a.b.c', 3, [#a, #b, #c]);
+      expectPath('a.b.c ', 'a.b.c', 3, [#a, #b, #c]);
+      expectPath(' a.b.c', 'a.b.c', 3, [#a, #b, #c]);
+      expectPath('  a.b.c   ', 'a.b.c', 3, [#a, #b, #c]);
+      expectPath('[1].abc', '[1].abc', 2, [1, #abc]);
+      expectPath([#qux], 'qux', 1, [#qux]);
+      expectPath([1, #foo, #bar], '[1].foo.bar', 3, [1, #foo, #bar]);
+      expectPath([1, #foo, 'bar'], '[1].foo["bar"]', 3, [1, #foo, 'bar']);
+
+      // From test.js: "path validity" test:
+
+      expectPath('', '', 0, []);
+      expectPath(' ', '', 0, []);
+      expectPath(null, '', 0, []);
+      expectPath('a', 'a', 1, [#a]);
+      expectPath('a.b', 'a.b', 2, [#a, #b]);
+      expectPath('a. b', 'a.b', 2, [#a, #b]);
+      expectPath('a .b', 'a.b', 2, [#a, #b]);
+      expectPath('a . b', 'a.b', 2, [#a, #b]);
+      expectPath(' a . b ', 'a.b', 2, [#a, #b]);
+      expectPath('a[0]', 'a[0]', 2, [#a, 0]);
+      expectPath('a [0]', 'a[0]', 2, [#a, 0]);
+      expectPath('a[0][1]', 'a[0][1]', 3, [#a, 0, 1]);
+      expectPath('a [ 0 ] [ 1 ] ', 'a[0][1]', 3, [#a, 0, 1]);
+      expectPath('[1234567890] ', '[1234567890]', 1, [1234567890]);
+      expectPath(' [1234567890] ', '[1234567890]', 1, [1234567890]);
+      expectPath('opt0', 'opt0', 1, [#opt0]);
+      // Dart note: Modified to avoid a private Dart symbol:
+      expectPath(r'$foo.$bar.baz_', r'$foo.$bar.baz_', 3,
+          [#$foo, #$bar, #baz_]);
+      // Dart note: this test is different because we treat ["baz"] always as a
+      // indexing operation.
+      expectPath('foo["baz"]', 'foo.baz', 2, [#foo, #baz]);
+      expectPath('foo["b\\"az"]', 'foo["b\\"az"]', 2, [#foo, 'b"az']);
+      expectPath("foo['b\\'az']", 'foo["b\'az"]', 2, [#foo, "b'az"]);
+      expectPath([#a, #b], 'a.b', 2, [#a, #b]);
+
+      expectPath('.', '<invalid path>', 0);
+      expectPath(' . ', '<invalid path>', 0);
+      expectPath('..', '<invalid path>', 0);
+      expectPath('a[4', '<invalid path>', 0);
+      expectPath('a.b.', '<invalid path>', 0);
+      expectPath('a,b', '<invalid path>', 0);
+      expectPath('a["foo]', '<invalid path>', 0);
+      expectPath('[0x04]', '<invalid path>', 0);
+      expectPath('[0foo]', '<invalid path>', 0);
+      expectPath('[foo-bar]', '<invalid path>', 0);
+      expectPath('foo-bar', '<invalid path>', 0);
+      expectPath('42', '<invalid path>', 0);
+      expectPath('a[04]', '<invalid path>', 0);
+      expectPath(' a [ 04 ]', '<invalid path>', 0);
+      expectPath('  42   ', '<invalid path>', 0);
+      expectPath('foo["bar]', '<invalid path>', 0);
+      expectPath("foo['bar]", '<invalid path>', 0);
     });
 
+    test('objects with toString are not supported', () {
+      // Dart note: this was intentionally not ported. See path_observer.dart.
+      expect(() => new PropertyPath([new Foo('a'), new Foo('b')]), throws);
+    });
+
+    test('invalid path returns null value', () {
+      var path = new PropertyPath('a b');
+      expect(path.isValid, isFalse);
+      expect(path.getValueFrom({'a': {'b': 2}}), isNull);
+    });
+
+
     test('caching and ==', () {
-      var start = new PropertyPath('abc.0');
+      var start = new PropertyPath('abc[0]');
       for (int i = 1; i <= 100; i++) {
-        expect(identical(new PropertyPath('abc.0'), start), true,
+        expect(identical(new PropertyPath('abc[0]'), start), true,
           reason: 'should return identical path');
 
-        var p = new PropertyPath('abc.$i');
+        var p = new PropertyPath('abc[$i]');
         expect(identical(p, start), false,
             reason: 'different paths should not be merged');
       }
-      var end = new PropertyPath('abc.0');
+      var end = new PropertyPath('abc[0]');
       expect(identical(end, start), false,
           reason: 'first entry expired');
       expect(end, start, reason: 'different instances are equal');
@@ -52,7 +122,7 @@
 
     test('hashCode equal', () {
       var a = new PropertyPath([#foo, 2, #bar]);
-      var b = new PropertyPath('foo.2.bar');
+      var b = new PropertyPath('foo[2].bar');
       expect(identical(a, b), false, reason: 'only strings cached');
       expect(a, b, reason: 'same paths are equal');
       expect(a.hashCode, b.hashCode, reason: 'equal hashCodes');
@@ -68,6 +138,8 @@
       expect(a.hashCode, isNot(b.hashCode), reason: 'different hashCodes');
     });
   });
+
+  group('CompoundObserver', compoundObserverTests);
 });
 
 observePathTests() {
@@ -203,7 +275,7 @@
 
   test('Path Value With Indices', () {
     var model = toObservable([]);
-    var path = new PathObserver(model, '0');
+    var path = new PathObserver(model, '[0]');
     path.open(expectAsync((x) {
       expect(path.value, 123);
       expect(x, 123);
@@ -361,6 +433,215 @@
     expect(model.log, ['[]= bar 42']);
     model.log.clear();
   });
+
+  test('regression for TemplateBinding#161', () {
+    var model = toObservable({'obj': toObservable({'bar': false})});
+    var ob1 = new PathObserver(model, 'obj.bar');
+    var called = false;
+    ob1.open(() { called = true; });
+
+    var obj2 = new PathObserver(model, 'obj');
+    obj2.open(() { model['obj']['bar'] = true; });
+
+    model['obj'] = toObservable({ 'obj': 'obj' });
+
+    return new Future(() {})
+        .then((_) => expect(called, true));
+  });
+}
+
+compoundObserverTests() {
+  var model;
+  var observer;
+  bool called;
+  var newValues;
+  var oldValues;
+  var observed;
+
+  setUp(() {
+    model = new TestModel(1, 2, 3);
+    called = false;
+  });
+
+  callback(a, b, c) {
+    called = true;
+    newValues = a;
+    oldValues = b;
+    observed = c;
+  }
+
+  reset() {
+    called = false;
+    newValues = null;
+    oldValues = null;
+    observed = null;
+  }
+
+  expectNoChanges() {
+    observer.deliver();
+    expect(called, isFalse);
+    expect(newValues, isNull);
+    expect(oldValues, isNull);
+    expect(observed, isNull);
+  }
+
+  expectCompoundPathChanges(expectedNewValues,
+      expectedOldValues, expectedObserved, {deliver: true}) {
+    if (deliver) observer.deliver();
+    expect(called, isTrue);
+
+    expect(newValues, expectedNewValues);
+    var oldValuesAsMap = {};
+    for (int i = 0; i < expectedOldValues.length; i++) {
+      if (expectedOldValues[i] != null) {
+        oldValuesAsMap[i] = expectedOldValues[i];
+      }
+    }
+    expect(oldValues, oldValuesAsMap);
+    expect(observed, expectedObserved);
+
+    reset();
+  }
+
+  tearDown(() {
+    observer.close();
+    reset();
+  });
+
+  _path(s) => new PropertyPath(s);
+
+  test('simple', () {
+    observer = new CompoundObserver();
+    observer.addPath(model, 'a');
+    observer.addPath(model, 'b');
+    observer.addPath(model, _path('c'));
+    observer.open(callback);
+    expectNoChanges();
+
+    var expectedObs = [model, _path('a'), model, _path('b'), model, _path('c')];
+    model.a = -10;
+    model.b = 20;
+    model.c = 30;
+    expectCompoundPathChanges([-10, 20, 30], [1, 2, 3], expectedObs);
+
+    model.a = 'a';
+    model.c = 'c';
+    expectCompoundPathChanges(['a', 20, 'c'], [-10, null, 30], expectedObs);
+
+    model.a = 2;
+    model.b = 3;
+    model.c = 4;
+    expectCompoundPathChanges([2, 3, 4], ['a', 20, 'c'], expectedObs);
+
+    model.a = 'z';
+    model.b = 'y';
+    model.c = 'x';
+    expect(observer.value, ['z', 'y', 'x']);
+    expectNoChanges();
+
+    expect(model.a, 'z');
+    expect(model.b, 'y');
+    expect(model.c, 'x');
+    expectNoChanges();
+  });
+
+  test('reportChangesOnOpen', () {
+    observer = new CompoundObserver(true);
+    observer.addPath(model, 'a');
+    observer.addPath(model, 'b');
+    observer.addPath(model, _path('c'));
+
+    model.a = -10;
+    model.b = 20;
+    observer.open(callback);
+    var expectedObs = [model, _path('a'), model, _path('b'), model, _path('c')];
+    expectCompoundPathChanges([-10, 20, 3], [1, 2, null], expectedObs,
+        deliver: false);
+  });
+
+  test('All Observers', () {
+    observer = new CompoundObserver();
+    var pathObserver1 = new PathObserver(model, 'a');
+    var pathObserver2 = new PathObserver(model, 'b');
+    var pathObserver3 = new PathObserver(model, _path('c'));
+
+    observer.addObserver(pathObserver1);
+    observer.addObserver(pathObserver2);
+    observer.addObserver(pathObserver3);
+    observer.open(callback);
+
+    var expectedObs = [observerSentinelForTesting, pathObserver1,
+        observerSentinelForTesting, pathObserver2,
+        observerSentinelForTesting, pathObserver3];
+    model.a = -10;
+    model.b = 20;
+    model.c = 30;
+    expectCompoundPathChanges([-10, 20, 30], [1, 2, 3], expectedObs);
+
+    model.a = 'a';
+    model.c = 'c';
+    expectCompoundPathChanges(['a', 20, 'c'], [-10, null, 30], expectedObs);
+  });
+
+  test('Degenerate Values', () {
+    observer = new CompoundObserver();
+    observer.addPath(model, '.'); // invalid path
+    observer.addPath('obj-value', ''); // empty path
+    // Dart note: we don't port these two tests because in Dart we produce
+    // exceptions for these invalid paths.
+    // observer.addPath(model, 'foo'); // unreachable
+    // observer.addPath(3, 'bar'); // non-object with non-empty path
+    var values = observer.open(callback);
+    expect(values.length, 2);
+    expect(values[0], null);
+    expect(values[1], 'obj-value');
+    observer.close();
+  });
+
+  test('Heterogeneous', () {
+    model.c = null;
+    var otherModel = new TestModel(null, null, 3);
+
+    twice(value) => value * 2;
+    half(value) => value ~/ 2;
+
+    var compound = new CompoundObserver();
+    compound.addPath(model, 'a');
+    compound.addObserver(new ObserverTransform(new PathObserver(model, 'b'),
+                                               twice, setValue: half));
+    compound.addObserver(new PathObserver(otherModel, 'c'));
+
+    combine(values) => values[0] + values[1] + values[2];
+    observer = new ObserverTransform(compound, combine);
+
+    var newValue;
+    transformCallback(v) {
+      newValue = v;
+      called = true;
+    }
+    expect(observer.open(transformCallback), 8);
+
+    model.a = 2;
+    model.b = 4;
+    observer.deliver();
+    expect(called, isTrue);
+    expect(newValue, 13);
+    called = false;
+
+    model.b = 10;
+    otherModel.c = 5;
+    observer.deliver();
+    expect(called, isTrue);
+    expect(newValue, 27);
+    called = false;
+
+    model.a = 20;
+    model.b = 1;
+    otherModel.c = 5;
+    observer.deliver();
+    expect(called, isFalse);
+    expect(newValue, 27);
+  });
 }
 
 /// A matcher that checks that a closure throws a NoSuchMethodError matching the
@@ -426,7 +707,7 @@
 class TestModel extends ChangeNotifier {
   var _a, _b, _c;
 
-  TestModel();
+  TestModel([this._a, this._b, this._c]);
 
   get a => _a;
 
@@ -456,3 +737,9 @@
 
   WatcherModel();
 }
+
+class Foo {
+  var value;
+  Foo(this.value);
+  String toString() => 'Foo$value';
+}
diff --git a/pkg/pkg.status b/pkg/pkg.status
index a94c31a..617cee3 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -24,11 +24,14 @@
 third_party/angular_tests/browser_test/core_dom/shadow_root_options: Fail # Issue 18931 (Disabled for Chrome 35 roll)
 polymer/example/component/news/test/news_index_test: Pass, RuntimeError # Issue 18931
 intl/test/date_time_format_http_request_test: Pass, Timeout # Issue 19544
+polymer/e2e_test/experimental_boot/test/import_test: Skip # Issue 20307 (Timing out)
+polymer/e2e_test/experimental_boot/test/double_init_test: Skip # Issue 20307 (Timing out)
 
 [ $compiler == none && ($runtime == dartium) ]
 polymer/test/attr_deserialize_test: Pass, RuntimeError # Issue 18931
 polymer/test/attr_mustache_test: Pass, RuntimeError # Issue 18931
 polymer/test/bind_test: Pass, RuntimeError # Issue 18931
+polymer/test/computed_properties_test: Pass, RuntimeError # Issue 18931
 polymer/test/custom_event_test: Pass, RuntimeError # Issue 18931
 polymer/test/entered_view_test: Pass, RuntimeError # Issue 18931
 polymer/test/event_handlers_test: Pass, RuntimeError # Issue 18931
@@ -164,6 +167,8 @@
 polymer/test/attr_mustache_test: Skip #uses dart:html
 polymer/test/bind_test: Skip # uses dart:html
 polymer/test/bind_mdv_test: Skip # uses dart:html
+polymer/test/bind_properties_test: Skip # uses dart:html
+polymer/test/computed_properties_test: Skip # uses dart:html
 polymer/test/custom_event_test: Skip # uses dart:html
 polymer/test/entered_view_test: Skip # uses dart:html
 polymer/test/event_handlers_test: Skip #uses dart:html
@@ -253,9 +258,7 @@
 polymer/e2e_test/canonicalization: Skip
 polymer/e2e_test/experimental_boot: Skip
 
-third_party/angular_tests/browser_test: StaticWarning # Issue 15890
-
-[ $compiler == dartanalyzer ]
+[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 # This test uses third_party/pkg/perf_api/lib/perf_api.dart, which
 # contains illegal constant constructors.
 third_party/angular_tests/browser_test: CompileTimeError
@@ -265,10 +268,6 @@
 polymer/e2e_test/experimental_boot: Skip
 
 [ $compiler == dart2js && $csp ]
-polymer/test/noscript_test: Fail # Issue 17326
-polymer/test/js_custom_event_test: Fail # Issue 17326
-polymer/test/js_interop_test: Fail # Issue 17326
-
 # This test cannot run under CSP because it is injecting a JavaScript polyfill
 mutation_observer: Skip
 
@@ -465,3 +464,6 @@
 
 [ $runtime == drt ]
 http/test/html/client_test: Skip # Issue 18566
+
+[ $mode == debug ]
+analysis_server/test/integration/analysis_domain_int_test: Slow, Pass
diff --git a/pkg/pkgbuild.status b/pkg/pkgbuild.status
index 89acad4..12a9fd9 100644
--- a/pkg/pkgbuild.status
+++ b/pkg/pkgbuild.status
@@ -8,6 +8,8 @@
 samples/searchable_list: Pass, Slow
 pkg/docgen: Pass, Slow
 
+pkg/observatory: Skip # Issue 20306
+
 [ $use_repository_packages ]
 pkg/analyzer: PubGetError
 pkg/browser: PubGetError
@@ -17,7 +19,6 @@
 
 [ $use_public_packages ]
 samples/third_party/angular_todo: Pass, Slow
-pkg/polymer: PubGetError # smoke 0.2.0 has not been published
 
 [ $use_public_packages && $builder_tag == russian ]
 samples/third_party/todomvc: Fail # Issue 18104
diff --git a/pkg/polymer/CHANGELOG.md b/pkg/polymer/CHANGELOG.md
index 1f97959..b3fc2a5 100644
--- a/pkg/polymer/CHANGELOG.md
+++ b/pkg/polymer/CHANGELOG.md
@@ -4,14 +4,38 @@
 package. We will also note important changes to the polyfill packages (observe,
 web_components, and template_binding) if they impact polymer.
 
-#### Pub version 0.12.0-dev
- * Polymer Expressions had a breaking change so we also bumped the version on
-   this package.
- * Fix for [17596](https://code.google.com/p/dart/issues/detail?id=17596)
+#### Pub version 0.12.0+5
+  * Raise the lower bound on the source_maps constraint to exclude incompatible
+    versions.
 
-#### Pub version 0.11.1-dev
- * Use the latest template_binding with better NodeBind interop support (for
-   two-way bindings with JS polymer elements).
+#### Pub version 0.12.0+4
+  * Widen the constraint on source_maps.
+
+#### Pub version 0.12.0+3
+  * Fix a final use of `getLocationMessage`.
+
+#### Pub version 0.12.0+2
+  * Widen the constraint on barback.
+
+#### Pub version 0.12.0+1
+  * Switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan`
+    class.
+
+#### Pub version 0.12.0
+ * Updated to match polymer 0.3.4 ([polymer-dev#6ad2d61][6ad2d61]), this
+   includes the following changes:
+     * added @ComputedProperty
+     * @published can now be written using the readValue/writeValue helper
+       methods to match the same timing semantics as Javscript properties.
+     * underlying packages are also updated. Some noticeable changes are:
+       * observe: path-observers syntax is slightly different
+       * polymer_expressions: updating the value of an expression will issue a
+         notification.
+       * template_binding: better NodeBind interop support (for
+         two-way bindings with JS polymer elements).
+ * Several fixes for CSP, including a cherry-pick from polymer.js
+   [commit#3b690ad][3b690ad].
+ * Fix for [17596](https://code.google.com/p/dart/issues/detail?id=17596)
  * Fix for [19770](https://code.google.com/p/dart/issues/detail?id=19770)
 
 #### Pub version 0.11.0+5
@@ -40,6 +64,10 @@
   * **breaking change**: enteredView/leftView were renamed to attached/detached.
     The old lifecycle methods will not be invoked.
   * **breaking change**: Event bindings with `@` are no longer supported.
+  * **breaking change**: `@published` by default is no longer reflected as an
+    attribute by default. This might break if you try to use the attribute in
+    places like CSS selectors. To make it reflected back to an attribute use
+    `@PublishedProperty(reflect: true)`.
 
 #### Pub version 0.10.1
   * Reduce the analyzer work by mocking a small subset of the core libraries.
@@ -96,3 +124,6 @@
 
 #### Pub version 0.9.2+2
   * fix enteredView in dart2js, by using custom_element >= 0.9.1+1
+
+[6ad2d61]:https://github.com/Polymer/polymer-dev/commit/6a3e1b0e2a0bbe546f6896b3f4f064950d7aee8f
+[3b690ad]:https://github.com/Polymer/polymer-dev/commit/3b690ad0d995a7ea339ed601075de2f84d92bafd
diff --git a/pkg/polymer/README.md b/pkg/polymer/README.md
index 6aef5a5f..698aef0 100644
--- a/pkg/polymer/README.md
+++ b/pkg/polymer/README.md
@@ -40,7 +40,7 @@
 
 ```yaml
 dependencies:
-  polymer: ">=0.11.0 <0.12.0"
+  polymer: ">=0.12.0 <0.13.0"
 ```
 
 Instead of using `any`, we recommend using version ranges to avoid getting your
diff --git a/pkg/polymer/lib/polymer.dart b/pkg/polymer/lib/polymer.dart
index e7ab464..d30e6fa0 100644
--- a/pkg/polymer/lib/polymer.dart
+++ b/pkg/polymer/lib/polymer.dart
@@ -37,13 +37,6 @@
 /// Tips for converting your apps from Web UI to Polymer.dart.
 library polymer;
 
-// Last ported from: Fri May 30 12:45:10 2014 -0700
-// https://github.com/Polymer/polymer-dev/tree/32cc3e470e8ed760a9e596a24fe9b3ac2a87737c
-
-// Note: we are still missing some tests for new features. Use
-// git diff 37eea00e13b9f86ab21c85a955585e8e4237e3d2 test
-// from polymer-dev to see the changes.
-
 import 'dart:async';
 import 'dart:collection';
 import 'dart:html';
@@ -90,3 +83,4 @@
 part 'src/instance.dart';
 part 'src/job.dart';
 part 'src/loader.dart';
+part 'src/property_accessor.dart';
diff --git a/pkg/polymer/lib/src/build/common.dart b/pkg/polymer/lib/src/build/common.dart
index 03c05bf..ac74e89 100644
--- a/pkg/polymer/lib/src/build/common.dart
+++ b/pkg/polymer/lib/src/build/common.dart
@@ -16,7 +16,6 @@
 import 'package:html5lib/parser.dart' show HtmlParser;
 import 'package:path/path.dart' as path;
 import 'package:observe/transformer.dart' show ObservableTransformer;
-import 'package:source_maps/span.dart' show Span;
 
 const _ignoredErrors = const [
   'unexpected-dash-after-double-dash-in-comment',
@@ -125,9 +124,9 @@
   String toString() => 'polymer ($runtimeType)';
 }
 
-/// Gets the appropriate URL to use in a [Span] to produce messages
-/// (e.g. warnings) for users. This will attempt to format the URL in the most
-/// useful way:
+/// Gets the appropriate URL to use in a span to produce messages (e.g.
+/// warnings) for users. This will attempt to format the URL in the most useful
+/// way:
 ///
 /// - If the asset is within the primary package, then use the [id.path],
 ///   the user will know it is a file from their own code.
diff --git a/pkg/polymer/lib/src/build/import_inliner.dart b/pkg/polymer/lib/src/build/import_inliner.dart
index 675db29..1c871ac 100644
--- a/pkg/polymer/lib/src/build/import_inliner.dart
+++ b/pkg/polymer/lib/src/build/import_inliner.dart
@@ -17,7 +17,7 @@
     Document, DocumentFragment, Element, Node;
 import 'package:html5lib/dom_parsing.dart' show TreeVisitor;
 import 'package:source_maps/refactor.dart' show TextEditTransaction;
-import 'package:source_maps/span.dart';
+import 'package:source_span/source_span.dart';
 
 import 'common.dart';
 
@@ -226,21 +226,27 @@
   bool _extractScripts(Document doc, {bool injectLibraryName: true}) {
     bool changed = false;
     for (var script in doc.querySelectorAll('script')) {
-      if (script.attributes['type'] != TYPE_DART) continue;
-
       var src = script.attributes['src'];
       if (src != null) continue;
 
+      var type = script.attributes['type'];
+      var isDart = type == TYPE_DART;
+
+      var shouldExtract = isDart ||
+          (options.contentSecurityPolicy && (type == null || type == TYPE_JS));
+      if (!shouldExtract) continue;
+
+      var extension =  isDart ? 'dart' : 'js';
       final filename = path.url.basename(docId.path);
       final count = inlineScriptCounter++;
       var code = script.text;
       // TODO(sigmund): ensure this path is unique (dartbug.com/12618).
-      script.attributes['src'] = src = '$filename.$count.dart';
+      script.attributes['src'] = src = '$filename.$count.$extension';
       script.text = '';
       changed = true;
 
-      var newId = docId.addExtension('.$count.dart');
-      if (injectLibraryName && !_hasLibraryDirective(code)) {
+      var newId = docId.addExtension('.$count.$extension');
+      if (isDart && injectLibraryName && !_hasLibraryDirective(code)) {
         var libName = _libraryNameFor(docId, count);
         code = "library $libName;\n$code";
       }
@@ -369,7 +375,7 @@
   // Maybe it's reliable enough for finding URLs in CSS? I'm not sure.
   String visitCss(String cssText) {
     var url = spanUrlFor(sourceId, transform);
-    var src = new SourceFile.text(url, cssText);
+    var src = new SourceFile(cssText, url: url);
     return cssText.replaceAllMapped(_URL, (match) {
       // Extract the URL, without any surrounding quotes.
       var span = src.span(match.start, match.end);
@@ -381,7 +387,7 @@
 
   String visitInlineDart(String code) {
     var unit = parseDirectives(code, suppressErrors: true);
-    var file = new SourceFile.text(spanUrlFor(sourceId, transform), code);
+    var file = new SourceFile(code, url: spanUrlFor(sourceId, transform));
     var output = new TextEditTransaction(code, file);
     var foundLibraryDirective = false;
     for (Directive directive in unit.directives) {
@@ -413,10 +419,10 @@
 
     // TODO(sigmund): emit source maps when barback supports it (see
     // dartbug.com/12340)
-    return (output.commit()..build(file.url)).text;
+    return (output.commit()..build(file.url.toString())).text;
   }
 
-  String _newUrl(String href, Span span) {
+  String _newUrl(String href, SourceSpan span) {
     // Uri.parse blows up on invalid characters (like {{). Encoding the uri
     // allows it to be parsed, which does the correct thing in the general case.
     // This uri not used to build the new uri, so it never needs to be decoded.
diff --git a/pkg/polymer/lib/src/build/linter.dart b/pkg/polymer/lib/src/build/linter.dart
index a48badb..714e50e 100644
--- a/pkg/polymer/lib/src/build/linter.dart
+++ b/pkg/polymer/lib/src/build/linter.dart
@@ -12,7 +12,7 @@
 import 'package:code_transformers/assets.dart';
 import 'package:html5lib/dom.dart';
 import 'package:html5lib/dom_parsing.dart';
-import 'package:source_maps/span.dart';
+import 'package:source_span/source_span.dart';
 
 import 'common.dart';
 import 'utils.dart';
@@ -130,7 +130,7 @@
 class _ElementSummary {
   final String tagName;
   final String extendsTag;
-  final Span span;
+  final SourceSpan span;
 
   _ElementSummary extendsType;
   bool hasConflict = false;
diff --git a/pkg/polymer/lib/src/build/polyfill_injector.dart b/pkg/polymer/lib/src/build/polyfill_injector.dart
index baabe10..a467af5 100644
--- a/pkg/polymer/lib/src/build/polyfill_injector.dart
+++ b/pkg/polymer/lib/src/build/polyfill_injector.dart
@@ -69,15 +69,12 @@
       // fixing our tests: even if content_shell supports Dart VM, we'll still
       // test the compiled JS code.
       if (options.directlyIncludeJS) {
-        // If using CSP add the "precompiled" extension
-        final csp = options.contentSecurityPolicy ? '.precompiled' : '';
-
         // Replace all other Dart script tags with JavaScript versions.
         for (var script in dartScripts) {
           final src = script.attributes['src'];
           if (src.endsWith('.dart')) {
             script.attributes.remove('type');
-            script.attributes['src'] = '$src$csp.js';
+            script.attributes['src'] = '$src.js';
             // TODO(sigmund): we shouldn't need 'async' here. Remove this
             // workaround for dartbug.com/19653.
             script.attributes['async'] = '';
diff --git a/pkg/polymer/lib/src/build/runner.dart b/pkg/polymer/lib/src/build/runner.dart
index dd511a2..2a9e18a 100644
--- a/pkg/polymer/lib/src/build/runner.dart
+++ b/pkg/polymer/lib/src/build/runner.dart
@@ -367,9 +367,8 @@
   if (entry.span == null) {
     output.write(entry.message);
   } else {
-    output.write(entry.span.getLocationMessage(entry.message,
-          useColors: useColors,
-          color: levelColor));
+    output.write(entry.span.message(entry.message,
+          color: useColors ? levelColor : null));
   }
   return output.toString();
 }
diff --git a/pkg/polymer/lib/src/build/script_compactor.dart b/pkg/polymer/lib/src/build/script_compactor.dart
index 1f76ae9..bc09c68 100644
--- a/pkg/polymer/lib/src/build/script_compactor.dart
+++ b/pkg/polymer/lib/src/build/script_compactor.dart
@@ -16,7 +16,7 @@
 import 'package:analyzer/src/generated/element.dart' as analyzer show Element;
 import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
-import 'package:source_maps/span.dart' show SourceFile, Span;
+import 'package:source_span/source_span.dart';
 import 'package:smoke/codegen/generator.dart';
 import 'package:smoke/codegen/recorder.dart';
 import 'package:code_transformers/resolver.dart';
@@ -140,6 +140,8 @@
   /// Code generator used to create the static initialization for smoke.
   final generator = new SmokeCodeGenerator();
 
+  _SubExpressionVisitor expressionVisitor;
+
   _ScriptCompactor(Transform transform, this.options, this.resolvers)
       : transform = transform,
         logger = transform.logger,
@@ -228,7 +230,9 @@
   void _extractUsesOfMirrors(_) {
     // Generate getters and setters needed to evaluate polymer expressions, and
     // extract information about published attributes.
-    new _HtmlExtractor(logger, generator, publishedAttributes).visit(document);
+    expressionVisitor = new _SubExpressionVisitor(generator, logger);
+    new _HtmlExtractor(logger, generator, publishedAttributes,
+        expressionVisitor).visit(document);
 
     // Create a recorder that uses analyzer data to feed data to [generator].
     var recorder = new Recorder(generator,
@@ -308,7 +312,16 @@
     // *Changed and @ObserveProperty instead.
     recorder.runQuery(cls, new QueryOptions(
           includeUpTo: types.htmlElementElement,
-          withAnnotations: [types.publishedElement, types.observableElement]));
+          withAnnotations: [types.publishedElement, types.observableElement,
+          types.computedPropertyElement]));
+
+    // Include @ComputedProperty and process their expressions
+    var computed = [];
+    recorder.runQuery(cls, new QueryOptions(
+          includeUpTo: types.htmlElementElement,
+          withAnnotations: [types.computedPropertyElement]),
+          results: computed);
+    _processComputedExpressions(computed);
 
     for (var tagName in tagNames) {
       // Include an initializer that will call Polymer.register
@@ -339,20 +352,28 @@
   /// If [meta] is [CustomTag], extract the name associated with the tag.
   String _extractTagName(Annotation meta, ClassElement cls) {
     if (meta.element != types.customTagConstructor) return null;
+    return _extractFirstAnnotationArgument(meta, 'CustomTag', cls);
+  }
+
+  /// Extract the first argument of an annotation and validate that it's type is
+  /// String. For instance, return "bar" from `@Foo("bar")`.
+  String _extractFirstAnnotationArgument(Annotation meta, String name,
+      analyzer.Element context) {
 
     // Read argument from the AST
     var args = meta.arguments.arguments;
     if (args == null || args.length == 0) {
-      logger.warning('Missing argument in @CustomTag annotation',
-          span: _spanForNode(cls, meta));
+      logger.warning('Missing argument in @$name annotation',
+          span: _spanForNode(context, meta));
       return null;
     }
 
-    var res = resolver.evaluateConstant(
-        cls.enclosingElement.enclosingElement, args[0]);
+    var lib = context;
+    while (lib is! LibraryElement) lib = lib.enclosingElement;
+    var res = resolver.evaluateConstant(lib, args[0]);
     if (!res.isValid || res.value.type != types.stringType) {
-      logger.warning('The parameter to @CustomTag seems to be invalid.',
-          span: _spanForNode(cls, args[0]));
+      logger.warning('The parameter to @$name seems to be invalid.',
+          span: _spanForNode(context, args[0]));
       return null;
     }
     return res.value.stringValue;
@@ -380,6 +401,22 @@
     initializers.add(new _InitMethodInitializer(id, function.displayName));
   }
 
+  /// Process members that are annotated with `@ComputedProperty` and records
+  /// the accessors of their expressions.
+  _processComputedExpressions(List<analyzer.Element> computed) {
+    var constructor = types.computedPropertyElement.constructors.first;
+    for (var member in computed) {
+      for (var meta in member.node.metadata) {
+        if (meta.element != constructor) continue;
+        var expr = _extractFirstAnnotationArgument(
+            meta, 'ComputedProperty', member);
+        if (expr == null) continue;
+        expressionVisitor.run(pe.parse(expr), true,
+            _spanForNode(member.enclosingElement, meta.arguments.arguments[0]));
+      }
+    }
+  }
+
   /// Writes the final output for the bootstrap Dart file and entrypoint HTML
   /// file.
   void _emitFiles(_) {
@@ -465,8 +502,6 @@
       "() => Polymer.register('$tagName', $prefix.$typeName)";
 }
 
-_getSpan(SourceFile file, AstNode node) => file.span(node.offset, node.end);
-
 const MAIN_HEADER = """
 library app_bootstrap;
 
@@ -488,14 +523,12 @@
 class _HtmlExtractor extends TreeVisitor {
   final Map<String, List<String>> publishedAttributes;
   final SmokeCodeGenerator generator;
-  final _SubExpressionVisitor visitor;
+  final _SubExpressionVisitor expressionVisitor;
   final TransformLogger logger;
   bool _inTemplate = false;
 
-  _HtmlExtractor(TransformLogger logger, SmokeCodeGenerator generator,
-      this.publishedAttributes)
-      : logger = logger, generator = generator,
-        visitor = new _SubExpressionVisitor(generator, logger);
+  _HtmlExtractor(this.logger, this.generator, this.publishedAttributes,
+      this.expressionVisitor);
 
   void visitElement(Element node) {
     if (_inTemplate) _processNormalElement(node);
@@ -560,7 +593,7 @@
   }
 
   void _addExpression(String stringExpression, bool inEvent, bool isTwoWay,
-      Span span) {
+      SourceSpan span) {
 
     if (inEvent) {
       if (stringExpression.startsWith('@')) {
@@ -578,7 +611,7 @@
       generator.addGetter(stringExpression);
       generator.addSymbol(stringExpression);
     }
-    visitor.run(pe.parse(stringExpression), isTwoWay, span);
+    expressionVisitor.run(pe.parse(stringExpression), isTwoWay, span);
   }
 }
 
@@ -588,7 +621,7 @@
   final SmokeCodeGenerator generator;
   final TransformLogger logger;
   bool _includeSetter;
-  Span _currentSpan;
+  SourceSpan _currentSpan;
 
   _SubExpressionVisitor(this.generator, this.logger);
 
@@ -690,6 +723,9 @@
   /// Element representing the type of `@ObserveProperty`.
   final ClassElement observePropertyElement;
 
+  /// Element representing the type of `@ComputedProperty`.
+  final ClassElement computedPropertyElement;
+
   /// Element representing the `@initMethod` annotation.
   final TopLevelVariableElement initMethodElement;
 
@@ -723,6 +759,7 @@
     var publishedElement = _lookupType(polymerLib, 'PublishedProperty');
     var observableElement = _lookupType(observeLib, 'ObservableProperty');
     var observePropertyElement = _lookupType(polymerLib, 'ObserveProperty');
+    var computedPropertyElement = _lookupType(polymerLib, 'ComputedProperty');
     var polymerClassElement = _lookupType(polymerLib, 'Polymer');
     var htmlElementElement = _lookupType(htmlLib, 'HtmlElement');
     var stringType = _lookupType(coreLib, 'String').type;
@@ -730,13 +767,15 @@
 
     return new _ResolvedTypes.internal(htmlElementElement, stringType,
       polymerClassElement, customTagConstructor, publishedElement,
-      observableElement, observePropertyElement, initMethodElement);
+      observableElement, observePropertyElement, computedPropertyElement,
+      initMethodElement);
   }
 
   _ResolvedTypes.internal(this.htmlElementElement, this.stringType,
       this.polymerClassElement, this.customTagConstructor,
       this.publishedElement, this.observableElement,
-      this.observePropertyElement, this.initMethodElement);
+      this.observePropertyElement, this.computedPropertyElement,
+      this.initMethodElement);
 
   static _lookupType(LibraryElement lib, String typeName) {
     var result = lib.getType(typeName);
diff --git a/pkg/polymer/lib/src/declaration.dart b/pkg/polymer/lib/src/declaration.dart
index 0ae6641..a82017b 100644
--- a/pkg/polymer/lib/src/declaration.dart
+++ b/pkg/polymer/lib/src/declaration.dart
@@ -41,6 +41,9 @@
 
   Map<PropertyPath, List<Symbol>> _observe;
 
+  /// Name and expression for each computed property.
+  Map<Symbol, String> _computed = {};
+
   Map<String, Object> _instanceAttributes;
 
   /// A set of properties that should be automatically reflected to attributes.
@@ -110,6 +113,7 @@
     // desugar compound observer syntax, e.g. @ObserveProperty('a b c')
     explodeObservers();
 
+    createPropertyAccessors();
     // install mdv delegate on template
     installBindingDelegate(fetchTemplate());
     // install external stylesheets as if they are inline
@@ -210,7 +214,8 @@
         // remove excess ws
         attr = attr.trim();
 
-        // do not override explicit entries
+        // if the user hasn't specified a value, we want to use the
+        // default, unless a superclass has already chosen one
         if (attr == '') continue;
 
         var property = smoke.nameToSymbol(attr);
@@ -448,6 +453,26 @@
     });
     return map;
   }
+
+  void createPropertyAccessors() {
+    // Dart note: since we don't have a prototype in Dart, most of the work of
+    // createPolymerAccessors is done lazily on the first access of properties.
+    // Here we just extract the information from annotations and store it as
+    // properties on the declaration.
+    var options = const smoke.QueryOptions(includeInherited: true,
+        includeUpTo: HtmlElement, withAnnotations: const [ComputedProperty]);
+    var existing = {};
+    for (var decl in smoke.query(type, options)) {
+      var meta = decl.annotations.firstWhere((e) => e is ComputedProperty);
+      var name = decl.name;
+      var prev = existing[name];
+      // The definition of a child class takes priority.
+      if (prev == null || smoke.isSubclassOf(decl.type, prev.type)) {
+        _computed[name] = meta.expression;
+        existing[name] = decl;
+      }
+    }
+  }
 }
 
 /// maps tag names to prototypes
diff --git a/pkg/polymer/lib/src/events.dart b/pkg/polymer/lib/src/events.dart
index d41f199..ccf0786 100644
--- a/pkg/polymer/lib/src/events.dart
+++ b/pkg/polymer/lib/src/events.dart
@@ -17,7 +17,9 @@
   /// Ideally we would inherit from it, but mixins can't be applied to a type
   /// that forwards to a superclass with a constructor that has optional or
   /// named arguments.
-  final BindingDelegate _delegate;
+  final polymer_expressions.PolymerExpressions _delegate;
+
+  Map<String, Object> get globals => _delegate.globals;
 
   PolymerExpressions({Map<String, Object> globals})
       : _delegate = new polymer_expressions.PolymerExpressions(
@@ -35,6 +37,11 @@
 
   prepareInstancePositionChanged(Element template) =>
       _delegate.prepareInstancePositionChanged(template);
+
+  static final getExpression =
+      polymer_expressions.PolymerExpressions.getExpression;
+  static final getBinding = polymer_expressions.PolymerExpressions.getBinding;
+
 }
 
 /// A mixin for a [BindingDelegate] to add Polymer event support.
diff --git a/pkg/polymer/lib/src/instance.dart b/pkg/polymer/lib/src/instance.dart
index 3cc2e1a..b63ef93 100644
--- a/pkg/polymer/lib/src/instance.dart
+++ b/pkg/polymer/lib/src/instance.dart
@@ -4,7 +4,7 @@
 
 part of polymer;
 
-/// Use this annotation to publish a field as an attribute.
+/// Use this annotation to publish a property as an attribute.
 ///
 /// You can also use [PublishedProperty] to provide additional information,
 /// such as automatically syncing the property back to the attribute.
@@ -24,15 +24,31 @@
 ///       //
 ///       // If the template is instantiated or given a model, `x` will be
 ///       // used for this field and updated whenever `volume` changes.
-///       @published double volume;
+///       @published
+///       double get volume => readValue(#volume);
+///       set volume(double newValue) => writeValue(#volume, newValue);
 ///
 ///       // This will be available as an HTML attribute, like above, but it
 ///       // will also serialize values set to the property to the attribute.
 ///       // In other words, attributes['volume2'] will contain a serialized
 ///       // version of this field.
-///       @PublishedProperty(reflect: true) double volume2;
+///       @PublishedProperty(reflect: true)
+///       double get volume2 => readValue(#volume2);
+///       set volume2(double newValue) => writeValue(#volume2, newValue);
 ///     }
 ///
+/// **Important note**: the pattern using `readValue` and `writeValue`
+/// guarantees that reading the property will give you the latest value at any
+/// given time, even if change notifications have not been propagated.
+///
+/// We still support using @published on a field, but this will not
+/// provide the same guarantees, so this is discouraged. For example:
+///
+///       // Avoid this if possible. This will be available as an HTML
+///       // attribute too, but you might need to delay reading volume3 
+///       // asynchronously to guarantee that you read the latest value
+///       // set through bindings.
+///       @published double volume3;
 const published = const PublishedProperty();
 
 /// An annotation used to publish a field as an attribute. See [published].
@@ -72,6 +88,45 @@
   const ObserveProperty(this._names);
 }
 
+/// Use this to create computed properties that are updated automatically. The
+/// annotation includes a polymer expression that describes how this property
+/// value can be expressed in terms of the values of other properties. For
+/// example:
+///
+///     class MyPlaybackElement extends PolymerElement {
+///       @observable int x;
+///
+///       // Reading xTimes2 will return x * 2.
+///       @ComputedProperty('x * 2')
+///       int get xTimes2 => readValue(#xTimes2);
+///
+/// If the polymer expression is assignable, you can also define a setter for
+/// it. For example:
+///
+///       // Reading c will return a.b, writing c will update a.b.
+///       @ComputedProperty('a.b')
+///       get c => readValue(#c);
+///       set c(newValue) => writeValue(#c, newValue);
+///
+/// The expression can do anything that is allowed in a polymer expresssion,
+/// even making calls to methods in your element. However, dependencies that are
+/// only used within those methods and that are not visible in the polymer
+/// expression, will not be observed. For example:
+///
+///       // Because `x` only appears inside method `m`, we will not notice
+///       // that `d` has changed if `x` is modified. However, `d` will be
+///       // updated whenever `c` changes.
+///       @ComputedProperty('m(c)')
+///       get d => readValue(#d);
+///
+///       m(c) => c + x;
+class ComputedProperty {
+  /// A polymer expression, evaluated in the context of the custom element where
+  /// this annotation is used.
+  final String expression;
+
+  const ComputedProperty(this.expression);
+}
 
 /// Base class for PolymerElements deriving from HtmlElement.
 ///
@@ -174,7 +229,7 @@
   @deprecated PolymerDeclaration get declaration => _element;
 
   Map<String, StreamSubscription> _namedObservers;
-  List<Iterable<Bindable>> _observers = [];
+  List<Bindable> _observers = [];
 
   bool _unbound; // lazy-initialized
   PolymerJob _unbindAllJob;
@@ -238,6 +293,53 @@
   /// prevent that from happening.
   bool get preventDispose => false;
 
+  /// Properties exposed by this element.
+  // Dart note: unlike Javascript we can't override the original property on
+  // the object, so we use this mechanism instead to define properties. See more
+  // details in [_PropertyAccessor].
+  Map<Symbol, _PropertyAccessor> _properties = {};
+
+  /// Helper to implement a property with the given [name]. This is used for
+  /// normal and computed properties. Normal properties can provide the initial
+  /// value using the [initialValue] function. Computed properties ignore
+  /// [initialValue], their value is derived from the expression in the
+  /// [ComputedProperty] annotation that appears above the getter that uses this
+  /// helper.
+  readValue(Symbol name, [initialValue()]) {
+    var property = _properties[name];
+    if (property == null) {
+      var value;
+      // Dart note: most computed properties are created in advance in
+      // createComputedProperties, but if one computed property depends on
+      // another, the declaration order might matter. Rather than trying to
+      // register them in order, we include here also the option of lazily
+      // creating the property accessor on the first read.
+      var binding = _getBindingForComputedProperty(name);
+      if (binding == null) { // normal property
+        value = initialValue != null ? initialValue() : null;
+      } else {
+        value = binding.value;
+      }
+      property = _properties[name] = new _PropertyAccessor(name, this, value);
+    }
+    return property.value;
+  }
+
+  /// Helper to implement a setter of a property with the given [name] on a
+  /// polymer element. This can be used on normal properties and also on
+  /// computed properties, as long as the expression used for the computed
+  /// property is assignable (see [ComputedProperty]).
+  writeValue(Symbol name, newValue) {
+    var property = _properties[name];
+    if (property == null) {
+      // Note: computed properties are created in advance in
+      // createComputedProperties, so we should only need to create here
+      // non-computed properties.
+      property = _properties[name] = new _PropertyAccessor(name, this, null);
+    }
+    property.value = newValue;
+  }
+
   /// If this class is used as a mixin, this method must be called from inside
   /// of the `created()` constructor.
   ///
@@ -291,6 +393,7 @@
   makeElementReady() {
     if (_readied) return;
     _readied = true;
+    createComputedProperties();
 
     // TODO(sorvell): We could create an entry point here
     // for the user to compute property values.
@@ -554,7 +657,7 @@
       syntax = element.syntax;
     }
     var dom = t.createInstance(this, syntax);
-    registerObservers(getTemplateInstanceBindings(dom));
+    _observers.addAll(getTemplateInstanceBindings(dom));
     return dom;
   }
 
@@ -640,7 +743,7 @@
     if (observe != null) {
       var o = _propertyObserver = new CompoundObserver();
       // keep track of property observer so we can shut it down
-      registerObservers([o]);
+      _observers.add(o);
 
       for (var path in observe.keys) {
         o.addPath(this, path);
@@ -656,10 +759,13 @@
     if (_propertyObserver != null) {
       _propertyObserver.open(notifyPropertyChanges);
     }
-    // Dart note: we need an extra listener.
-    // see comment on [_propertyChange].
+
+    // Dart note: we need an extra listener only to continue supporting
+    // @published properties that follow the old syntax until we get rid of it.
+    // This workaround has timing issues so we prefer the new, not so nice,
+    // syntax.
     if (_element._publish != null) {
-      changes.listen(_propertyChange);
+      changes.listen(_propertyChangeWorkaround);
     }
   }
 
@@ -705,19 +811,26 @@
     }
   }
 
-  // Dart note: this is not called by observe-js because we don't have
-  // the mechanism for defining properties on our proto.
-  // TODO(jmesserly): this has similar timing issues as our @published
-  // properties do generally -- it's async when it should be sync.
-  void _propertyChange(List<ChangeRecord> records) {
+  // Dart note: this workaround is only for old-style @published properties,
+  // which have timing issues. See _bindOldStylePublishedProperty below.
+  // TODO(sigmund): deprecate this.
+  void _propertyChangeWorkaround(List<ChangeRecord> records) {
     for (var record in records) {
       if (record is! PropertyChangeRecord) continue;
 
-      final name = smoke.symbolToName(record.name);
-      final reflect = _element._reflect;
-      if (reflect != null && reflect.contains(name)) {
-        reflectPropertyToAttribute(name);
-      }
+      var name = record.name;
+      // The setter of a new-style property will create an accessor in
+      // _properties[name]. We can skip the workaround for those properties.
+      if (_properties[name] != null) continue;
+      _propertyChange(name);
+    }
+  }
+
+  void _propertyChange(Symbol nameSymbol) {
+    var name = smoke.symbolToName(nameSymbol);
+    var reflect = _element._reflect;
+    if (reflect != null && reflect.contains(name)) {
+      reflectPropertyToAttribute(name);
     }
   }
 
@@ -751,19 +864,97 @@
     }
   }
 
-  void registerObservers(Iterable<Bindable> observers) {
-    _observers.add(observers);
+  emitPropertyChangeRecord(Symbol name, newValue, oldValue) {
+    if (identical(oldValue, newValue)) return;
+    _propertyChange(name);
   }
 
+  bindToAccessor(Symbol name, Bindable bindable, {resolveBindingValue: false}) {
+    // Dart note: our pattern is to declare the initial value in the getter.  We
+    // read it via smoke to ensure that the value is initialized correctly.
+    var oldValue = smoke.read(this, name);
+    var property = _properties[name];
+    if (property == null) {
+      // We know that _properties[name] is null only for old-style @published
+      // properties. This fallback is here to make it easier to deprecate the
+      // old-style of published properties, which have bad timing guarantees
+      // (see comment in _PolymerBinding).
+      return _bindOldStylePublishedProperty(name, bindable, oldValue);
+    }
+
+    property.bindable = bindable;
+    var value = bindable.open(property.updateValue);
+
+    if (resolveBindingValue) {
+      // capture A's value if B's value is null or undefined,
+      // otherwise use B's value
+      var v = (value == null ? oldValue : value);
+      if (!identical(value, oldValue)) {
+        bindable.value = value = v;
+      }
+    }
+
+    property.updateValue(value);
+    var o = new _CloseOnlyBinding(property);
+    _observers.add(o);
+    return o;
+  }
+
+  // Dart note: this fallback uses our old-style binding mechanism to be able to
+  // link @published properties with bindings. This mechanism is backwards from
+  // what Javascript does because we can't override the original property. This
+  // workaround also brings some timing issues which are described in detail in
+  // dartbug.com/18343.
+  // TODO(sigmund): deprecate old-style @published properties.
+  _bindOldStylePublishedProperty(Symbol name, Bindable bindable, oldValue) {
+    // capture A's value if B's value is null or undefined,
+    // otherwise use B's value
+    if (bindable.value == null) bindable.value = oldValue;
+
+    var o = new _PolymerBinding(this, name, bindable);
+    _observers.add(o);
+    return o;
+  }
+
+  _getBindingForComputedProperty(Symbol name) {
+    var exprString = element._computed[name];
+    if (exprString == null) return null;
+    var expr = PolymerExpressions.getExpression(exprString);
+    return PolymerExpressions.getBinding(expr, this,
+        globals: element.syntax.globals);
+  }
+
+  createComputedProperties() {
+    var computed = this.element._computed;
+    for (var name in computed.keys) {
+      try {
+        // Dart note: this is done in Javascript by modifying the prototype in
+        // declaration/properties.js, we can't do that, so we do it here.
+        var binding = _getBindingForComputedProperty(name);
+
+        // Follow up note: ideally we would only create the accessor object
+        // here, but some computed properties might depend on others and
+        // evaluating `binding.value` could try to read the value of another
+        // computed property that we haven't created yet. For this reason we
+        // also allow to also create the accessor in [readValue].
+        if (_properties[name] == null) {
+          _properties[name] = new _PropertyAccessor(name, this, binding.value);
+        }
+        bindToAccessor(name, binding);
+      } catch (e) {
+        window.console.error('Failed to create computed property $name'
+            ' (${computed[name]}): $e');
+      }
+    }
+  }
+
+  // Dart note: to simplify the code above we made registerObserver calls
+  // directly invoke _observers.add/addAll.
   void closeObservers() {
-    _observers.forEach(closeObserverList);
-    _observers = [];
-  }
-
-  void closeObserverList(Iterable<Bindable> observers) {
-    for (var o in observers) {
+    for (var o in _observers) {
       if (o != null) o.close();
     }
+    _observers = [];
   }
 
   /// Bookkeeping observers for memory management.
@@ -800,7 +991,7 @@
   ///       bindProperty(#myProperty,
   ///           new PathObserver(this, 'myModel.path.to.otherProp'));
   ///     }
-  Bindable bindProperty(Symbol name, Bindable bindable, {oneTime: false}) {
+  Bindable bindProperty(Symbol name, bindableOrValue, {oneTime: false}) {
     // Dart note: normally we only reach this code when we know it's a
     // property, but if someone uses bindProperty directly they might get a
     // NoSuchMethodError either from the getField below, or from the setField
@@ -808,23 +999,20 @@
     // difference from Polymer.js behavior.
 
     if (_bindLog.isLoggable(Level.FINE)) {
-      _bindLog.fine('bindProperty: [$bindable] to [$_name].[$name]');
+      _bindLog.fine('bindProperty: [$bindableOrValue] to [$_name].[$name]');
     }
 
-    // capture A's value if B's value is null or undefined,
-    // otherwise use B's value
-    // TODO(sorvell): need to review, can do with ObserverTransform
-    var v = bindable.value;
-    if (v == null) {
-      bindable.value = smoke.read(this, name);
+    if (oneTime) {
+      if (bindableOrValue is Bindable) {
+        _bindLog.warning('bindProperty: expected non-bindable value '
+            'on a one-time binding to [$_name].[$name], '
+            'but found $bindableOrValue.');
+      }
+      smoke.write(this, name, bindableOrValue);
+      return null;
     }
 
-    // TODO(jmesserly): we need to fix this -- it doesn't work like Polymer.js
-    // bindings. https://code.google.com/p/dart/issues/detail?id=18343
-    // apply Polymer two-way reference binding
-    //return Observer.bindToInstance(inA, inProperty, observable,
-    //    resolveBindingValue);
-    return new _PolymerBinding(this, name, bindable);
+    return bindToAccessor(name, bindableOrValue, resolveBindingValue: true);
   }
 
   /// Attach event listeners on the host (this) element.
@@ -997,9 +1185,7 @@
         _STYLE_CONTROLLER_SCOPE);
     applyStyleToScope(style, scope);
     // cache that this style has been applied
-    Set styles = _scopeStyles[scope];
-    if (styles == null) _scopeStyles[scope] = styles = new Set();
-    styles.add('$_name$name');
+    styleCacheForScope(scope).add('$_name$name');
   }
 
   Node findStyleScope([node]) {
@@ -1012,9 +1198,23 @@
     return n;
   }
 
-  bool scopeHasNamedStyle(Node scope, String name) {
-    Set styles = _scopeStyles[scope];
-    return styles != null && styles.contains(name);
+  bool scopeHasNamedStyle(Node scope, String name) =>
+      styleCacheForScope(scope).contains(name);
+
+  Map _polyfillScopeStyleCache = {};
+
+  Set styleCacheForScope(Node scope) {
+    var styles;
+    if (_hasShadowDomPolyfill) {
+      var name = scope is ShadowRoot ? scope.host.localName
+          : (scope as Element).localName;
+      var styles = _polyfillScopeStyleCache[name];
+      if (styles == null) _polyfillScopeStyleCache[name] = styles = new Set();
+    } else {
+      styles = _scopeStyles[scope];
+      if (styles == null) _scopeStyles[scope] = styles = new Set();
+    }
+    return styles;
   }
 
   static final _scopeStyles = new Expando();
@@ -1079,12 +1279,14 @@
   }
 }
 
-// Dart note: Polymer addresses n-way bindings by metaprogramming: redefine
-// the property on the PolymerElement instance to always get its value from the
-// model@path. We can't replicate this in Dart so we do the next best thing:
-// listen to changes on both sides and update the values.
-// TODO(jmesserly): our approach leads to race conditions in the bindings.
-// See http://code.google.com/p/dart/issues/detail?id=13567
+// Dart note: this is related to _bindOldStylePublishedProperty. Polymer
+// addresses n-way bindings by metaprogramming: redefine the property on the
+// PolymerElement instance to always get its value from the model@path. This is
+// supported in Dart using a new style of @published property declaration using
+// the `readValue` and `writeValue` methods above. In the past we used to work
+// around this by listening to changes on both sides and updating the values.
+// This object provides the hooks to do this.
+// TODO(sigmund,jmesserly): delete after a deprecation period.
 class _PolymerBinding extends Bindable {
   final Polymer _target;
   final Symbol _property;
@@ -1100,6 +1302,8 @@
   void _updateNode(newValue) {
     _lastValue = newValue;
     smoke.write(_target, _property, newValue);
+    // Note: we don't invoke emitPropertyChangeRecord here because that's
+    // done by listening on changes on the PolymerElement.
   }
 
   void _propertyValueChanged(List<ChangeRecord> records) {
@@ -1127,6 +1331,24 @@
   }
 }
 
+// Ported from an inline object in instance/properties.js#bindToAccessor.
+class _CloseOnlyBinding extends Bindable {
+  final _PropertyAccessor accessor;
+
+  _CloseOnlyBinding(this.accessor);
+
+  open(callback) {}
+  get value => null;
+  set value(newValue) {}
+  deliver() {}
+
+  void close() {
+    if (accessor.bindable == null) return;
+    accessor.bindable.close();
+    accessor.bindable = null;
+  }
+}
+
 bool _toBoolean(value) => null != value && false != value;
 
 final Logger _observeLog = new Logger('polymer.observe');
diff --git a/pkg/polymer/lib/src/js/polymer/README.md b/pkg/polymer/lib/src/js/polymer/README.md
index 2d54458..236a88c 100644
--- a/pkg/polymer/lib/src/js/polymer/README.md
+++ b/pkg/polymer/lib/src/js/polymer/README.md
@@ -14,4 +14,4 @@
 
 ## Tools & Testing
 
-For running tests or building minified files, consult the [tooling information](http://polymer-project.org/tooling-strategy.html).
+For running tests or building minified files, consult the [tooling information](http://www.polymer-project.org/resources/tooling-strategy.html).
diff --git a/pkg/polymer/lib/src/js/polymer/bower.json b/pkg/polymer/lib/src/js/polymer/bower.json
index 816d40a..faff32b 100644
--- a/pkg/polymer/lib/src/js/polymer/bower.json
+++ b/pkg/polymer/lib/src/js/polymer/bower.json
@@ -1,20 +1,8 @@
 {
   "name": "polymer",
-  "description": "Polymer is a new type of library for the web, built on top of Web Components, and designed to leverage the evolving web platform on modern browsers.",
-  "homepage": "http://www.polymer-project.org/",
-  "keywords": [
-    "util",
-    "client",
-    "browser",
-    "web components",
-    "web-components"
-  ],
-  "author": "Polymer Authors <polymer-dev@googlegroups.com>",
-  "main": [
-    "polymer.js"
-  ],
+  "private": true,
   "dependencies": {
-    "platform": "Polymer/platform#0.2.0"
-  },
-  "version": "0.2.0"
+    "platform": "Polymer/platform#>=0.3.0 <1.0.0",
+    "core-component-page": "Polymer/core-component-page#>=0.3.0 <1.0.0"
+  }
 }
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/build.log b/pkg/polymer/lib/src/js/polymer/build.log
index e729eb1..ab39540 100644
--- a/pkg/polymer/lib/src/js/polymer/build.log
+++ b/pkg/polymer/lib/src/js/polymer/build.log
@@ -1,33 +1,37 @@
 BUILD LOG
 ---------
-Build Time: 2014-05-23T14:36:17
+Build Time: 2014-07-24T17:50:13
 
 NODEJS INFORMATION
 ==================
-nodejs: v0.10.24
+nodejs: v0.10.21
 chai: 1.9.1
-grunt: 0.4.5
 grunt-audit: 0.0.3
-grunt-concat-sourcemap: 0.4.1
+grunt: 0.4.5
+grunt-concat-sourcemap: 0.4.3
 grunt-contrib-concat: 0.4.0
 grunt-contrib-uglify: 0.4.0
-grunt-contrib-yuidoc: 0.5.2
 grunt-karma: 0.8.3
-karma: 0.12.16
+grunt-contrib-yuidoc: 0.5.2
+grunt-string-replace: 0.2.7
+karma: 0.12.17
 karma-crbot-reporter: 0.0.4
 karma-firefox-launcher: 0.1.3
 karma-ie-launcher: 0.1.5
-karma-mocha: 0.1.3
+karma-mocha: 0.1.6
 karma-safari-launcher: 0.1.1
 karma-script-launcher: 0.1.0
-mocha: 1.19.0
+mocha: 1.20.1
 
 REPO REVISIONS
 ==============
-polymer-expressions: b21c350b298b5dfc645350aaa0fd4d65c3cc061d
-polymer-gestures: b2949ff40fd6647e3a101cbad8e0ef716961365b
-polymer-dev: 5d175407c142f1eff6e1300242370975a940a282
+polymer-expressions: 20247f68f0bc401cbca852fb3cfbdf12ec95a135
+polymer-gestures: 1353a3aadee345e3e4cd35f9788d02595a27cb30
+polymer-dev:
+  (0.3.4) 6a3e1b0e2a0bbe546f6896b3f4f064950d7aee8f
+  (with patch for CSP issue) 370b65fa23d6bb283923b10a0b9078863f5e9676
 
 BUILD HASHES
 ============
-build/polymer.js: 7c30f9285eb23a3cce2c20339f510797585a723d
\ No newline at end of file
+build/polymer.js: ebbc1241930fb9a1bd7d216b0e3510dc1d5963da
+(without patch, it would be 3e0477c0b09f5800e359044f3358fd1edc6f8449)
diff --git a/pkg/polymer/lib/src/js/polymer/layout.html b/pkg/polymer/lib/src/js/polymer/layout.html
index 679738b..46dec0a 100644
--- a/pkg/polymer/lib/src/js/polymer/layout.html
+++ b/pkg/polymer/lib/src/js/polymer/layout.html
@@ -157,7 +157,7 @@
   align-items: flex-start;
 }
 
-html /deep/ [layout][center] {
+html /deep/ [layout][center], html /deep/ [layout][center-center] {
   -ms-flex-align: center;
   -webkit-align-items: center;
   align-items: center;
@@ -177,7 +177,7 @@
   justify-content: flex-start;
 }
 
-html /deep/ [layout][center-justified] {
+html /deep/ [layout][center-justified], html /deep/ [layout][center-center] {
   -ms-flex-pack: center;
   -webkit-justify-content: center;
   justify-content: center;
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
index b217d9d..816116f 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
@@ -3653,18 +3653,6 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-Polymer = {
-  version: '0.3.3-0e73963'
-};
-
-/*
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
 
 // TODO(sorvell): this ensures Polymer is an object and not a function
 // Platform is currently defining it as a function to allow for async loading
@@ -5033,7 +5021,7 @@
           STYLE_CONTROLLER_SCOPE);
       Polymer.applyStyleToScope(style, scope);
       // cache that this style has been applied
-      scope._scopeStyles[this.localName + name] = true;
+      this.styleCacheForScope(scope)[this.localName + name] = true;
     },
     findStyleScope: function(node) {
       // find the shadow root that contains this element
@@ -5044,10 +5032,20 @@
       return n;
     },
     scopeHasNamedStyle: function(scope, name) {
-      scope._scopeStyles = scope._scopeStyles || {};
-      return scope._scopeStyles[name];
+      var cache = this.styleCacheForScope(scope);
+      return cache[name];
+    },
+    styleCacheForScope: function(scope) {
+      if (window.ShadowDOMPolyfill) {
+        var scopeName = scope.host ? scope.host.localName : scope.localName;
+        return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});
+      } else {
+        return scope._scopeStyles = (scope._scopeStyles || {});
+      }
     }
   };
+
+  var polyfillScopeStyleCache = {};
   
   // NOTE: use raw prototype traversal so that we ensure correct traversal
   // on platforms where the protoype chain is simulated via __proto__ (IE10)
@@ -6171,21 +6169,26 @@
 
   */
   var queue = {
+
     // tell the queue to wait for an element to be ready
-    wait: function(element, check, go) {
-      var shouldAdd = (this.indexOf(element) === -1 && 
-          flushQueue.indexOf(element) === -1);
+    wait: function(element) {
+      if (!element.__queue) {
+        element.__queue = {};
+        elements.push(element);
+      }
+    },
+
+    // enqueue an element to the next spot in the queue.
+    enqueue: function(element, check, go) {
+      var shouldAdd = element.__queue && !element.__queue.check;
       if (shouldAdd) {
-        this.add(element);
-        element.__check = check;
-        element.__go = go;
+        queueForElement(element).push(element);
+        element.__queue.check = check;
+        element.__queue.go = go;
       }
       return (this.indexOf(element) !== 0);
     },
-    add: function(element) {
-      //console.log('queueing', element.name);
-      queueForElement(element).push(element);
-    },
+
     indexOf: function(element) {
       var i = queueForElement(element).indexOf(element);
       if (i >= 0 && document.contains(element)) {
@@ -6194,14 +6197,17 @@
       }
       return i;  
     },
+
     // tell the queue an element is ready to be registered
     go: function(element) {
       var readied = this.remove(element);
       if (readied) {
+        element.__queue.flushable = true;
         this.addToFlushQueue(readied);
         this.check();
       }
     },
+
     remove: function(element) {
       var i = this.indexOf(element);
       if (i !== 0) {
@@ -6210,37 +6216,59 @@
       }
       return queueForElement(element).shift();
     },
+
     check: function() {
       // next
       var element = this.nextElement();
       if (element) {
-        element.__check.call(element);
+        element.__queue.check.call(element);
       }
       if (this.canReady()) {
         this.ready();
         return true;
       }
     },
+
     nextElement: function() {
       return nextQueued();
     },
+
     canReady: function() {
       return !this.waitToReady && this.isEmpty();
     },
+
     isEmpty: function() {
-      return !importQueue.length && !mainQueue.length;
+      for (var i=0, l=elements.length, e; (i<l) && 
+          (e=elements[i]); i++) {
+        if (e.__queue && !e.__queue.flushable) {
+          return;
+        }
+      }
+      return true;
     },
+
     addToFlushQueue: function(element) {
       flushQueue.push(element);  
     },
+
     flush: function() {
+      // prevent re-entrance
+      if (this.flushing) {
+        return;
+      }
+      if (flushQueue.length) {
+        console.warn('flushing %s elements', flushQueue.length);
+      }
+      this.flushing = true;
       var element;
       while (flushQueue.length) {
         element = flushQueue.shift();
-        element.__go.call(element);
-        element.__check = element.__go = null;
+        element.__queue.go.call(element);
+        element.__queue = null;
       }
+      this.flushing = false;
     },
+
     ready: function() {
       this.flush();
       // TODO(sorvell): As an optimization, turn off CE polyfill upgrading
@@ -6256,11 +6284,13 @@
       Platform.flush();
       requestAnimationFrame(this.flushReadyCallbacks);
     },
+
     addReadyCallback: function(callback) {
       if (callback) {
         readyCallbacks.push(callback);
       }
     },
+
     flushReadyCallbacks: function() {
       if (readyCallbacks) {
         var fn;
@@ -6270,11 +6300,13 @@
         }
       }
     },
+
     waitToReady: true
+
   };
 
+  var elements = [];
   var flushQueue = [];
-
   var importQueue = [];
   var mainQueue = [];
   var readyCallbacks = [];
@@ -6304,8 +6336,9 @@
   }
 
   // exports
+  scope.elements = elements;
   scope.queue = queue;
-  scope.whenPolymerReady = whenPolymerReady;
+  scope.whenReady = scope.whenPolymerReady = whenPolymerReady;
 })(Polymer);
 
 /*
@@ -6385,12 +6418,17 @@
       // fetch declared values
       this.name = this.getAttribute('name');
       this.extends = this.getAttribute('extends');
+      queue.wait(this);
       // initiate any async resource fetches
       this.loadResources();
       // register when all constraints are met
       this.registerWhenReady();
     },
 
+    // TODO(sorvell): we currently queue in the order the prototypes are 
+    // registered, but we should queue in the order that polymer-elements
+    // are registered. We are currently blocked from doing this based on 
+    // crbug.com/395686.
     registerWhenReady: function() {
      if (this.registered
        || this.waitingForPrototype(this.name)
@@ -6398,16 +6436,11 @@
        || this.waitingForResources()) {
           return;
       }
-      // TODO(sorvell): ends up calling '_register' by virtue
-      // of `waitingForQueue` (see below)
       queue.go(this);
     },
 
-    // TODO(sorvell): refactor, this method is private-ish, but it's being
-    // called by the queue object.
     _register: function() {
       //console.log('registering', this.name);
-      //console.group('registering', this.name);
       // warn if extending from a custom element not registered via Polymer
       if (isCustomTag(this.extends) && !isRegistered(this.extends)) {
         console.warn('%s is attempting to extend %s, an unregistered element ' +
@@ -6416,7 +6449,6 @@
       }
       this.register(this.name, this.extends);
       this.registered = true;
-      //console.groupEnd();
     },
 
     waitingForPrototype: function(name) {
@@ -6434,19 +6466,8 @@
       // if explicitly marked as 'noscript'
       if (this.hasAttribute('noscript') && !this.noscript) {
         this.noscript = true;
-        // TODO(sorvell): CustomElements polyfill awareness:
-        // noscript elements should upgrade in logical order
-        // script injection ensures this under native custom elements;
-        // under imports + ce polyfills, scripts run before upgrades.
-        // dependencies should be ready at upgrade time so register
-        // prototype at this time.
-        if (window.CustomElements && !CustomElements.useNative) {
-          Polymer(name);
-        } else {
-          var script = document.createElement('script');
-          script.textContent = 'Polymer(\'' + name + '\');';
-          this.appendChild(script);
-        }
+        // imperative element registration
+        Polymer(name);
       }
     },
 
@@ -6458,7 +6479,7 @@
     // dependency resolution. Previously this was enforced for inheritance,
     // and by rule for composition. It's now entirely by rule.
     waitingForQueue: function() {
-      return queue.wait(this, this.registerWhenReady, this._register);
+      return queue.enqueue(this, this.registerWhenReady, this._register);
     },
 
     loadResources: function() {
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map b/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
index 886d173..f524e1f 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
@@ -19,7 +19,6 @@
     "../polymer-gestures/src/tap.js",
     "../polymer-expressions/third_party/esprima/esprima.js",
     "../polymer-expressions/src/polymer-expressions.js",
-    "build/polymer-versioned.js",
     "src/boot.js",
     "src/lib/lang.js",
     "src/lib/job.js",
@@ -48,7 +47,7 @@
     "src/lib/auto-binding.js"
   ],
   "names": [],
-  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjhCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5lBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
+  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjhCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5lBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
   "sourcesContent": [
     "/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {\n  hasSDPolyfill: Boolean(window.ShadowDOMPolyfill)\n};\nPolymerGestures.wrap = PolymerGestures.hasSDPolyfill ? ShadowDOMPolyfill.wrapIfNeeded : function(a){ return a; };\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (!scope.hasSDPolyfill && pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findScrollAxis: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n        }\n      } else {\n        n = scope.wrap(inEvent.currentTarget);\n        while(n) {\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n",
@@ -67,7 +66,6 @@
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey,\n            _source: 'tap'\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n",
     "/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, args, property;\n\n        expr = parsePrimaryExpression();\n\n        while (true) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else if (match('.')) {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            } else if (match('(')) {\n                args = parseArguments();\n                expr = delegate.createCallExpression(expr, args);\n            } else {\n                break;\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n",
     "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.computed = accessor == '[';\n\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (this.computed && !(property instanceof Literal));\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        (property instanceof IdentPath || property instanceof Literal) &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = !this.computed || this.simplePath ?\n        property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n\n        var parts = this.object instanceof MemberExpression ?\n            this.object.fullPath.slice() : [this.object.name];\n        parts.push(this.property instanceof IdentPath ?\n            this.property.name : this.property.value);\n        this.fullPath_ = Path.get(parts);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (!this.computed) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n            var propName = property(model, observer, filterRegistry);\n            if (observer)\n              observer.addPath(context, [propName]);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(model, observer, filterRegistry, toModelDirection,\n                        initialArgs) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find function or filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('Cannot find function or filter: ' + this.name);\n        return;\n      }\n\n      var args = initialArgs || [];\n      for (var i = 0; i < this.args.length; i++) {\n        args.push(getFn(this.args[i])(model, observer, filterRegistry));\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer, filterRegistry) {\n        return unaryOperators[op](argument(model, observer, filterRegistry));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      return function(model, observer, filterRegistry) {\n        return binaryOperators[op](left(model, observer, filterRegistry),\n                                   right(model, observer, filterRegistry));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      return function(model, observer, filterRegistry) {\n        return test(model, observer, filterRegistry) ?\n            consequent(model, observer, filterRegistry) :\n            alternate(model, observer, filterRegistry);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createCallExpression: function(expression, args) {\n      if (!(expression instanceof IdentPath))\n        throw Error('Only identifier function invocations are allowed');\n\n      var filter = new Filter(expression.name, args);\n\n      return function(model, observer, filterRegistry) {\n        return filter.transform(model, observer, filterRegistry, false);\n      };\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer, filterRegistry) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer, filterRegistry));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer, filterRegistry) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] =\n              properties[i].value(model, observer, filterRegistry);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer, filterRegistry);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(model, observer, filterRegistry,\n            false, [value]);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(model, undefined,\n            filterRegistry, true, [newValue]);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        return createScopeObject(parentScope, model, scopeName, indexName);\n      };\n    }\n  };\n\n  var createScopeObject = ('__proto__' in {}) ?\n    function(parentScope, model, scopeName, indexName) {\n      var scope = {};\n      scope[scopeName] = model;\n      scope[indexName] = undefined;\n      scope[parentScopeName] = parentScope;\n      scope.__proto__ = parentScope;\n      return scope;\n    } :\n    function(parentScope, model, scopeName, indexName) {\n      var scope = Object.create(parentScope);\n      Object.defineProperty(scope, scopeName,\n          { value: model, configurable: true, writable: true });\n      Object.defineProperty(scope, indexName,\n          { value: undefined, configurable: true, writable: true });\n      Object.defineProperty(scope, parentScopeName,\n          { value: parentScope, configurable: true, writable: true });\n      return scope;\n    };\n\n  global.PolymerExpressions = PolymerExpressions;\n  PolymerExpressions.getExpression = getExpression;\n})(this);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.3.3-0e73963'\n};\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n  \n  // exports\n\n  scope.extend = extend;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n",
@@ -81,7 +79,7 @@
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  var numberIsNaN = Number.isNaN || function(value) {\n    return typeof value === 'number' && isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObserver(o);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without\n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n\n      var self = this;\n      var value = observable.open(function(value, oldValue) {\n        self[privateName] = value;\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      });\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      this[privateName] = value;\n      this.emitPropertyChangeRecord(name, value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      var observers = dom.bindings_;\n      for (var i = 0; i < observers.length; i++) {\n        this.registerObserver(observers[i]);\n      }\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this._recordBinding(property, observer);\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected\n      // https://github.com/Polymer/ShadowDOM/issues/420\n      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      // TODO (sorvell): temporarily open observer when created\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n      // TODO (sorvell): temporarily open observer when created\n      // turn on property observation and take any initial changes\n      //this.openPropertyObserver();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants,\n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants\n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);\n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n      // set up polymer gestures\n      PolymerGestures.register(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n\n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  \n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (window.ShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      scope._scopeStyles[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      scope._scopeStyles = scope._scopeStyles || {};\n      return scope._scopeStyles[name];\n    }\n  };\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  \n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (window.ShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      this.styleCacheForScope(scope)[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      var cache = this.styleCacheForScope(scope);\n      return cache[name];\n    },\n    styleCacheForScope: function(scope) {\n      if (window.ShadowDOMPolyfill) {\n        var scopeName = scope.host ? scope.host.localName : scope.localName;\n        return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});\n      } else {\n        return scope._scopeStyles = (scope._scopeStyles || {});\n      }\n    }\n  };\n\n  var polyfillScopeStyleCache = {};\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'string') {\n      prototype = name;\n      var script = document._currentScript;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  var declarations = Platform.deliverDeclarations();\n  if (declarations) {\n    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n      element.apply(null, d);\n    }\n  }\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Platform.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return Platform.styleResolver.loadStyles(styles, templateUrl, callback);\n        }\n      }\n      if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (window.ShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n",
@@ -90,9 +88,9 @@
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\n        var publish = prototype.publish || (prototype.publish = {});\n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // if the user hasn't specified a value, we want to use the\n          // default, unless a superclass has already chosen one\n          if (n && publish[n] === undefined) {\n            // TODO(sjmiles): querying native properties on IE11 (and possibly\n            // on other browsers) throws an exception because there is no actual\n            // instance.\n            // In fact, trying to publish native properties is known bad for this\n            // and other reasons, and we need to solve this problem writ large.\n            try {\n              var hasValue = (base[n] !== undefined);\n            } catch(x) {\n              hasValue = false;\n            }\n            // supply an empty 'descriptor' object and let the publishProperties\n            // code determine a default\n            if (!hasValue) {\n              publish[n] = Polymer.nob;\n            }\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && Platform.templateContent(template);\n    },\n    installBindingDelegate: function(template) {\n      if (template) {\n        template.bindingDelegate = this.syntax;\n      }\n    }\n  };\n\n  // exports\n  scope.api.declaration.mdv = mdv;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (window.ShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n    // tell the queue to wait for an element to be ready\n    wait: function(element, check, go) {\n      var shouldAdd = (this.indexOf(element) === -1 && \n          flushQueue.indexOf(element) === -1);\n      if (shouldAdd) {\n        this.add(element);\n        element.__check = check;\n        element.__go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n    add: function(element) {\n      //console.log('queueing', element.name);\n      queueForElement(element).push(element);\n    },\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n    nextElement: function() {\n      return nextQueued();\n    },\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n    isEmpty: function() {\n      return !importQueue.length && !mainQueue.length;\n    },\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n    flush: function() {\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__go.call(element);\n        element.__check = element.__go = null;\n      }\n    },\n    ready: function() {\n      this.flush();\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n    waitToReady: true\n  };\n\n  var flushQueue = [];\n\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.queue = queue;\n  scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n\n    // tell the queue to wait for an element to be ready\n    wait: function(element) {\n      if (!element.__queue) {\n        element.__queue = {};\n        elements.push(element);\n      }\n    },\n\n    // enqueue an element to the next spot in the queue.\n    enqueue: function(element, check, go) {\n      var shouldAdd = element.__queue && !element.__queue.check;\n      if (shouldAdd) {\n        queueForElement(element).push(element);\n        element.__queue.check = check;\n        element.__queue.go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        element.__queue.flushable = true;\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__queue.check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n\n    nextElement: function() {\n      return nextQueued();\n    },\n\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n\n    isEmpty: function() {\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          return;\n        }\n      }\n      return true;\n    },\n\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n\n    flush: function() {\n      // prevent re-entrance\n      if (this.flushing) {\n        return;\n      }\n      if (flushQueue.length) {\n        console.warn('flushing %s elements', flushQueue.length);\n      }\n      this.flushing = true;\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__queue.go.call(element);\n        element.__queue = null;\n      }\n      this.flushing = false;\n    },\n\n    ready: function() {\n      this.flush();\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n\n    waitToReady: true\n\n  };\n\n  var elements = [];\n  var flushQueue = [];\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.elements = elements;\n  scope.queue = queue;\n  scope.whenReady = scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenPolymerReady = scope.whenPolymerReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      // TODO(sorvell): ends up calling '_register' by virtue\n      // of `waitingForQueue` (see below)\n      queue.go(this);\n    },\n\n    // TODO(sorvell): refactor, this method is private-ish, but it's being\n    // called by the queue object.\n    _register: function() {\n      //console.log('registering', this.name);\n      //console.group('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n      //console.groupEnd();\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // TODO(sorvell): CustomElements polyfill awareness:\n        // noscript elements should upgrade in logical order\n        // script injection ensures this under native custom elements;\n        // under imports + ce polyfills, scripts run before upgrades.\n        // dependencies should be ready at upgrade time so register\n        // prototype at this time.\n        if (window.CustomElements && !CustomElements.useNative) {\n          Polymer(name);\n        } else {\n          var script = document.createElement('script');\n          script.textContent = 'Polymer(\\'' + name + '\\');';\n          this.appendChild(script);\n        }\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.wait(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  whenPolymerReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenPolymerReady = scope.whenPolymerReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      queue.wait(this);\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    // TODO(sorvell): we currently queue in the order the prototypes are \n    // registered, but we should queue in the order that polymer-elements\n    // are registered. We are currently blocked from doing this based on \n    // crbug.com/395686.\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      queue.go(this);\n    },\n\n    _register: function() {\n      //console.log('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // imperative element registration\n        Polymer(name);\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.enqueue(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  whenPolymerReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * The `auto-binding` element extends the template element. It provides a quick \n * and easy way to do data binding without the need to setup a model. \n * The `auto-binding` element itself serves as the model and controller for the \n * elements it contains. Both data and event handlers can be bound. \n *\n * The `auto-binding` element acts just like a template that is bound to \n * a model. It stamps its content in the dom adjacent to itself. When the \n * content is stamped, the `template-bound` event is fired.\n *\n * Example:\n *\n *     <template is=\"auto-binding\">\n *       <div>Say something: <input value=\"{{value}}\"></div>\n *       <div>You said: {{value}}</div>\n *       <button on-tap=\"{{buttonTap}}\">Tap me!</button>\n *     </template>\n *     <script>\n *       var template = document.querySelector('template');\n *       template.value = 'something';\n *       template.buttonTap = function() {\n *         console.log('tap!');\n *       };\n *     </script>\n *\n * @module Polymer\n * @status stable\n*/\n\n(function() {\n\n  var element = document.createElement('polymer-element');\n  element.setAttribute('name', 'auto-binding');\n  element.setAttribute('extends', 'template');\n  element.init();\n\n  Polymer('auto-binding', {\n\n    createdCallback: function() {\n      this.syntax = this.bindingDelegate = this.makeSyntax();\n      // delay stamping until polymer-ready so that auto-binding is not\n      // required to load last.\n      Polymer.whenPolymerReady(function() {\n        this.model = this;\n        this.setAttribute('bind', '');\n        // we don't bother with an explicit signal here, we could ust a MO\n        // if necessary\n        this.async(function() {\n          // note: this will marshall *all* the elements in the parentNode\n          // rather than just stamped ones. We'd need to use createInstance\n          // to fix this or something else fancier.\n          this.marshalNodeReferences(this.parentNode);\n          // template stamping is asynchronous so stamping isn't complete\n          // by polymer-ready; fire an event so users can use stamped elements\n          this.fire('template-bound');\n        });\n      }.bind(this));\n    },\n\n    makeSyntax: function() {\n      var events = Object.create(Polymer.api.declaration.events);\n      var self = this;\n      events.findController = function() { return self.model; };\n\n      var syntax = new PolymerExpressions();\n      var prepareBinding = syntax.prepareBinding;  \n      syntax.prepareBinding = function(pathString, name, node) {\n        return events.prepareEventBinding(pathString, name, node) ||\n               prepareBinding.call(syntax, pathString, name, node);\n      };\n      return syntax;\n    }\n\n  });\n\n})();\n"
   ]
 }
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.js b/pkg/polymer/lib/src/js/polymer/polymer.js
index 4882e7f..759356b 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.js
@@ -7,8 +7,8 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version: 0.3.3-0e73963
+// @version: 0.3.4-370b65f
 window.PolymerGestures={hasSDPolyfill:Boolean(window.ShadowDOMPolyfill)},PolymerGestures.wrap=PolymerGestures.hasSDPolyfill?ShadowDOMPolyfill.wrapIfNeeded:function(a){return a},function(a){var b=!1,c=document.createElement("meta");if(!a.hasSDPolyfill&&c.createShadowRoot){var d=c.createShadowRoot(),e=document.createElement("span");d.appendChild(e),c.addEventListener("testpath",function(a){a.path&&(b=a.path[0]===e),a.stopPropagation()});var f=new CustomEvent("testpath",{bubbles:!0});document.head.appendChild(c),e.dispatchEvent(f),c.parentNode.removeChild(c),d=e=null}c=null;var g={shadow:function(a){return a?a.shadowRoot||a.webkitShadowRoot:void 0},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);return this.canTarget(b)?b:void 0},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){var d,e;return a?(d=a.elementFromPoint(b,c),d?e=this.targetingShadow(d):a!==document&&(e=this.olderShadow(a)),this.searchRoot(e,b,c)||d):void 0},owner:function(a){if(!a)return document;for(var b=a;b.parentNode;)b=b.parentNode;return b.nodeType!=Node.DOCUMENT_NODE&&b.nodeType!=Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){if(b&&a.path)return a.path[0];var c=a.clientX,d=a.clientY,e=this.owner(a.target);return e.elementFromPoint(c,d)||(e=document),this.searchRoot(e,c,d)},findScrollAxis:function(c){var d;if(b&&c.path){for(var e=c.path,f=0;f<e.length;f++)if(d=e[f],d._scrollType)return d._scrollType}else for(d=a.wrap(c.currentTarget);d;){if(d._scrollType)return d._scrollType;d=d.parentNode||d.host}},LCA:function(a,b){if(a===b)return a;if(a&&!b)return a;if(b&&!a)return b;if(!b&&!a)return document;if(a.contains&&a.contains(b))return a;if(b.contains&&b.contains(a))return b;var c=this.depth(a),d=this.depth(b),e=c-d;for(e>=0?a=this.walk(a,e):b=this.walk(b,-e);a&&b&&a!==b;)a=a.parentNode||a.host,b=b.parentNode||b.host;return a},walk:function(a,b){for(var c=0;a&&b>c;c++)a=a.parentNode||a.host;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode||a.host;return b},deepContains:function(a,b){var c=this.LCA(a,b);return c===a},insideNode:function(a,b,c){var d=a.getBoundingClientRect();return d.left<=b&&b<=d.right&&d.top<=c&&c<=d.bottom}};a.targetFinding=g,a.findTarget=g.findTarget.bind(g),a.deepContains=g.deepContains.bind(g),a.insideNode=g.insideNode}(window.PolymerGestures),function(){function a(a){return"body /deep/ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+";}"}var d=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]},"manipulation"],e="",f=(document.head,"string"==typeof document.head.style.touchAction),g=!window.ShadowDOMPolyfill&&document.head.createShadowRoot;if(f){d.forEach(function(d){String(d)===d?(e+=b(d)+c(d)+"\n",g&&(e+=a(d)+c(d)+"\n")):(e+=d.selectors.map(b)+c(d.rule)+"\n",g&&(e+=d.selectors.map(a)+c(d.rule)+"\n"))});var h=document.createElement("style");h.textContent=e,document.head.appendChild(h)}}(),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],d=function(){return function(){}},e={preventTap:d,makeBaseEvent:function(a,b){var c=document.createEvent("Event");return c.initEvent(a,b.bubbles||!1,b.cancelable||!1),c.preventTap=e.preventTap(c),c},makeGestureEvent:function(a,b){b=b||Object.create(null);for(var c,d=this.makeBaseEvent(a,b),e=0,f=Object.keys(b);e<f.length;e++)c=f[e],d[c]=b[c];return d},makePointerEvent:function(a,d){d=d||Object.create(null);for(var e,f=this.makeBaseEvent(a,d),g=0;g<b.length;g++)e=b[g],f[e]=d[e]||c[g];f.buttons=d.buttons||0;var h=0;return h=d.pressure?d.pressure:f.buttons?.5:0,f.x=f.clientX,f.y=f.clientY,f.pointerId=d.pointerId||0,f.width=d.width||0,f.height=d.height||0,f.pressure=h,f.tiltX=d.tiltX||0,f.tiltY=d.tiltY||0,f.pointerType=d.pointerType||"",f.hwTimestamp=d.hwTimestamp||0,f.isPrimary=d.isPrimary||!1,f._source=d._source||"",f}};a.eventFactory=e}(window.PolymerGestures),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PolymerGestures),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp","preventTap","tapPrevented","_source"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0,function(){},!1],d="undefined"!=typeof SVGElementInstance,e=a.eventFactory,f=a.hasSDPolyfill,g=a.wrap,h={pointermap:new a.PointerMap,eventMap:Object.create(null),eventSources:Object.create(null),eventSourceList:[],gestures:[],gestureQueue:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},registerGesture:function(a,b){this.gestures.push(b)},register:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.unregister.call(b,a)},down:function(a){this.fireEvent("down",a)},move:function(a){a.type="move",this.fillGestureQueue(a)},up:function(a){this.fireEvent("up",a)},cancel:function(a){a.tapPrevented=!0,this.fireEvent("up",a)},eventHandler:function(a){if(!a._handledByPG){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPG=!0}},listen:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.addEvent(a,c)},unlisten:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.removeEvent(a,c)},addEvent:function(a,b){f?a.addEventListener_(b,this.boundHandler):a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){f?a.removeEventListener_(b,this.boundHandler):a.removeEventListener(b,this.boundHandler)},makeEvent:function(a,b){var c=e.makePointerEvent(a,b);return c.preventDefault=b.preventDefault,c.tapPrevented=b.tapPrevented,c._target=c._target||b.target,c},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var e,f=Object.create(null),h=0;h<b.length;h++)e=b[h],f[e]=a[e]||c[h],("target"===e||"relatedTarget"===e)&&(d&&f[e]instanceof SVGElementInstance&&(f[e]=f[e].correspondingUseElement),f[e]=g(f[e]));return f.preventDefault=a.preventDefault,f},dispatchEvent:function(a){var b=a._target;if(b){b.dispatchEvent(a);var c=this.cloneEvent(a);c.target=b,this.fillGestureQueue(c)}},gestureTrigger:function(){for(var a,b=0;b<this.gestureQueue.length;b++){a=this.gestureQueue[b];for(var c,d,e=0;e<this.gestures.length;e++)c=this.gestures[e],d=c[a.type],d&&d.call(c,a)}this.gestureQueue.length=0},fillGestureQueue:function(a){this.gestureQueue.length||requestAnimationFrame(this.boundGestureTrigger),this.gestureQueue.push(a)}};h.boundHandler=h.eventHandler.bind(h),h.boundGestureTrigger=h.gestureTrigger.bind(h),a.dispatcher=h,a.register=function(a){h.register(a)},a.unregister=h.unregister.bind(h),a.wrap=g}(window.PolymerGestures),function(a){function b(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),g&&(this.observer=new g(this.mutationWatcher.bind(this)))}var c=Array.prototype.forEach.call.bind(Array.prototype.forEach),d=Array.prototype.map.call.bind(Array.prototype.map),e=Array.prototype.slice.call.bind(Array.prototype.slice),f=Array.prototype.filter.call.bind(Array.prototype.filter),g=window.MutationObserver||window.WebKitMutationObserver,h="[touch-action]",i={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};b.prototype={watchSubtree:function(b){a.targetFinding.canTarget(b)&&this.observer.observe(b,i)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){c(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(h):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(e(b))},installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){var b=d(a,this.findElements,this);return b.push(f(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}},g||(b.prototype.watchSubtree=function(){console.warn("PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected")}),a.Installer=b}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=25,e=[0,1,4,2],f=!1;try{f=1===new MouseEvent("test",{buttons:1}).buttons}catch(g){}var h={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup"],register:function(a){a===document&&b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a);return c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,c._source="mouse",f||(c.buttons=e[c.which]||0),c},mousedown:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=c.has(this.POINTER_ID);e&&this.mouseup(d);var f=this.prepareEvent(d);f.target=a.wrap(a.findTarget(d)),c.set(this.POINTER_ID,f.target),b.down(f)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=this.prepareEvent(a);d.target=c.get(this.POINTER_ID),b.move(d)}},mouseup:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(a.findTarget(d)),e.target=c.get(this.POINTER_ID),b.up(e),this.cleanupMouse()}},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=h}(window.PolymerGestures),function(a){var b,c=a.dispatcher,d=a.targetFinding.allShadows.bind(a.targetFinding),e=c.pointermap,f=(Array.prototype.map.call.bind(Array.prototype.map),2500),g=200,h=20,i="touch-action",j=!1,k={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){j?c.listen(a,this.events):b.enableOnSubtree(a)},unregister:function(a){j&&c.unlisten(a,this.events)},elementAdded:function(a){var b=a.getAttribute(i),e=this.touchActionToScrollType(b);e&&(a._scrollType=e,c.listen(a,this.events),d(a).forEach(function(a){a._scrollType=e,c.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,c.unlisten(a,this.events),d(a).forEach(function(a){a._scrollType=void 0,c.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(i),e=this.touchActionToScrollType(c),f=this.touchActionToScrollType(b);e&&f?(a._scrollType=e,d(a).forEach(function(a){a._scrollType=e},this)):f?this.elementRemoved(a):e&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto|manipulation$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===e.pointers()||1===e.pointers()&&e.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=null,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,g)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},findTarget:function(b,c){if("touchstart"===this.currentTouchEvent.type){if(this.isPrimaryTouch(b)){var d={clientX:b.clientX,clientY:b.clientY,path:this.currentTouchEvent.path,target:a.wrap(this.currentTouchEvent.target)};return a.findTarget(d)}return a.findTarget(b)}return e.get(c)},touchToPointer:function(b){var d=this.currentTouchEvent,e=c.cloneEvent(b),f=e.pointerId=b.identifier+2;e.target=a.wrap(this.findTarget(b,f)),e.bubbles=!0,e.cancelable=!0,e.detail=this.clickCount,e.buttons=this.typeToButtons(d.type),e.width=b.webkitRadiusX||b.radiusX||0,e.height=b.webkitRadiusY||b.radiusY||0,e.pressure=b.webkitForce||b.force||.5,e.isPrimary=this.isPrimaryTouch(b),e.pointerType=this.POINTER_TYPE,e._source="touch";var g=this;return e.preventDefault=function(){g.scrolling=!1,g.firstXY=null,d.preventDefault()},e},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,f,g=0;g<c.length;g++)d=c[g],f=this.touchToPointer(d),"touchstart"===a.type&&e.set(f.pointerId,f.target),e.has(f.pointerId)&&b.call(this,f),("touchend"===a.type||a._cancel)&&this.cleanUpPointer(f)},shouldScroll:function(b){if(this.firstXY){var c,d=a.targetFinding.findScrollAxis(b);if("none"===d)c=!1;else if("XY"===d)c=!0;else{var e=b.changedTouches[0],f=d,g="Y"===d?"X":"Y",h=Math.abs(e["client"+f]-this.firstXY[f]),i=Math.abs(e["client"+g]-this.firstXY[g]);c=h>=i}return c}},findTouch:function(a,b){for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)if(c.identifier===b)return!0},vacuumTouches:function(a){var b=a.touches;if(e.pointers()>=b.length){var c=[];e.forEach(function(a,d){if(1!==d&&!this.findTouch(b,d-2)){var e=a;c.push(e)}},this),c.forEach(function(a){this.cancel(a),e.delete(a.pointerId)})}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.down))},down:function(a){c.down(a)},touchmove:function(a){if(j)this.processTouches(a,this.move);else if(this.scrolling){if(this.firstXY){var b=a.changedTouches[0],c=b.clientX-this.firstXY.X,d=b.clientY-this.firstXY.Y,e=Math.sqrt(c*c+d*d);e>=h&&(this.touchcancel(a),this.scrolling=!0,this.firstXY=null)}}else null===this.scrolling&&this.shouldScroll(a)?this.scrolling=!0:(this.scrolling=!1,a.preventDefault(),this.processTouches(a,this.move))},move:function(a){c.move(a)},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.up)},up:function(b){b.relatedTarget=a.wrap(a.findTarget(b)),c.up(b)},cancel:function(a){c.cancel(a)},touchcancel:function(a){a._cancel=!0,this.processTouches(a,this.cancel)},cleanUpPointer:function(a){e["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,d=b.changedTouches[0];if(this.isPrimaryTouch(d)){var e={x:d.clientX,y:d.clientY};c.push(e);var g=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,e);setTimeout(g,f)}}};j||(b=new a.Installer(k.elementAdded,k.elementRemoved,k.elementChanged,k)),a.touchEvents=k}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel"],register:function(a){a===document&&b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var c=a;return c=b.cloneEvent(a),d&&(c.pointerType=this.POINTER_TYPES[a.pointerType]),c._source="ms",c},cleanup:function(a){c["delete"](a)},MSPointerDown:function(d){var e=this.prepareEvent(d);e.target=a.wrap(a.findTarget(d)),c.set(d.pointerId,e.target),b.down(e)},MSPointerMove:function(a){var d=this.prepareEvent(a);d.target=c.get(d.pointerId),b.move(d)},MSPointerUp:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(a.findTarget(d)),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},MSPointerCancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(a.findTarget(d)),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.msEvents=e}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],prepareEvent:function(a){var c=b.cloneEvent(a);return c._source="pointer",c},register:function(a){a===document&&b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},cleanup:function(a){c["delete"](a)},pointerdown:function(d){var e=this.prepareEvent(d);e.target=a.wrap(a.findTarget(d)),c.set(e.pointerId,e.target),b.down(e)},pointermove:function(a){var d=this.prepareEvent(a);d.target=c.get(d.pointerId),b.move(d)},pointerup:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(a.findTarget(d)),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},pointercancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(a.findTarget(d)),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.pointerEvents=d}(window.PolymerGestures),function(a){var b=a.dispatcher;window.PointerEvent?b.registerSource("pointer",a.pointerEvents):window.navigator.msPointerEnabled?b.registerSource("ms",a.msEvents):(b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart&&b.registerSource("touch",a.touchEvents)),b.register(document)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","move","up"],WIGGLE_THRESHOLD:4,clampDir:function(a){return a>0?1:-1},calcPositionDelta:function(a,b){var c=0,d=0;return a&&b&&(c=b.pageX-a.pageX,d=b.pageY-a.pageY),{x:c,y:d}},fireTrack:function(a,b,d){var e=d,f=this.calcPositionDelta(e.downEvent,b),g=this.calcPositionDelta(e.lastMoveEvent,b);g.x&&(e.xDirection=this.clampDir(g.x)),g.y&&(e.yDirection=this.clampDir(g.y));var h=c.makeGestureEvent(a,{bubbles:!0,cancelable:!0,dx:f.x,dy:f.y,ddx:g.x,ddy:g.y,x:b.x,y:b.y,clientX:b.clientX,clientY:b.clientY,pageX:b.pageX,pageY:b.pageY,screenX:b.screenX,screenY:b.screenY,xDirection:e.xDirection,yDirection:e.yDirection,trackInfo:e.trackInfo,relatedTarget:b.relatedTarget,pointerType:b.pointerType,pointerId:b.pointerId,_source:"track"});e.downTarget.dispatchEvent(h)},down:function(a){if(a.isPrimary&&("mouse"===a.pointerType?1===a.buttons:!0)){var b={downEvent:a,downTarget:a.target,trackInfo:{},lastMoveEvent:null,xDirection:0,yDirection:0,tracking:!1};d.set(a.pointerId,b)}},move:function(a){var b=d.get(a.pointerId);if(b){if(b.tracking)this.fireTrack("track",a,b);else{var c=this.calcPositionDelta(b.downEvent,a),e=c.x*c.x+c.y*c.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,this.fireTrack("trackstart",b.downEvent,b),this.fireTrack("track",a,b))}b.lastMoveEvent=a}},up:function(a){var b=d.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),d.delete(a.pointerId))}};b.registerGesture("track",e)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d={HOLD_DELAY:200,WIGGLE_THRESHOLD:16,events:["down","move","up"],heldPointer:null,holdJob:null,pulse:function(){var a=Date.now()-this.heldPointer.timeStamp,b=this.held?"holdpulse":"hold";this.fireHold(b,a),this.held=!0},cancel:function(){clearInterval(this.holdJob),this.held&&this.fireHold("release"),this.held=!1,this.heldPointer=null,this.target=null,this.holdJob=null},down:function(a){a.isPrimary&&!this.heldPointer&&(this.heldPointer=a,this.target=a.target,this.holdJob=setInterval(this.pulse.bind(this),this.HOLD_DELAY))},up:function(a){this.heldPointer&&this.heldPointer.pointerId===a.pointerId&&this.cancel()},move:function(a){if(this.heldPointer&&this.heldPointer.pointerId===a.pointerId){var b=a.clientX-this.heldPointer.clientX,c=a.clientY-this.heldPointer.clientY;b*b+c*c>this.WIGGLE_THRESHOLD&&this.cancel()}},fireHold:function(a,b){var d={bubbles:!0,cancelable:!0,pointerType:this.heldPointer.pointerType,pointerId:this.heldPointer.pointerId,x:this.heldPointer.clientX,y:this.heldPointer.clientY,_source:"hold"};b&&(d.holdTime=b);var e=c.makeGestureEvent(a,d);this.target.dispatchEvent(e)}};b.registerGesture("hold",d)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","up"],down:function(a){a.isPrimary&&!a.tapPrevented&&d.set(a.pointerId,{target:a.target,buttons:a.buttons,x:a.clientX,y:a.clientY})},shouldTap:function(a,b){return"mouse"===a.pointerType?1===b.buttons:!a.tapPrevented},up:function(b){var e=d.get(b.pointerId);if(e&&this.shouldTap(b,e)){var f=a.targetFinding.LCA(e.target,b.relatedTarget);if(f){var g=c.makeGestureEvent("tap",{bubbles:!0,cancelable:!0,x:b.clientX,y:b.clientY,detail:b.detail,pointerType:b.pointerType,pointerId:b.pointerId,altKey:b.altKey,ctrlKey:b.ctrlKey,metaKey:b.metaKey,shiftKey:b.shiftKey,_source:"tap"});f.dispatchEvent(g)}}d.delete(b.pointerId)}};c.preventTap=function(a){return function(){a.tapPrevented=!0,d.delete(a.pointerId)}},b.registerGesture("tap",e)}(window.PolymerGestures),function(a){"use strict";function b(a,b){if(!a)throw new Error("ASSERT: "+b)}function c(a){return a>=48&&57>=a}function d(a){return 32===a||9===a||11===a||12===a||160===a||a>=5760&&"\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\ufeff".indexOf(String.fromCharCode(a))>0}function e(a){return 10===a||13===a||8232===a||8233===a}function f(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a}function g(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a||a>=48&&57>=a}function h(a){return"this"===a}function i(){for(;Y>X&&d(W.charCodeAt(X));)++X}function j(){var a,b;for(a=X++;Y>X&&(b=W.charCodeAt(X),g(b));)++X;return W.slice(a,X)}function k(){var a,b,c;return a=X,b=j(),c=1===b.length?S.Identifier:h(b)?S.Keyword:"null"===b?S.NullLiteral:"true"===b||"false"===b?S.BooleanLiteral:S.Identifier,{type:c,value:b,range:[a,X]}}function l(){var a,b,c=X,d=W.charCodeAt(X),e=W[X];switch(d){case 46:case 40:case 41:case 59:case 44:case 123:case 125:case 91:case 93:case 58:case 63:return++X,{type:S.Punctuator,value:String.fromCharCode(d),range:[c,X]};default:if(a=W.charCodeAt(X+1),61===a)switch(d){case 37:case 38:case 42:case 43:case 45:case 47:case 60:case 62:case 124:return X+=2,{type:S.Punctuator,value:String.fromCharCode(d)+String.fromCharCode(a),range:[c,X]};case 33:case 61:return X+=2,61===W.charCodeAt(X)&&++X,{type:S.Punctuator,value:W.slice(c,X),range:[c,X]}}}return b=W[X+1],e===b&&"&|".indexOf(e)>=0?(X+=2,{type:S.Punctuator,value:e+b,range:[c,X]}):"<>=!+-*%&|^/".indexOf(e)>=0?(++X,{type:S.Punctuator,value:e,range:[c,X]}):void s({},V.UnexpectedToken,"ILLEGAL")}function m(){var a,d,e;if(e=W[X],b(c(e.charCodeAt(0))||"."===e,"Numeric literal must start with a decimal digit or a decimal point"),d=X,a="","."!==e){for(a=W[X++],e=W[X],"0"===a&&e&&c(e.charCodeAt(0))&&s({},V.UnexpectedToken,"ILLEGAL");c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("."===e){for(a+=W[X++];c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("e"===e||"E"===e)if(a+=W[X++],e=W[X],("+"===e||"-"===e)&&(a+=W[X++]),c(W.charCodeAt(X)))for(;c(W.charCodeAt(X));)a+=W[X++];else s({},V.UnexpectedToken,"ILLEGAL");return f(W.charCodeAt(X))&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.NumericLiteral,value:parseFloat(a),range:[d,X]}}function n(){var a,c,d,f="",g=!1;for(a=W[X],b("'"===a||'"'===a,"String literal must starts with a quote"),c=X,++X;Y>X;){if(d=W[X++],d===a){a="";break}if("\\"===d)if(d=W[X++],d&&e(d.charCodeAt(0)))"\r"===d&&"\n"===W[X]&&++X;else switch(d){case"n":f+="\n";break;case"r":f+="\r";break;case"t":f+="	";break;case"b":f+="\b";break;case"f":f+="\f";break;case"v":f+="";break;default:f+=d}else{if(e(d.charCodeAt(0)))break;f+=d}}return""!==a&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.StringLiteral,value:f,octal:g,range:[c,X]}}function o(a){return a.type===S.Identifier||a.type===S.Keyword||a.type===S.BooleanLiteral||a.type===S.NullLiteral}function p(){var a;return i(),X>=Y?{type:S.EOF,range:[X,X]}:(a=W.charCodeAt(X),40===a||41===a||58===a?l():39===a||34===a?n():f(a)?k():46===a?c(W.charCodeAt(X+1))?m():l():c(a)?m():l())}function q(){var a;return a=$,X=a.range[1],$=p(),X=a.range[1],a}function r(){var a;a=X,$=p(),X=a}function s(a,c){var d,e=Array.prototype.slice.call(arguments,2),f=c.replace(/%(\d)/g,function(a,c){return b(c<e.length,"Message reference must be in range"),e[c]});throw d=new Error(f),d.index=X,d.description=f,d}function t(a){s(a,V.UnexpectedToken,a.value)}function u(a){var b=q();(b.type!==S.Punctuator||b.value!==a)&&t(b)}function v(a){return $.type===S.Punctuator&&$.value===a}function w(a){return $.type===S.Keyword&&$.value===a}function x(){var a=[];for(u("[");!v("]");)v(",")?(q(),a.push(null)):(a.push(bb()),v("]")||u(","));return u("]"),Z.createArrayExpression(a)}function y(){var a;return i(),a=q(),a.type===S.StringLiteral||a.type===S.NumericLiteral?Z.createLiteral(a):Z.createIdentifier(a.value)}function z(){var a,b;return a=$,i(),(a.type===S.EOF||a.type===S.Punctuator)&&t(a),b=y(),u(":"),Z.createProperty("init",b,bb())}function A(){var a=[];for(u("{");!v("}");)a.push(z()),v("}")||u(",");return u("}"),Z.createObjectExpression(a)}function B(){var a;return u("("),a=bb(),u(")"),a}function C(){var a,b,c;return v("(")?B():(a=$.type,a===S.Identifier?c=Z.createIdentifier(q().value):a===S.StringLiteral||a===S.NumericLiteral?c=Z.createLiteral(q()):a===S.Keyword?w("this")&&(q(),c=Z.createThisExpression()):a===S.BooleanLiteral?(b=q(),b.value="true"===b.value,c=Z.createLiteral(b)):a===S.NullLiteral?(b=q(),b.value=null,c=Z.createLiteral(b)):v("[")?c=x():v("{")&&(c=A()),c?c:void t(q()))}function D(){var a=[];if(u("("),!v(")"))for(;Y>X&&(a.push(bb()),!v(")"));)u(",");return u(")"),a}function E(){var a;return a=q(),o(a)||t(a),Z.createIdentifier(a.value)}function F(){return u("."),E()}function G(){var a;return u("["),a=bb(),u("]"),a}function H(){var a,b,c;for(a=C();;)if(v("["))c=G(),a=Z.createMemberExpression("[",a,c);else if(v("."))c=F(),a=Z.createMemberExpression(".",a,c);else{if(!v("("))break;b=D(),a=Z.createCallExpression(a,b)}return a}function I(){var a,b;return $.type!==S.Punctuator&&$.type!==S.Keyword?b=ab():v("+")||v("-")||v("!")?(a=q(),b=I(),b=Z.createUnaryExpression(a.value,b)):w("delete")||w("void")||w("typeof")?s({},V.UnexpectedToken):b=ab(),b}function J(a){var b=0;if(a.type!==S.Punctuator&&a.type!==S.Keyword)return 0;switch(a.value){case"||":b=1;break;case"&&":b=2;break;case"==":case"!=":case"===":case"!==":b=6;break;case"<":case">":case"<=":case">=":case"instanceof":b=7;break;case"in":b=7;break;case"+":case"-":b=9;break;case"*":case"/":case"%":b=11}return b}function K(){var a,b,c,d,e,f,g,h;if(g=I(),b=$,c=J(b),0===c)return g;for(b.prec=c,q(),e=I(),d=[g,b,e];(c=J($))>0;){for(;d.length>2&&c<=d[d.length-2].prec;)e=d.pop(),f=d.pop().value,g=d.pop(),a=Z.createBinaryExpression(f,g,e),d.push(a);b=q(),b.prec=c,d.push(b),a=I(),d.push(a)}for(h=d.length-1,a=d[h];h>1;)a=Z.createBinaryExpression(d[h-1].value,d[h-2],a),h-=2;return a}function L(){var a,b,c;return a=K(),v("?")&&(q(),b=L(),u(":"),c=L(),a=Z.createConditionalExpression(a,b,c)),a}function M(){var a,b;return a=q(),a.type!==S.Identifier&&t(a),b=v("(")?D():[],Z.createFilter(a.value,b)}function N(){for(;v("|");)q(),M()}function O(){i(),r();var a=bb();a&&(","===$.value||"in"==$.value&&a.type===U.Identifier?Q(a):(N(),"as"===$.value?P(a):Z.createTopLevel(a))),$.type!==S.EOF&&t($)}function P(a){q();var b=q().value;Z.createAsExpression(a,b)}function Q(a){var b;","===$.value&&(q(),$.type!==S.Identifier&&t($),b=q().value),q();var c=bb();N(),Z.createInExpression(a.name,b,c)}function R(a,b){return Z=b,W=a,X=0,Y=W.length,$=null,_={labelSet:{}},O()}var S,T,U,V,W,X,Y,Z,$,_;S={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8},T={},T[S.BooleanLiteral]="Boolean",T[S.EOF]="<end>",T[S.Identifier]="Identifier",T[S.Keyword]="Keyword",T[S.NullLiteral]="Null",T[S.NumericLiteral]="Numeric",T[S.Punctuator]="Punctuator",T[S.StringLiteral]="String",U={ArrayExpression:"ArrayExpression",BinaryExpression:"BinaryExpression",CallExpression:"CallExpression",ConditionalExpression:"ConditionalExpression",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",Identifier:"Identifier",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ThisExpression:"ThisExpression",UnaryExpression:"UnaryExpression"},V={UnexpectedToken:"Unexpected token %0",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared"};var ab=H,bb=L;a.esprima={parse:R}}(this),function(a){"use strict";function b(a,b,d,e){var f;try{if(f=c(a),f.scopeIdent&&(d.nodeType!==Node.ELEMENT_NODE||"TEMPLATE"!==d.tagName||"bind"!==b&&"repeat"!==b))throw Error("as and in can only be used within <template bind/repeat>")}catch(g){return void console.error("Invalid expression syntax: "+a,g)}return function(a,b,c){var d=f.getBinding(a,e,c);return f.scopeIdent&&d&&(b.polymerExpressionScopeIdent_=f.scopeIdent,f.indexIdent&&(b.polymerExpressionIndexIdent_=f.indexIdent)),d}}function c(a){var b=q[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),q[a]=b}return b}function d(a){this.value=a,this.valueFn_=void 0}function e(a){this.name=a,this.path=Path.get(a)}function f(a,b,c){this.computed="["==c,this.dynamicDeps="function"==typeof a||a.dynamicDeps||this.computed&&!(b instanceof d),this.simplePath=!this.dynamicDeps&&(b instanceof e||b instanceof d)&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property=!this.computed||this.simplePath?b:i(b)}function g(a,b){this.name=a,this.args=[];for(var c=0;c<b.length;c++)this.args[c]=i(b[c])}function h(){throw Error("Not Implemented")}function i(a){return"function"==typeof a?a:a.valueFn()}function j(){this.expression=null,this.filters=[],this.deps={},this.currentPath=void 0,this.scopeIdent=void 0,this.indexIdent=void 0,this.dynamicDeps=!1}function k(a){this.value_=a}function l(a){if(this.scopeIdent=a.scopeIdent,this.indexIdent=a.indexIdent,!a.expression)throw Error("No expression found.");this.expression=a.expression,i(this.expression),this.filters=a.filters,this.dynamicDeps=a.dynamicDeps}function m(a){return String(a).replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function n(a,b){for(;a[t]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[t];return a}function o(a){switch(a){case"":return!1;case"false":case"null":case"true":return!0}return isNaN(Number(a))?!1:!0}function p(){}var q=Object.create(null);
-d.prototype={valueFn:function(){if(!this.valueFn_){var a=this.value;this.valueFn_=function(){return a}}return this.valueFn_}},e.prototype={valueFn:function(){if(!this.valueFn_){var a=(this.name,this.path);this.valueFn_=function(b,c){return c&&c.addPath(b,a),a.getValueFrom(b)}}return this.valueFn_},setValue:function(a,b){return 1==this.path.length,a=n(a,this.path[0]),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof f?this.object.fullPath.slice():[this.object.name];a.push(this.property instanceof e?this.property.name:this.property.value),this.fullPath_=Path.get(a)}return this.fullPath_},valueFn:function(){if(!this.valueFn_){var a=this.object;if(this.simplePath){var b=this.fullPath;this.valueFn_=function(a,c){return c&&c.addPath(a,b),b.getValueFrom(a)}}else if(this.computed){var c=this.property;this.valueFn_=function(b,d,e){var f=a(b,d,e),g=c(b,d,e);return d&&d.addPath(f,[g]),f?f[g]:void 0}}else{var b=Path.get(this.property.name);this.valueFn_=function(c,d,e){var f=a(c,d,e);return d&&d.addPath(f,b),b.getValueFrom(f)}}}return this.valueFn_},setValue:function(a,b){if(this.simplePath)return this.fullPath.setValueFrom(a,b),b;var c=this.object(a),d=this.property instanceof e?this.property.name:this.property(a);return c[d]=b}},g.prototype={transform:function(a,b,c,d,e){var f=c[this.name],g=a;if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find function or filter: "+this.name);if(d?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("Cannot find function or filter: "+this.name);for(var h=e||[],j=0;j<this.args.length;j++)h.push(i(this.args[j])(a,b,c));return f.apply(g,h)}};var r={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},s={"+":function(a,b){return a+b},"-":function(a,b){return a-b},"*":function(a,b){return a*b},"/":function(a,b){return a/b},"%":function(a,b){return a%b},"<":function(a,b){return b>a},">":function(a,b){return a>b},"<=":function(a,b){return b>=a},">=":function(a,b){return a>=b},"==":function(a,b){return a==b},"!=":function(a,b){return a!=b},"===":function(a,b){return a===b},"!==":function(a,b){return a!==b},"&&":function(a,b){return a&&b},"||":function(a,b){return a||b}};j.prototype={createUnaryExpression:function(a,b){if(!r[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d,e){return r[a](b(c,d,e))}},createBinaryExpression:function(a,b,c){if(!s[a])throw Error("Disallowed operator: "+a);return b=i(b),c=i(c),function(d,e,f){return s[a](b(d,e,f),c(d,e,f))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),function(d,e,f){return a(d,e,f)?b(d,e,f):c(d,e,f)}},createIdentifier:function(a){var b=new e(a);return b.type="Identifier",b},createMemberExpression:function(a,b,c){var d=new f(b,c,a);return d.dynamicDeps&&(this.dynamicDeps=!0),d},createCallExpression:function(a,b){if(!(a instanceof e))throw Error("Only identifier function invocations are allowed");var c=new g(a.name,b);return function(a,b,d){return c.transform(a,b,d,!1)}},createLiteral:function(a){return new d(a.value)},createArrayExpression:function(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return function(b,c,d){for(var e=[],f=0;f<a.length;f++)e.push(a[f](b,c,d));return e}},createProperty:function(a,b,c){return{key:b instanceof e?b.name:b.value,value:c}},createObjectExpression:function(a){for(var b=0;b<a.length;b++)a[b].value=i(a[b].value);return function(b,c,d){for(var e={},f=0;f<a.length;f++)e[a[f].key]=a[f].value(b,c,d);return e}},createFilter:function(a,b){this.filters.push(new g(a,b))},createAsExpression:function(a,b){this.expression=a,this.scopeIdent=b},createInExpression:function(a,b,c){this.expression=c,this.scopeIdent=a,this.indexIdent=b},createTopLevel:function(a){this.expression=a},createThisExpression:h},k.prototype={open:function(){return this.value_},discardChanges:function(){return this.value_},deliver:function(){},close:function(){}},l.prototype={getBinding:function(a,b,c){function d(){if(h)return h=!1,g;i.dynamicDeps&&f.startReset();var c=i.getValue(a,i.dynamicDeps?f:void 0,b);return i.dynamicDeps&&f.finishReset(),c}function e(c){return i.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver,g=this.getValue(a,f,b),h=!0,i=this;return new ObserverTransform(f,d,e,!0)},getValue:function(a,b,c){for(var d=i(this.expression)(a,b,c),e=0;e<this.filters.length;e++)d=this.filters[e].transform(a,b,c,!1,[d]);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(a,void 0,c,!0,[b]);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var t="@"+Math.random().toString(36).slice(2);p.prototype={styleObject:function(a){var b=[];for(var c in a)b.push(m(c)+": "+a[c]);return b.join("; ")},tokenList:function(a){var b=[];for(var c in a)a[c]&&b.push(c);return b.join(" ")},prepareInstancePositionChanged:function(a){var b=a.polymerExpressionIndexIdent_;if(b)return function(a,c){a.model[b]=c}},prepareBinding:function(a,c,d){var e=Path.get(a);{if(o(a)||!e.valid)return b(a,c,d,this);if(1==e.length)return function(a,b,c){if(c)return e.getValueFrom(a);var d=n(a,e[0]);return new PathObserver(d,e)}}},prepareInstanceModel:function(a){var b=a.polymerExpressionScopeIdent_;if(b){var c=a.templateInstance?a.templateInstance.model:a.model,d=a.polymerExpressionIndexIdent_;return function(a){return u(c,a,b,d)}}}};var u="__proto__"in{}?function(a,b,c,d){var e={};return e[c]=b,e[d]=void 0,e[t]=a,e.__proto__=a,e}:function(a,b,c,d){var e=Object.create(a);return Object.defineProperty(e,c,{value:b,configurable:!0,writable:!0}),Object.defineProperty(e,d,{value:void 0,configurable:!0,writable:!0}),Object.defineProperty(e,t,{value:a,configurable:!0,writable:!0}),e};a.PolymerExpressions=p,p.getExpression=c}(this),Polymer={version:"0.3.3-0e73963"},"function"==typeof window.Polymer&&(Polymer={}),function(a){function b(a,b){return a&&b&&Object.getOwnPropertyNames(b).forEach(function(c){var d=Object.getOwnPropertyDescriptor(b,c);d&&(Object.defineProperty(a,c,d),"function"==typeof d.value&&(d.value.nom=c))}),a}a.extend=b}(Polymer),function(a){function b(a,b,d){return a?a.stop():a=new c(this),a.go(b,d),a}var c=function(a){this.context=a,this.boundComplete=this.complete.bind(this)};c.prototype={go:function(a,b){this.callback=a;var c;b?(c=setTimeout(this.boundComplete,b),this.handle=function(){clearTimeout(c)}):(c=requestAnimationFrame(this.boundComplete),this.handle=function(){cancelAnimationFrame(c)})},stop:function(){this.handle&&(this.handle(),this.handle=null)},complete:function(){this.handle&&(this.stop(),this.callback.call(this.context))}},a.job=b}(Polymer),function(){var a={};HTMLElement.register=function(b,c){a[b]=c},HTMLElement.getPrototypeForTag=function(b){var c=b?a[b]:HTMLElement.prototype;return c||Object.getPrototypeOf(document.createElement(b))};var b=Event.prototype.stopPropagation;Event.prototype.stopPropagation=function(){this.cancelBubble=!0,b.apply(this,arguments)}}(Polymer),function(a){function b(a){var e=b.caller,g=e.nom,h=e._super;h||(g||(g=e.nom=c.call(this,e)),g||console.warn("called super() on a method not installed declaratively (has no .nom property)"),h=d(e,g,f(this)));var i=h[g];return i?(i._super||d(i,g,h),i.apply(this,a||[])):void 0}function c(a){for(var b=this.__proto__;b&&b!==HTMLElement.prototype;){for(var c,d=Object.getOwnPropertyNames(b),e=0,f=d.length;f>e&&(c=d[e]);e++){var g=Object.getOwnPropertyDescriptor(b,c);if("function"==typeof g.value&&g.value===a)return c}b=b.__proto__}}function d(a,b,c){var d=e(c,b,a);return d[b]&&(d[b].nom=b),a._super=d}function e(a,b,c){for(;a;){if(a[b]!==c&&a[b])return a;a=f(a)}return Object}function f(a){return a.__proto__}a.super=b}(Polymer),function(a){function b(a,b){var d=typeof b;return b instanceof Date&&(d="date"),c[d](a,b)}var c={string:function(a){return a},date:function(a){return new Date(Date.parse(a)||Date.now())},"boolean":function(a){return""===a?!0:"false"===a?!1:!!a},number:function(a){var b=parseFloat(a);return 0===b&&(b=parseInt(a)),isNaN(b)?a:b},object:function(a,b){if(null===b)return a;try{return JSON.parse(a.replace(/'/g,'"'))}catch(c){return a}},"function":function(a,b){return b}};a.deserializeValue=b}(Polymer),function(a){var b=a.extend,c={};c.declaration={},c.instance={},c.publish=function(a,c){for(var d in a)b(c,a[d])},a.api=c}(Polymer),function(a){var b={async:function(a,b,c){Platform.flush(),b=b&&b.length?b:[b];var d=function(){(this[a]||a).apply(this,b)}.bind(this),e=c?setTimeout(d,c):requestAnimationFrame(d);return c?e:~e},cancelAsync:function(a){0>a?cancelAnimationFrame(~a):clearTimeout(a)},fire:function(a,b,c,d,e){var f=c||this,b=b||{},g=new CustomEvent(a,{bubbles:void 0!==d?d:!0,cancelable:void 0!==e?e:!0,detail:b});return f.dispatchEvent(g),g},asyncFire:function(){this.async("fire",arguments)},classFollows:function(a,b,c){b&&b.classList.remove(c),a&&a.classList.add(c)},injectBoundHTML:function(a,b){var c=document.createElement("template");c.innerHTML=a;var d=this.instanceTemplate(c);return b&&(b.textContent="",b.appendChild(d)),d}},c=function(){},d={};b.asyncMethod=b.async,a.api.instance.utils=b,a.nop=c,a.nob=d}(Polymer),function(a){var b=window.logFlags||{},c="on-",d={EVENT_PREFIX:c,addHostListeners:function(){var a=this.eventDelegates;b.events&&Object.keys(a).length>0&&console.log("[%s] addHostListeners:",this.localName,a);for(var c in a){var d=a[c];this.addEventListener(c,this.element.getEventHandler(this,this,d))}},dispatchMethod:function(a,c,d){if(a){b.events&&console.group("[%s] dispatch [%s]",a.localName,c);var e="function"==typeof c?c:a[c];e&&e[d?"apply":"call"](a,d),b.events&&console.groupEnd(),Platform.flush()}}};a.api.instance.events=d}(Polymer),function(a){var b={copyInstanceAttributes:function(){var a=this._instanceAttributes;for(var b in a)this.hasAttribute(b)||this.setAttribute(b,a[b])},takeAttributes:function(){if(this._publishLC)for(var a,b=0,c=this.attributes,d=c.length;(a=c[b])&&d>b;b++)this.attributeToProperty(a.name,a.value)},attributeToProperty:function(b,c){var b=this.propertyForAttribute(b);if(b){if(c&&c.search(a.bindPattern)>=0)return;var d=this[b],c=this.deserializeValue(c,d);c!==d&&(this[b]=c)}},propertyForAttribute:function(a){var b=this._publishLC&&this._publishLC[a];return b},deserializeValue:function(b,c){return a.deserializeValue(b,c)},serializeValue:function(a,b){return"boolean"===b?a?"":void 0:"object"!==b&&"function"!==b&&void 0!==a?a:void 0},reflectPropertyToAttribute:function(a){var b=typeof this[a],c=this.serializeValue(this[a],b);void 0!==c?this.setAttribute(a,c):"boolean"===b&&this.removeAttribute(a)}};a.api.instance.attributes=b}(Polymer),function(a){function b(a,b){return a===b?0!==a||1/a===1/b:f(a)&&f(b)?!0:a!==a&&b!==b}function c(a,b){return void 0===b&&null===a?b:null===b||void 0===b?a:b}var d=window.logFlags||{},e={object:void 0,type:"update",name:void 0,oldValue:void 0},f=Number.isNaN||function(a){return"number"==typeof a&&isNaN(a)},g={createPropertyObserver:function(){var a=this._observeNames;if(a&&a.length){var b=this._propertyObserver=new CompoundObserver(!0);this.registerObserver(b);for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.addPath(this,c),this.observeArrayValue(c,this[c],null)}},openPropertyObserver:function(){this._propertyObserver&&this._propertyObserver.open(this.notifyPropertyChanges,this)},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)if(d=c[2*g+1],e=this.observe[d]){var h=b[g],i=a[g];this.observeArrayValue(d,i,h),f[e]||(void 0!==h&&null!==h||void 0!==i&&null!==i)&&(f[e]=!0,this.invokeMethod(e,[h,i,arguments]))}},deliverChanges:function(){this._propertyObserver&&this._propertyObserver.deliver()},propertyChanged_:function(a){this.reflect[a]&&this.reflectPropertyToAttribute(a)},observeArrayValue:function(a,b,c){var e=this.observe[a];if(e&&(Array.isArray(c)&&(d.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.closeNamedObserver(a+"__array")),Array.isArray(b))){d.observe&&console.log("[%s] observeArrayValue: register observer [%s]",this.localName,a,b);var f=new ArrayObserver(b);f.open(function(a,b){this.invokeMethod(e,[b])},this),this.registerNamedObserver(a+"__array",f)}},emitPropertyChangeRecord:function(a,c,d){if(!b(c,d)&&(this.propertyChanged_(a,c,d),Observer.hasObjectObserve)){var f=this.notifier_;f||(f=this.notifier_=Object.getNotifier(this)),e.object=this,e.name=a,e.oldValue=d,f.notify(e)}},bindToAccessor:function(a,c,d){var e=a+"_",f=a+"Observable_";this[f]=c;var g=this[e],h=this,i=c.open(function(b,c){h[e]=b,h.emitPropertyChangeRecord(a,b,c)});if(d&&!b(g,i)){var j=d(g,i);b(i,j)||(i=j,c.setValue&&c.setValue(i))}this[e]=i,this.emitPropertyChangeRecord(a,i,g);var k={close:function(){c.close(),h[f]=void 0}};return this.registerObserver(k),k},createComputedProperties:function(){if(this._computedNames)for(var a=0;a<this._computedNames.length;a++){var b=this._computedNames[a],c=this.computed[b];try{var d=PolymerExpressions.getExpression(c),e=d.getBinding(this,this.element.syntax);this.bindToAccessor(b,e)}catch(f){console.error("Failed to create computed property",f)}}},bindProperty:function(a,b,d){return d?void(this[a]=b):this.bindToAccessor(a,b,c)},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},registerObserver:function(a){return this._observers?void this._observers.push(a):void(this._observers=[a])},closeObservers:function(){if(this._observers){for(var a=this._observers,b=0;b<a.length;b++){var c=a[b];c&&"function"==typeof c.close&&c.close()}this._observers=[]}},registerNamedObserver:function(a,b){var c=this._namedObservers||(this._namedObservers={});c[a]=b},closeNamedObserver:function(a){var b=this._namedObservers;return b&&b[a]?(b[a].close(),b[a]=null,!0):void 0},closeNamedObservers:function(){if(this._namedObservers){for(var a in this._namedObservers)this.closeNamedObserver(a);this._namedObservers={}}}};a.api.instance.properties=g}(Polymer),function(a){var b=window.logFlags||0,c={instanceTemplate:function(a){for(var b=this.syntax||!a.bindingDelegate&&this.element.syntax,c=a.createInstance(this,b),d=c.bindings_,e=0;e<d.length;e++)this.registerObserver(d[e]);return c},bind:function(a,b,c){var d=this.propertyForAttribute(a);if(d){var e=this.bindProperty(d,b,c);return Platform.enableBindingsReflection&&e&&(e.path=b.path_,this._recordBinding(d,e)),this.reflect[d]&&this.reflectPropertyToAttribute(d),e}return this.mixinSuper(arguments)},bindFinished:function(){this.makeElementReady()},_recordBinding:function(a,b){this.bindings_=this.bindings_||{},this.bindings_[a]=b},asyncUnbindAll:function(){this._unbound||(b.unbind&&console.log("[%s] asyncUnbindAll",this.localName),this._unbindAllJob=this.job(this._unbindAllJob,this.unbindAll,0))},unbindAll:function(){this._unbound||(this.closeObservers(),this.closeNamedObservers(),this._unbound=!0)},cancelUnbindAll:function(){return this._unbound?void(b.unbind&&console.warn("[%s] already unbound, cannot cancel unbindAll",this.localName)):(b.unbind&&console.log("[%s] cancelUnbindAll",this.localName),void(this._unbindAllJob&&(this._unbindAllJob=this._unbindAllJob.stop())))}},d=/\{\{([^{}]*)}}/;a.bindPattern=d,a.api.instance.mdv=c}(Polymer),function(a){function b(a){return a.hasOwnProperty("PolymerBase")}function c(){}var d={PolymerBase:!0,job:function(a,b,c){if("string"!=typeof a)return Polymer.job.call(this,a,b,c);var d="___"+a;this[d]=Polymer.job.call(this,this[d],b,c)},"super":Polymer.super,created:function(){},ready:function(){},createdCallback:function(){this.templateInstance&&this.templateInstance.model&&console.warn("Attributes on "+this.localName+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."),this.created(),this.prepareElement(),(!this.ownerDocument.isStagingDocument||window.ShadowDOMPolyfill)&&this.makeElementReady()},prepareElement:function(){return this._elementPrepared?void console.warn("Element already prepared",this.localName):(this._elementPrepared=!0,this.shadowRoots={},this.createPropertyObserver(),this.openPropertyObserver(),this.copyInstanceAttributes(),this.takeAttributes(),void this.addHostListeners())},makeElementReady:function(){this._readied||(this._readied=!0,this.createComputedProperties(),this.parseDeclarations(this.__proto__),this.removeAttribute("unresolved"),this.ready())},attachedCallback:function(){this.cancelUnbindAll(),this.attached&&this.attached(),this.enteredView&&this.enteredView(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},enteredViewCallback:function(){this.attachedCallback()},leftViewCallback:function(){this.detachedCallback()},enteredDocumentCallback:function(){this.attachedCallback()},leftDocumentCallback:function(){this.detachedCallback()},parseDeclarations:function(a){a&&a.element&&(this.parseDeclarations(a.__proto__),a.parseDeclaration.call(this,a.element))},parseDeclaration:function(a){var b=this.fetchTemplate(a);if(b){var c=this.shadowFromTemplate(b);this.shadowRoots[a.name]=c}},fetchTemplate:function(a){return a.querySelector("template")},shadowFromTemplate:function(a){if(a){var b=this.createShadowRoot(),c=this.instanceTemplate(a);return b.appendChild(c),this.shadowRootReady(b,a),b}},lightFromTemplate:function(a,b){if(a){this.eventController=this;var c=this.instanceTemplate(a);return b?this.insertBefore(c,b):this.appendChild(c),this.shadowRootReady(this),c}},shadowRootReady:function(a){this.marshalNodeReferences(a),PolymerGestures.register(a)},marshalNodeReferences:function(a){var b=this.$=this.$||{};if(a)for(var c,d=a.querySelectorAll("[id]"),e=0,f=d.length;f>e&&(c=d[e]);e++)b[c.id]=c},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},onMutation:function(a,b){var c=new MutationObserver(function(a){b.call(this,c,a),c.disconnect()}.bind(this));c.observe(a,{childList:!0,subtree:!0})}};c.prototype=d,d.constructor=c,a.Base=c,a.isBase=b,a.api.instance.base=d}(Polymer),function(a){function b(a){return a.__proto__}function c(a,b){var c="",d=!1;b&&(c=b.localName,d=b.hasAttribute("is"));var e=Platform.ShadowCSS.makeScopeSelector(c,d);return Platform.ShadowCSS.shimCssText(a,e)}var d=(window.logFlags||{},"element"),e="controller",f={STYLE_SCOPE_ATTRIBUTE:d,installControllerStyles:function(){var a=this.findStyleScope();if(a&&!this.scopeHasNamedStyle(a,this.localName)){for(var c=b(this),d="";c&&c.element;)d+=c.element.cssTextForScope(e),c=b(c);d&&this.installScopeCssText(d,a)}},installScopeStyle:function(a,b,c){var c=c||this.findStyleScope(),b=b||"";if(c&&!this.scopeHasNamedStyle(c,this.localName+b)){var d="";if(a instanceof Array)for(var e,f=0,g=a.length;g>f&&(e=a[f]);f++)d+=e.textContent+"\n\n";else d=a.textContent;this.installScopeCssText(d,c,b)}},installScopeCssText:function(a,b,d){if(b=b||this.findStyleScope(),d=d||"",b){window.ShadowDOMPolyfill&&(a=c(a,b.host));var f=this.element.cssTextToScopeStyle(a,e);Polymer.applyStyleToScope(f,b),b._scopeStyles[this.localName+d]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){return a._scopeStyles=a._scopeStyles||{},a._scopeStyles[b]}};a.api.instance.styles=f}(Polymer),function(a){function b(a,b){if(1===arguments.length&&"string"!=typeof arguments[0]){b=a;var c=document._currentScript;if(a=c&&c.parentNode&&c.parentNode.getAttribute?c.parentNode.getAttribute("name"):"",!a)throw"Element name could not be inferred."}if(f[a])throw"Already registered (Polymer) prototype for element "+a;e(a,b),d(a)}function c(a,b){h[a]=b}function d(a){h[a]&&(h[a].registerWhenReady(),delete h[a])}function e(a,b){return i[a]=b||{}}function f(a){return i[a]}var g=a.extend,h=(a.api,{}),i={};a.getRegisteredPrototype=f,a.waitingForPrototype=c,window.Polymer=b,g(Polymer,a);var j=Platform.deliverDeclarations();if(j)for(var k,l=0,m=j.length;m>l&&(k=j[l]);l++)b.apply(null,k)}(Polymer),function(a){var b={resolveElementPaths:function(a){Platform.urlResolver.resolveDom(a)},addResolvePathApi:function(){var a=this.getAttribute("assetpath")||"",b=new URL(a,this.ownerDocument.baseURI);this.prototype.resolvePath=function(a,c){var d=new URL(a,c||b);return d.href}}};a.api.declaration.path=b}(Polymer),function(a){function b(a,b){var c=new URL(a.getAttribute("href"),b).href;return"@import '"+c+"';"}function c(a,b){if(a){b===document&&(b=document.head),window.ShadowDOMPolyfill&&(b=document.head);var c=d(a.textContent),e=a.getAttribute(h);e&&c.setAttribute(h,e);var f=b.firstElementChild;if(b===document.head){var g="style["+h+"]",i=document.head.querySelectorAll(g);i.length&&(f=i[i.length-1].nextElementSibling)}b.insertBefore(c,f)}}function d(a,b){b=b||document,b=b.createElement?b:b.ownerDocument;var c=b.createElement("style");return c.textContent=a,c}function e(a){return a&&a.__resource||""}function f(a,b){return p?p.call(a,b):void 0}var g=(window.logFlags||{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i="style",j="@import",k="link[rel=stylesheet]",l="global",m="polymer-scope",n={loadStyles:function(a){var b=this.fetchTemplate(),c=b&&this.templateContent();if(c){this.convertSheetsToStyles(c);var d=this.findLoadableStyles(c);if(d.length){var e=b.ownerDocument.baseURI;return Platform.styleResolver.loadStyles(d,e,a)}}a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(k),g=0,h=f.length;h>g&&(c=f[g]);g++)e=d(b(c,this.ownerDocument.baseURI),this.ownerDocument),this.copySheetAttributes(e,c),c.parentNode.replaceChild(e,c)},copySheetAttributes:function(a,b){for(var c,d=0,e=b.attributes,f=e.length;(c=e[d])&&f>d;d++)"rel"!==c.name&&"href"!==c.name&&a.setAttribute(c.name,c.value)},findLoadableStyles:function(a){var b=[];if(a)for(var c,d=a.querySelectorAll(i),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(j)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(k),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(i+"["+m+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(m)}),b=this.templateContent();if(b){var c="";if(a.forEach(function(a){c+=e(a)+"\n"}),c){var f=d(c,this.ownerDocument);b.insertBefore(f,b.firstChild)}}},findNodes:function(a,b){var c=this.querySelectorAll(a).array(),d=this.templateContent();if(d){var e=d.querySelectorAll(a).array();c=c.concat(e)}return b?c.filter(b):c},installGlobalStyles:function(){var a=this.styleForScope(l);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+m+"="+a+"]",d=function(a){return f(a,c)},g=this.sheets.filter(d);g.forEach(function(a){b+=e(a)+"\n\n"});var h=this.styles.filter(d);return h.forEach(function(a){b+=a.textContent+"\n\n"}),b},styleForScope:function(a){var b=this.cssTextForScope(a);return this.cssTextToScopeStyle(b,a)},cssTextToScopeStyle:function(a,b){if(a){var c=d(a);return c.setAttribute(h,this.getAttribute("name")+"-"+b),c}}},o=HTMLElement.prototype,p=o.matches||o.matchesSelector||o.webkitMatchesSelector||o.mozMatchesSelector;a.api.declaration.styles=n,a.applyStyleToScope=c}(Polymer),function(a){var b=(window.logFlags||{},a.api.instance.events),c=b.EVENT_PREFIX,d={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){d[a.toLowerCase()]=a});var e={parseHostEvents:function(){var a=this.prototype.eventDelegates;this.addAttributeDelegates(a)},addAttributeDelegates:function(a){for(var b,c=0;b=this.attributes[c];c++)this.hasEventPrefix(b.name)&&(a[this.removeEventPrefix(b.name)]=b.value.replace("{{","").replace("}}","").trim())},hasEventPrefix:function(a){return a&&"o"===a[0]&&"n"===a[1]&&"-"===a[2]},removeEventPrefix:function(a){return a.slice(f)},findController:function(a){for(;a.parentNode;){if(a.eventController)return a.eventController;a=a.parentNode}return a.host},getEventHandler:function(a,b,c){var d=this;return function(e){a&&a.PolymerBase||(a=d.findController(b));var f=[e,e.detail,e.currentTarget];a.dispatchMethod(a,c,f)}},prepareEventBinding:function(a,b){if(this.hasEventPrefix(b)){var c=this.removeEventPrefix(b);c=d[c]||c;var e=this;return function(b,d,f){function g(){return"{{ "+a+" }}"}var h=e.getEventHandler(void 0,d,a);return d.addEventListener(c,h),f?void 0:{open:g,discardChanges:g,close:function(){d.removeEventListener(c,h)}}}}}},f=c.length;a.api.declaration.events=e}(Polymer),function(a){var b={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(c||(c=a.observe={}),b=d.slice(0,-7),c[b]=c[b]||d)},explodeObservers:function(a){var b=a.observe;if(b){var c={};for(var d in b)for(var e,f=d.split(" "),g=0;e=f[g];g++)c[e]=b[d];a.observe=c}},optimizePropertyMaps:function(a){if(a.observe){var b=a._observeNames=[];for(var c in a.observe)for(var d,e=c.split(" "),f=0;d=e[f];f++)b.push(d)}if(a.publish){var b=a._publishNames=[];for(var c in a.publish)b.push(c)}if(a.computed){var b=a._computedNames=[];for(var c in a.computed)b.push(c)}},publishProperties:function(a,b){var c=a.publish;c&&(this.requireProperties(c,a,b),a._publishLC=this.lowerCaseMap(c))},requireProperties:function(a,b){b.reflect=b.reflect||{};for(var c in a){var d=a[c],e=this.reflectHintForDescriptor(d);void 0===b.reflect[c]&&void 0!==e&&(b.reflect[c]=e),void 0===b[c]&&(b[c]=this.valueForDescriptor(d))}},valueForDescriptor:function(a){var b="object"==typeof a&&a?a.value:a;return void 0!==b?b:null},reflectHintForDescriptor:function(a){return"object"==typeof a&&a&&void 0!==a.reflect?a.reflect:void 0},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b},createPropertyAccessor:function(a){var b=this.prototype,c=a+"_",d=a+"Observable_";b[c]=b[a],Object.defineProperty(b,a,{get:function(){var a=this[d];return a&&a.deliver(),this[c]},set:function(b){var e=this[d];if(e)return void e.setValue(b);var f=this[c];return this[c]=b,this.emitPropertyChangeRecord(a,b,f),b},configurable:!0})},createPropertyAccessors:function(a){var b=a._publishNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c);var b=a._computedNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c)}};a.api.declaration.properties=b}(Polymer),function(a){var b="attributes",c=/\s|,/,d={inheritAttributesObjects:function(a){this.inheritObject(a,"publishLC"),this.inheritObject(a,"_instanceAttributes")},publishAttributes:function(a,d){var e=this.getAttribute(b);if(e)for(var f,g=a.publish||(a.publish={}),h=e.split(c),i=0,j=h.length;j>i;i++)if(f=h[i].trim(),f&&void 0===g[f]){try{var k=void 0!==d[f]}catch(l){k=!1}k||(g[f]=Polymer.nob)}},accumulateInstanceAttributes:function(){for(var a,b=this.prototype._instanceAttributes,c=this.attributes,d=0,e=c.length;e>d&&(a=c[d]);d++)this.isInstanceAttribute(a.name)&&(b[a.name]=a.value)},isInstanceAttribute:function(a){return!this.blackList[a]&&"on-"!==a.slice(0,3)},blackList:{name:1,"extends":1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1}};d.blackList[b]=1,a.api.declaration.attributes=d}(Polymer),function(a){var b=a.api.declaration.events,c=new PolymerExpressions,d=c.prepareBinding;c.prepareBinding=function(a,e,f){return b.prepareEventBinding(a,e,f)||d.call(c,a,e,f)};var e={syntax:c,fetchTemplate:function(){return this.querySelector("template")},templateContent:function(){var a=this.fetchTemplate();return a&&Platform.templateContent(a)},installBindingDelegate:function(a){a&&(a.bindingDelegate=this.syntax)}};a.api.declaration.mdv=e}(Polymer),function(a){function b(a){if(!Object.__proto__){var b=Object.getPrototypeOf(a);a.__proto__=b,d(b)&&(b.__proto__=Object.getPrototypeOf(b))}}var c=a.api,d=a.isBase,e=a.extend,f={register:function(a,b){this.buildPrototype(a,b),this.registerPrototype(a,b),this.publishConstructor()},buildPrototype:function(b,c){var d=a.getRegisteredPrototype(b),e=this.generateBasePrototype(c);this.desugarBeforeChaining(d,e),this.prototype=this.chainPrototypes(d,e),this.desugarAfterChaining(b,c)},desugarBeforeChaining:function(a,b){a.element=this,this.publishAttributes(a,b),this.publishProperties(a,b),this.inferObservers(a),this.explodeObservers(a)},chainPrototypes:function(a,c){this.inheritMetaData(a,c);var d=this.chainObject(a,c);return b(d),d},inheritMetaData:function(a,b){this.inheritObject("observe",a,b),this.inheritObject("publish",a,b),this.inheritObject("reflect",a,b),this.inheritObject("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),this.createPropertyAccessors(this.prototype),this.installBindingDelegate(this.fetchTemplate()),this.installSheets(),this.resolveElementPaths(this),this.accumulateInstanceAttributes(),this.parseHostEvents(),this.addResolvePathApi(),window.ShadowDOMPolyfill&&Platform.ShadowCSS.shimStyling(this.templateContent(),a,b),this.prototype.registerCallback&&this.prototype.registerCallback(this)},publishConstructor:function(){var a=this.getAttribute("constructor");a&&(window[a]=this.ctor)},generateBasePrototype:function(a){var b=this.findBasePrototype(a);if(!b){var b=HTMLElement.getPrototypeForTag(a);b=this.ensureBaseApi(b),g[a]=b}return b},findBasePrototype:function(a){return g[a]},ensureBaseApi:function(a){if(a.PolymerBase)return a;var b=Object.create(a);return c.publish(c.instance,b),this.mixinMethod(b,a,c.instance.mdv,"bind"),b},mixinMethod:function(a,b,c,d){var e=function(a){return b[d].apply(this,a)};a[d]=function(){return this.mixinSuper=e,c[d].apply(this,arguments)}},inheritObject:function(a,b,c){var d=b[a]||{};b[a]=this.chainObject(d,c[a])},registerPrototype:function(a,b){var c={prototype:this.prototype},d=this.findTypeExtension(b);d&&(c.extends=d),HTMLElement.register(a,this.prototype),this.ctor=document.registerElement(a,c)},findTypeExtension:function(a){if(a&&a.indexOf("-")<0)return a;var b=this.findBasePrototype(a);return b.element?this.findTypeExtension(b.element.extends):void 0}},g={};f.chainObject=Object.__proto__?function(a,b){return a&&b&&a!==b&&(a.__proto__=b),a}:function(a,b){if(a&&b&&a!==b){var c=Object.create(b);a=e(c,a)}return a},c.declaration.prototype=f}(Polymer),function(a){function b(a){return document.contains(a)?h:g}function c(){return g.length?g[0]:h[0]}function d(a){e.waitToReady=!0,CustomElements.ready=!1,HTMLImports.whenImportsReady(function(){e.addReadyCallback(a),e.waitToReady=!1,e.check()})}var e={wait:function(a,b,c){var d=-1===this.indexOf(a)&&-1===f.indexOf(a);return d&&(this.add(a),a.__check=b,a.__go=c),0!==this.indexOf(a)},add:function(a){b(a).push(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?g.length:1e9),c},go:function(a){var b=this.remove(a);b&&(this.addToFlushQueue(b),this.check())},remove:function(a){var c=this.indexOf(a);if(0===c)return b(a).shift()},check:function(){var a=this.nextElement();return a&&a.__check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){return!g.length&&!h.length},addToFlushQueue:function(a){f.push(a)},flush:function(){for(var a;f.length;)a=f.shift(),a.__go.call(a),a.__check=a.__go=null},ready:function(){this.flush(),CustomElements.ready===!1&&(CustomElements.upgradeDocumentTree(document),CustomElements.ready=!0),Platform.flush(),requestAnimationFrame(this.flushReadyCallbacks)},addReadyCallback:function(a){a&&i.push(a)},flushReadyCallbacks:function(){if(i)for(var a;i.length;)(a=i.shift())()
-},waitToReady:!0},f=[],g=[],h=[],i=[];document.addEventListener("WebComponentsReady",function(){CustomElements.ready=!1}),a.queue=e,a.whenPolymerReady=d}(Polymer),function(a){function b(a,b){a?(document.head.appendChild(a),d(b)):b&&b()}function c(a,c){if(a&&a.length){for(var d,e,f=document.createDocumentFragment(),g=0,h=a.length;h>g&&(d=a[g]);g++)e=document.createElement("link"),e.rel="import",e.href=d,f.appendChild(e);b(f,c)}else c&&c()}var d=a.whenPolymerReady;a.import=c,a.importElements=b}(Polymer),function(a){function b(a){return Boolean(HTMLElement.getPrototypeForTag(a))}function c(a){return a&&a.indexOf("-")>=0}var d=a.extend,e=a.api,f=a.queue,g=a.whenPolymerReady,h=a.getRegisteredPrototype,i=a.waitingForPrototype,j=d(Object.create(HTMLElement.prototype),{createdCallback:function(){this.getAttribute("name")&&this.init()},init:function(){this.name=this.getAttribute("name"),this.extends=this.getAttribute("extends"),this.loadResources(),this.registerWhenReady()},registerWhenReady:function(){this.registered||this.waitingForPrototype(this.name)||this.waitingForQueue()||this.waitingForResources()||f.go(this)},_register:function(){c(this.extends)&&!b(this.extends)&&console.warn("%s is attempting to extend %s, an unregistered element or one that was not registered with Polymer.",this.name,this.extends),this.register(this.name,this.extends),this.registered=!0},waitingForPrototype:function(a){return h(a)?void 0:(i(a,this),this.handleNoScript(a),!0)},handleNoScript:function(a){if(this.hasAttribute("noscript")&&!this.noscript)if(this.noscript=!0,window.CustomElements&&!CustomElements.useNative)Polymer(a);else{var b=document.createElement("script");b.textContent="Polymer('"+a+"');",this.appendChild(b)}},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.wait(this,this.registerWhenReady,this._register)},loadResources:function(){this._needsResources=!0,this.loadStyles(function(){this._needsResources=!1,this.registerWhenReady()}.bind(this))}});e.publish(e.declaration,j),g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer),function(){var a=document.createElement("polymer-element");a.setAttribute("name","auto-binding"),a.setAttribute("extends","template"),a.init(),Polymer("auto-binding",{createdCallback:function(){this.syntax=this.bindingDelegate=this.makeSyntax(),Polymer.whenPolymerReady(function(){this.model=this,this.setAttribute("bind",""),this.async(function(){this.marshalNodeReferences(this.parentNode),this.fire("template-bound")})}.bind(this))},makeSyntax:function(){var a=Object.create(Polymer.api.declaration.events),b=this;a.findController=function(){return b.model};var c=new PolymerExpressions,d=c.prepareBinding;return c.prepareBinding=function(b,e,f){return a.prepareEventBinding(b,e,f)||d.call(c,b,e,f)},c}})}();
+d.prototype={valueFn:function(){if(!this.valueFn_){var a=this.value;this.valueFn_=function(){return a}}return this.valueFn_}},e.prototype={valueFn:function(){if(!this.valueFn_){var a=(this.name,this.path);this.valueFn_=function(b,c){return c&&c.addPath(b,a),a.getValueFrom(b)}}return this.valueFn_},setValue:function(a,b){return 1==this.path.length,a=n(a,this.path[0]),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof f?this.object.fullPath.slice():[this.object.name];a.push(this.property instanceof e?this.property.name:this.property.value),this.fullPath_=Path.get(a)}return this.fullPath_},valueFn:function(){if(!this.valueFn_){var a=this.object;if(this.simplePath){var b=this.fullPath;this.valueFn_=function(a,c){return c&&c.addPath(a,b),b.getValueFrom(a)}}else if(this.computed){var c=this.property;this.valueFn_=function(b,d,e){var f=a(b,d,e),g=c(b,d,e);return d&&d.addPath(f,[g]),f?f[g]:void 0}}else{var b=Path.get(this.property.name);this.valueFn_=function(c,d,e){var f=a(c,d,e);return d&&d.addPath(f,b),b.getValueFrom(f)}}}return this.valueFn_},setValue:function(a,b){if(this.simplePath)return this.fullPath.setValueFrom(a,b),b;var c=this.object(a),d=this.property instanceof e?this.property.name:this.property(a);return c[d]=b}},g.prototype={transform:function(a,b,c,d,e){var f=c[this.name],g=a;if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find function or filter: "+this.name);if(d?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("Cannot find function or filter: "+this.name);for(var h=e||[],j=0;j<this.args.length;j++)h.push(i(this.args[j])(a,b,c));return f.apply(g,h)}};var r={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},s={"+":function(a,b){return a+b},"-":function(a,b){return a-b},"*":function(a,b){return a*b},"/":function(a,b){return a/b},"%":function(a,b){return a%b},"<":function(a,b){return b>a},">":function(a,b){return a>b},"<=":function(a,b){return b>=a},">=":function(a,b){return a>=b},"==":function(a,b){return a==b},"!=":function(a,b){return a!=b},"===":function(a,b){return a===b},"!==":function(a,b){return a!==b},"&&":function(a,b){return a&&b},"||":function(a,b){return a||b}};j.prototype={createUnaryExpression:function(a,b){if(!r[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d,e){return r[a](b(c,d,e))}},createBinaryExpression:function(a,b,c){if(!s[a])throw Error("Disallowed operator: "+a);return b=i(b),c=i(c),function(d,e,f){return s[a](b(d,e,f),c(d,e,f))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),function(d,e,f){return a(d,e,f)?b(d,e,f):c(d,e,f)}},createIdentifier:function(a){var b=new e(a);return b.type="Identifier",b},createMemberExpression:function(a,b,c){var d=new f(b,c,a);return d.dynamicDeps&&(this.dynamicDeps=!0),d},createCallExpression:function(a,b){if(!(a instanceof e))throw Error("Only identifier function invocations are allowed");var c=new g(a.name,b);return function(a,b,d){return c.transform(a,b,d,!1)}},createLiteral:function(a){return new d(a.value)},createArrayExpression:function(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return function(b,c,d){for(var e=[],f=0;f<a.length;f++)e.push(a[f](b,c,d));return e}},createProperty:function(a,b,c){return{key:b instanceof e?b.name:b.value,value:c}},createObjectExpression:function(a){for(var b=0;b<a.length;b++)a[b].value=i(a[b].value);return function(b,c,d){for(var e={},f=0;f<a.length;f++)e[a[f].key]=a[f].value(b,c,d);return e}},createFilter:function(a,b){this.filters.push(new g(a,b))},createAsExpression:function(a,b){this.expression=a,this.scopeIdent=b},createInExpression:function(a,b,c){this.expression=c,this.scopeIdent=a,this.indexIdent=b},createTopLevel:function(a){this.expression=a},createThisExpression:h},k.prototype={open:function(){return this.value_},discardChanges:function(){return this.value_},deliver:function(){},close:function(){}},l.prototype={getBinding:function(a,b,c){function d(){if(h)return h=!1,g;i.dynamicDeps&&f.startReset();var c=i.getValue(a,i.dynamicDeps?f:void 0,b);return i.dynamicDeps&&f.finishReset(),c}function e(c){return i.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver,g=this.getValue(a,f,b),h=!0,i=this;return new ObserverTransform(f,d,e,!0)},getValue:function(a,b,c){for(var d=i(this.expression)(a,b,c),e=0;e<this.filters.length;e++)d=this.filters[e].transform(a,b,c,!1,[d]);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(a,void 0,c,!0,[b]);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var t="@"+Math.random().toString(36).slice(2);p.prototype={styleObject:function(a){var b=[];for(var c in a)b.push(m(c)+": "+a[c]);return b.join("; ")},tokenList:function(a){var b=[];for(var c in a)a[c]&&b.push(c);return b.join(" ")},prepareInstancePositionChanged:function(a){var b=a.polymerExpressionIndexIdent_;if(b)return function(a,c){a.model[b]=c}},prepareBinding:function(a,c,d){var e=Path.get(a);{if(o(a)||!e.valid)return b(a,c,d,this);if(1==e.length)return function(a,b,c){if(c)return e.getValueFrom(a);var d=n(a,e[0]);return new PathObserver(d,e)}}},prepareInstanceModel:function(a){var b=a.polymerExpressionScopeIdent_;if(b){var c=a.templateInstance?a.templateInstance.model:a.model,d=a.polymerExpressionIndexIdent_;return function(a){return u(c,a,b,d)}}}};var u="__proto__"in{}?function(a,b,c,d){var e={};return e[c]=b,e[d]=void 0,e[t]=a,e.__proto__=a,e}:function(a,b,c,d){var e=Object.create(a);return Object.defineProperty(e,c,{value:b,configurable:!0,writable:!0}),Object.defineProperty(e,d,{value:void 0,configurable:!0,writable:!0}),Object.defineProperty(e,t,{value:a,configurable:!0,writable:!0}),e};a.PolymerExpressions=p,p.getExpression=c}(this),"function"==typeof window.Polymer&&(Polymer={}),function(a){function b(a,b){return a&&b&&Object.getOwnPropertyNames(b).forEach(function(c){var d=Object.getOwnPropertyDescriptor(b,c);d&&(Object.defineProperty(a,c,d),"function"==typeof d.value&&(d.value.nom=c))}),a}a.extend=b}(Polymer),function(a){function b(a,b,d){return a?a.stop():a=new c(this),a.go(b,d),a}var c=function(a){this.context=a,this.boundComplete=this.complete.bind(this)};c.prototype={go:function(a,b){this.callback=a;var c;b?(c=setTimeout(this.boundComplete,b),this.handle=function(){clearTimeout(c)}):(c=requestAnimationFrame(this.boundComplete),this.handle=function(){cancelAnimationFrame(c)})},stop:function(){this.handle&&(this.handle(),this.handle=null)},complete:function(){this.handle&&(this.stop(),this.callback.call(this.context))}},a.job=b}(Polymer),function(){var a={};HTMLElement.register=function(b,c){a[b]=c},HTMLElement.getPrototypeForTag=function(b){var c=b?a[b]:HTMLElement.prototype;return c||Object.getPrototypeOf(document.createElement(b))};var b=Event.prototype.stopPropagation;Event.prototype.stopPropagation=function(){this.cancelBubble=!0,b.apply(this,arguments)}}(Polymer),function(a){function b(a){var e=b.caller,g=e.nom,h=e._super;h||(g||(g=e.nom=c.call(this,e)),g||console.warn("called super() on a method not installed declaratively (has no .nom property)"),h=d(e,g,f(this)));var i=h[g];return i?(i._super||d(i,g,h),i.apply(this,a||[])):void 0}function c(a){for(var b=this.__proto__;b&&b!==HTMLElement.prototype;){for(var c,d=Object.getOwnPropertyNames(b),e=0,f=d.length;f>e&&(c=d[e]);e++){var g=Object.getOwnPropertyDescriptor(b,c);if("function"==typeof g.value&&g.value===a)return c}b=b.__proto__}}function d(a,b,c){var d=e(c,b,a);return d[b]&&(d[b].nom=b),a._super=d}function e(a,b,c){for(;a;){if(a[b]!==c&&a[b])return a;a=f(a)}return Object}function f(a){return a.__proto__}a.super=b}(Polymer),function(a){function b(a,b){var d=typeof b;return b instanceof Date&&(d="date"),c[d](a,b)}var c={string:function(a){return a},date:function(a){return new Date(Date.parse(a)||Date.now())},"boolean":function(a){return""===a?!0:"false"===a?!1:!!a},number:function(a){var b=parseFloat(a);return 0===b&&(b=parseInt(a)),isNaN(b)?a:b},object:function(a,b){if(null===b)return a;try{return JSON.parse(a.replace(/'/g,'"'))}catch(c){return a}},"function":function(a,b){return b}};a.deserializeValue=b}(Polymer),function(a){var b=a.extend,c={};c.declaration={},c.instance={},c.publish=function(a,c){for(var d in a)b(c,a[d])},a.api=c}(Polymer),function(a){var b={async:function(a,b,c){Platform.flush(),b=b&&b.length?b:[b];var d=function(){(this[a]||a).apply(this,b)}.bind(this),e=c?setTimeout(d,c):requestAnimationFrame(d);return c?e:~e},cancelAsync:function(a){0>a?cancelAnimationFrame(~a):clearTimeout(a)},fire:function(a,b,c,d,e){var f=c||this,b=b||{},g=new CustomEvent(a,{bubbles:void 0!==d?d:!0,cancelable:void 0!==e?e:!0,detail:b});return f.dispatchEvent(g),g},asyncFire:function(){this.async("fire",arguments)},classFollows:function(a,b,c){b&&b.classList.remove(c),a&&a.classList.add(c)},injectBoundHTML:function(a,b){var c=document.createElement("template");c.innerHTML=a;var d=this.instanceTemplate(c);return b&&(b.textContent="",b.appendChild(d)),d}},c=function(){},d={};b.asyncMethod=b.async,a.api.instance.utils=b,a.nop=c,a.nob=d}(Polymer),function(a){var b=window.logFlags||{},c="on-",d={EVENT_PREFIX:c,addHostListeners:function(){var a=this.eventDelegates;b.events&&Object.keys(a).length>0&&console.log("[%s] addHostListeners:",this.localName,a);for(var c in a){var d=a[c];this.addEventListener(c,this.element.getEventHandler(this,this,d))}},dispatchMethod:function(a,c,d){if(a){b.events&&console.group("[%s] dispatch [%s]",a.localName,c);var e="function"==typeof c?c:a[c];e&&e[d?"apply":"call"](a,d),b.events&&console.groupEnd(),Platform.flush()}}};a.api.instance.events=d}(Polymer),function(a){var b={copyInstanceAttributes:function(){var a=this._instanceAttributes;for(var b in a)this.hasAttribute(b)||this.setAttribute(b,a[b])},takeAttributes:function(){if(this._publishLC)for(var a,b=0,c=this.attributes,d=c.length;(a=c[b])&&d>b;b++)this.attributeToProperty(a.name,a.value)},attributeToProperty:function(b,c){var b=this.propertyForAttribute(b);if(b){if(c&&c.search(a.bindPattern)>=0)return;var d=this[b],c=this.deserializeValue(c,d);c!==d&&(this[b]=c)}},propertyForAttribute:function(a){var b=this._publishLC&&this._publishLC[a];return b},deserializeValue:function(b,c){return a.deserializeValue(b,c)},serializeValue:function(a,b){return"boolean"===b?a?"":void 0:"object"!==b&&"function"!==b&&void 0!==a?a:void 0},reflectPropertyToAttribute:function(a){var b=typeof this[a],c=this.serializeValue(this[a],b);void 0!==c?this.setAttribute(a,c):"boolean"===b&&this.removeAttribute(a)}};a.api.instance.attributes=b}(Polymer),function(a){function b(a,b){return a===b?0!==a||1/a===1/b:f(a)&&f(b)?!0:a!==a&&b!==b}function c(a,b){return void 0===b&&null===a?b:null===b||void 0===b?a:b}var d=window.logFlags||{},e={object:void 0,type:"update",name:void 0,oldValue:void 0},f=Number.isNaN||function(a){return"number"==typeof a&&isNaN(a)},g={createPropertyObserver:function(){var a=this._observeNames;if(a&&a.length){var b=this._propertyObserver=new CompoundObserver(!0);this.registerObserver(b);for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.addPath(this,c),this.observeArrayValue(c,this[c],null)}},openPropertyObserver:function(){this._propertyObserver&&this._propertyObserver.open(this.notifyPropertyChanges,this)},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)if(d=c[2*g+1],e=this.observe[d]){var h=b[g],i=a[g];this.observeArrayValue(d,i,h),f[e]||(void 0!==h&&null!==h||void 0!==i&&null!==i)&&(f[e]=!0,this.invokeMethod(e,[h,i,arguments]))}},deliverChanges:function(){this._propertyObserver&&this._propertyObserver.deliver()},propertyChanged_:function(a){this.reflect[a]&&this.reflectPropertyToAttribute(a)},observeArrayValue:function(a,b,c){var e=this.observe[a];if(e&&(Array.isArray(c)&&(d.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.closeNamedObserver(a+"__array")),Array.isArray(b))){d.observe&&console.log("[%s] observeArrayValue: register observer [%s]",this.localName,a,b);var f=new ArrayObserver(b);f.open(function(a,b){this.invokeMethod(e,[b])},this),this.registerNamedObserver(a+"__array",f)}},emitPropertyChangeRecord:function(a,c,d){if(!b(c,d)&&(this.propertyChanged_(a,c,d),Observer.hasObjectObserve)){var f=this.notifier_;f||(f=this.notifier_=Object.getNotifier(this)),e.object=this,e.name=a,e.oldValue=d,f.notify(e)}},bindToAccessor:function(a,c,d){var e=a+"_",f=a+"Observable_";this[f]=c;var g=this[e],h=this,i=c.open(function(b,c){h[e]=b,h.emitPropertyChangeRecord(a,b,c)});if(d&&!b(g,i)){var j=d(g,i);b(i,j)||(i=j,c.setValue&&c.setValue(i))}this[e]=i,this.emitPropertyChangeRecord(a,i,g);var k={close:function(){c.close(),h[f]=void 0}};return this.registerObserver(k),k},createComputedProperties:function(){if(this._computedNames)for(var a=0;a<this._computedNames.length;a++){var b=this._computedNames[a],c=this.computed[b];try{var d=PolymerExpressions.getExpression(c),e=d.getBinding(this,this.element.syntax);this.bindToAccessor(b,e)}catch(f){console.error("Failed to create computed property",f)}}},bindProperty:function(a,b,d){return d?void(this[a]=b):this.bindToAccessor(a,b,c)},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},registerObserver:function(a){return this._observers?void this._observers.push(a):void(this._observers=[a])},closeObservers:function(){if(this._observers){for(var a=this._observers,b=0;b<a.length;b++){var c=a[b];c&&"function"==typeof c.close&&c.close()}this._observers=[]}},registerNamedObserver:function(a,b){var c=this._namedObservers||(this._namedObservers={});c[a]=b},closeNamedObserver:function(a){var b=this._namedObservers;return b&&b[a]?(b[a].close(),b[a]=null,!0):void 0},closeNamedObservers:function(){if(this._namedObservers){for(var a in this._namedObservers)this.closeNamedObserver(a);this._namedObservers={}}}};a.api.instance.properties=g}(Polymer),function(a){var b=window.logFlags||0,c={instanceTemplate:function(a){for(var b=this.syntax||!a.bindingDelegate&&this.element.syntax,c=a.createInstance(this,b),d=c.bindings_,e=0;e<d.length;e++)this.registerObserver(d[e]);return c},bind:function(a,b,c){var d=this.propertyForAttribute(a);if(d){var e=this.bindProperty(d,b,c);return Platform.enableBindingsReflection&&e&&(e.path=b.path_,this._recordBinding(d,e)),this.reflect[d]&&this.reflectPropertyToAttribute(d),e}return this.mixinSuper(arguments)},bindFinished:function(){this.makeElementReady()},_recordBinding:function(a,b){this.bindings_=this.bindings_||{},this.bindings_[a]=b},asyncUnbindAll:function(){this._unbound||(b.unbind&&console.log("[%s] asyncUnbindAll",this.localName),this._unbindAllJob=this.job(this._unbindAllJob,this.unbindAll,0))},unbindAll:function(){this._unbound||(this.closeObservers(),this.closeNamedObservers(),this._unbound=!0)},cancelUnbindAll:function(){return this._unbound?void(b.unbind&&console.warn("[%s] already unbound, cannot cancel unbindAll",this.localName)):(b.unbind&&console.log("[%s] cancelUnbindAll",this.localName),void(this._unbindAllJob&&(this._unbindAllJob=this._unbindAllJob.stop())))}},d=/\{\{([^{}]*)}}/;a.bindPattern=d,a.api.instance.mdv=c}(Polymer),function(a){function b(a){return a.hasOwnProperty("PolymerBase")}function c(){}var d={PolymerBase:!0,job:function(a,b,c){if("string"!=typeof a)return Polymer.job.call(this,a,b,c);var d="___"+a;this[d]=Polymer.job.call(this,this[d],b,c)},"super":Polymer.super,created:function(){},ready:function(){},createdCallback:function(){this.templateInstance&&this.templateInstance.model&&console.warn("Attributes on "+this.localName+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."),this.created(),this.prepareElement(),(!this.ownerDocument.isStagingDocument||window.ShadowDOMPolyfill)&&this.makeElementReady()},prepareElement:function(){return this._elementPrepared?void console.warn("Element already prepared",this.localName):(this._elementPrepared=!0,this.shadowRoots={},this.createPropertyObserver(),this.openPropertyObserver(),this.copyInstanceAttributes(),this.takeAttributes(),void this.addHostListeners())},makeElementReady:function(){this._readied||(this._readied=!0,this.createComputedProperties(),this.parseDeclarations(this.__proto__),this.removeAttribute("unresolved"),this.ready())},attachedCallback:function(){this.cancelUnbindAll(),this.attached&&this.attached(),this.enteredView&&this.enteredView(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},enteredViewCallback:function(){this.attachedCallback()},leftViewCallback:function(){this.detachedCallback()},enteredDocumentCallback:function(){this.attachedCallback()},leftDocumentCallback:function(){this.detachedCallback()},parseDeclarations:function(a){a&&a.element&&(this.parseDeclarations(a.__proto__),a.parseDeclaration.call(this,a.element))},parseDeclaration:function(a){var b=this.fetchTemplate(a);if(b){var c=this.shadowFromTemplate(b);this.shadowRoots[a.name]=c}},fetchTemplate:function(a){return a.querySelector("template")},shadowFromTemplate:function(a){if(a){var b=this.createShadowRoot(),c=this.instanceTemplate(a);return b.appendChild(c),this.shadowRootReady(b,a),b}},lightFromTemplate:function(a,b){if(a){this.eventController=this;var c=this.instanceTemplate(a);return b?this.insertBefore(c,b):this.appendChild(c),this.shadowRootReady(this),c}},shadowRootReady:function(a){this.marshalNodeReferences(a),PolymerGestures.register(a)},marshalNodeReferences:function(a){var b=this.$=this.$||{};if(a)for(var c,d=a.querySelectorAll("[id]"),e=0,f=d.length;f>e&&(c=d[e]);e++)b[c.id]=c},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},onMutation:function(a,b){var c=new MutationObserver(function(a){b.call(this,c,a),c.disconnect()}.bind(this));c.observe(a,{childList:!0,subtree:!0})}};c.prototype=d,d.constructor=c,a.Base=c,a.isBase=b,a.api.instance.base=d}(Polymer),function(a){function b(a){return a.__proto__}function c(a,b){var c="",d=!1;b&&(c=b.localName,d=b.hasAttribute("is"));var e=Platform.ShadowCSS.makeScopeSelector(c,d);return Platform.ShadowCSS.shimCssText(a,e)}var d=(window.logFlags||{},"element"),e="controller",f={STYLE_SCOPE_ATTRIBUTE:d,installControllerStyles:function(){var a=this.findStyleScope();if(a&&!this.scopeHasNamedStyle(a,this.localName)){for(var c=b(this),d="";c&&c.element;)d+=c.element.cssTextForScope(e),c=b(c);d&&this.installScopeCssText(d,a)}},installScopeStyle:function(a,b,c){var c=c||this.findStyleScope(),b=b||"";if(c&&!this.scopeHasNamedStyle(c,this.localName+b)){var d="";if(a instanceof Array)for(var e,f=0,g=a.length;g>f&&(e=a[f]);f++)d+=e.textContent+"\n\n";else d=a.textContent;this.installScopeCssText(d,c,b)}},installScopeCssText:function(a,b,d){if(b=b||this.findStyleScope(),d=d||"",b){window.ShadowDOMPolyfill&&(a=c(a,b.host));var f=this.element.cssTextToScopeStyle(a,e);Polymer.applyStyleToScope(f,b),this.styleCacheForScope(b)[this.localName+d]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){var c=this.styleCacheForScope(a);return c[b]},styleCacheForScope:function(a){if(window.ShadowDOMPolyfill){var b=a.host?a.host.localName:a.localName;return g[b]||(g[b]={})}return a._scopeStyles=a._scopeStyles||{}}},g={};a.api.instance.styles=f}(Polymer),function(a){function b(a,b){if(1===arguments.length&&"string"!=typeof arguments[0]){b=a;var c=document._currentScript;if(a=c&&c.parentNode&&c.parentNode.getAttribute?c.parentNode.getAttribute("name"):"",!a)throw"Element name could not be inferred."}if(f[a])throw"Already registered (Polymer) prototype for element "+a;e(a,b),d(a)}function c(a,b){h[a]=b}function d(a){h[a]&&(h[a].registerWhenReady(),delete h[a])}function e(a,b){return i[a]=b||{}}function f(a){return i[a]}var g=a.extend,h=(a.api,{}),i={};a.getRegisteredPrototype=f,a.waitingForPrototype=c,window.Polymer=b,g(Polymer,a);var j=Platform.deliverDeclarations();if(j)for(var k,l=0,m=j.length;m>l&&(k=j[l]);l++)b.apply(null,k)}(Polymer),function(a){var b={resolveElementPaths:function(a){Platform.urlResolver.resolveDom(a)},addResolvePathApi:function(){var a=this.getAttribute("assetpath")||"",b=new URL(a,this.ownerDocument.baseURI);this.prototype.resolvePath=function(a,c){var d=new URL(a,c||b);return d.href}}};a.api.declaration.path=b}(Polymer),function(a){function b(a,b){var c=new URL(a.getAttribute("href"),b).href;return"@import '"+c+"';"}function c(a,b){if(a){b===document&&(b=document.head),window.ShadowDOMPolyfill&&(b=document.head);var c=d(a.textContent),e=a.getAttribute(h);e&&c.setAttribute(h,e);var f=b.firstElementChild;if(b===document.head){var g="style["+h+"]",i=document.head.querySelectorAll(g);i.length&&(f=i[i.length-1].nextElementSibling)}b.insertBefore(c,f)}}function d(a,b){b=b||document,b=b.createElement?b:b.ownerDocument;var c=b.createElement("style");return c.textContent=a,c}function e(a){return a&&a.__resource||""}function f(a,b){return p?p.call(a,b):void 0}var g=(window.logFlags||{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i="style",j="@import",k="link[rel=stylesheet]",l="global",m="polymer-scope",n={loadStyles:function(a){var b=this.fetchTemplate(),c=b&&this.templateContent();if(c){this.convertSheetsToStyles(c);var d=this.findLoadableStyles(c);if(d.length){var e=b.ownerDocument.baseURI;return Platform.styleResolver.loadStyles(d,e,a)}}a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(k),g=0,h=f.length;h>g&&(c=f[g]);g++)e=d(b(c,this.ownerDocument.baseURI),this.ownerDocument),this.copySheetAttributes(e,c),c.parentNode.replaceChild(e,c)},copySheetAttributes:function(a,b){for(var c,d=0,e=b.attributes,f=e.length;(c=e[d])&&f>d;d++)"rel"!==c.name&&"href"!==c.name&&a.setAttribute(c.name,c.value)},findLoadableStyles:function(a){var b=[];if(a)for(var c,d=a.querySelectorAll(i),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(j)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(k),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(i+"["+m+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(m)}),b=this.templateContent();if(b){var c="";if(a.forEach(function(a){c+=e(a)+"\n"}),c){var f=d(c,this.ownerDocument);b.insertBefore(f,b.firstChild)}}},findNodes:function(a,b){var c=this.querySelectorAll(a).array(),d=this.templateContent();if(d){var e=d.querySelectorAll(a).array();c=c.concat(e)}return b?c.filter(b):c},installGlobalStyles:function(){var a=this.styleForScope(l);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+m+"="+a+"]",d=function(a){return f(a,c)},g=this.sheets.filter(d);g.forEach(function(a){b+=e(a)+"\n\n"});var h=this.styles.filter(d);return h.forEach(function(a){b+=a.textContent+"\n\n"}),b},styleForScope:function(a){var b=this.cssTextForScope(a);return this.cssTextToScopeStyle(b,a)},cssTextToScopeStyle:function(a,b){if(a){var c=d(a);return c.setAttribute(h,this.getAttribute("name")+"-"+b),c}}},o=HTMLElement.prototype,p=o.matches||o.matchesSelector||o.webkitMatchesSelector||o.mozMatchesSelector;a.api.declaration.styles=n,a.applyStyleToScope=c}(Polymer),function(a){var b=(window.logFlags||{},a.api.instance.events),c=b.EVENT_PREFIX,d={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){d[a.toLowerCase()]=a});var e={parseHostEvents:function(){var a=this.prototype.eventDelegates;this.addAttributeDelegates(a)},addAttributeDelegates:function(a){for(var b,c=0;b=this.attributes[c];c++)this.hasEventPrefix(b.name)&&(a[this.removeEventPrefix(b.name)]=b.value.replace("{{","").replace("}}","").trim())},hasEventPrefix:function(a){return a&&"o"===a[0]&&"n"===a[1]&&"-"===a[2]},removeEventPrefix:function(a){return a.slice(f)},findController:function(a){for(;a.parentNode;){if(a.eventController)return a.eventController;a=a.parentNode}return a.host},getEventHandler:function(a,b,c){var d=this;return function(e){a&&a.PolymerBase||(a=d.findController(b));var f=[e,e.detail,e.currentTarget];a.dispatchMethod(a,c,f)}},prepareEventBinding:function(a,b){if(this.hasEventPrefix(b)){var c=this.removeEventPrefix(b);c=d[c]||c;var e=this;return function(b,d,f){function g(){return"{{ "+a+" }}"}var h=e.getEventHandler(void 0,d,a);return d.addEventListener(c,h),f?void 0:{open:g,discardChanges:g,close:function(){d.removeEventListener(c,h)}}}}}},f=c.length;a.api.declaration.events=e}(Polymer),function(a){var b={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(c||(c=a.observe={}),b=d.slice(0,-7),c[b]=c[b]||d)},explodeObservers:function(a){var b=a.observe;if(b){var c={};for(var d in b)for(var e,f=d.split(" "),g=0;e=f[g];g++)c[e]=b[d];a.observe=c}},optimizePropertyMaps:function(a){if(a.observe){var b=a._observeNames=[];for(var c in a.observe)for(var d,e=c.split(" "),f=0;d=e[f];f++)b.push(d)}if(a.publish){var b=a._publishNames=[];for(var c in a.publish)b.push(c)}if(a.computed){var b=a._computedNames=[];for(var c in a.computed)b.push(c)}},publishProperties:function(a,b){var c=a.publish;c&&(this.requireProperties(c,a,b),a._publishLC=this.lowerCaseMap(c))},requireProperties:function(a,b){b.reflect=b.reflect||{};for(var c in a){var d=a[c],e=this.reflectHintForDescriptor(d);void 0===b.reflect[c]&&void 0!==e&&(b.reflect[c]=e),void 0===b[c]&&(b[c]=this.valueForDescriptor(d))}},valueForDescriptor:function(a){var b="object"==typeof a&&a?a.value:a;return void 0!==b?b:null},reflectHintForDescriptor:function(a){return"object"==typeof a&&a&&void 0!==a.reflect?a.reflect:void 0},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b},createPropertyAccessor:function(a){var b=this.prototype,c=a+"_",d=a+"Observable_";b[c]=b[a],Object.defineProperty(b,a,{get:function(){var a=this[d];return a&&a.deliver(),this[c]},set:function(b){var e=this[d];if(e)return void e.setValue(b);var f=this[c];return this[c]=b,this.emitPropertyChangeRecord(a,b,f),b},configurable:!0})},createPropertyAccessors:function(a){var b=a._publishNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c);var b=a._computedNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c)}};a.api.declaration.properties=b}(Polymer),function(a){var b="attributes",c=/\s|,/,d={inheritAttributesObjects:function(a){this.inheritObject(a,"publishLC"),this.inheritObject(a,"_instanceAttributes")},publishAttributes:function(a,d){var e=this.getAttribute(b);if(e)for(var f,g=a.publish||(a.publish={}),h=e.split(c),i=0,j=h.length;j>i;i++)if(f=h[i].trim(),f&&void 0===g[f]){try{var k=void 0!==d[f]}catch(l){k=!1}k||(g[f]=Polymer.nob)}},accumulateInstanceAttributes:function(){for(var a,b=this.prototype._instanceAttributes,c=this.attributes,d=0,e=c.length;e>d&&(a=c[d]);d++)this.isInstanceAttribute(a.name)&&(b[a.name]=a.value)},isInstanceAttribute:function(a){return!this.blackList[a]&&"on-"!==a.slice(0,3)},blackList:{name:1,"extends":1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1}};d.blackList[b]=1,a.api.declaration.attributes=d}(Polymer),function(a){var b=a.api.declaration.events,c=new PolymerExpressions,d=c.prepareBinding;c.prepareBinding=function(a,e,f){return b.prepareEventBinding(a,e,f)||d.call(c,a,e,f)};var e={syntax:c,fetchTemplate:function(){return this.querySelector("template")},templateContent:function(){var a=this.fetchTemplate();return a&&Platform.templateContent(a)},installBindingDelegate:function(a){a&&(a.bindingDelegate=this.syntax)}};a.api.declaration.mdv=e}(Polymer),function(a){function b(a){if(!Object.__proto__){var b=Object.getPrototypeOf(a);a.__proto__=b,d(b)&&(b.__proto__=Object.getPrototypeOf(b))}}var c=a.api,d=a.isBase,e=a.extend,f={register:function(a,b){this.buildPrototype(a,b),this.registerPrototype(a,b),this.publishConstructor()},buildPrototype:function(b,c){var d=a.getRegisteredPrototype(b),e=this.generateBasePrototype(c);this.desugarBeforeChaining(d,e),this.prototype=this.chainPrototypes(d,e),this.desugarAfterChaining(b,c)},desugarBeforeChaining:function(a,b){a.element=this,this.publishAttributes(a,b),this.publishProperties(a,b),this.inferObservers(a),this.explodeObservers(a)},chainPrototypes:function(a,c){this.inheritMetaData(a,c);var d=this.chainObject(a,c);return b(d),d},inheritMetaData:function(a,b){this.inheritObject("observe",a,b),this.inheritObject("publish",a,b),this.inheritObject("reflect",a,b),this.inheritObject("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),this.createPropertyAccessors(this.prototype),this.installBindingDelegate(this.fetchTemplate()),this.installSheets(),this.resolveElementPaths(this),this.accumulateInstanceAttributes(),this.parseHostEvents(),this.addResolvePathApi(),window.ShadowDOMPolyfill&&Platform.ShadowCSS.shimStyling(this.templateContent(),a,b),this.prototype.registerCallback&&this.prototype.registerCallback(this)},publishConstructor:function(){var a=this.getAttribute("constructor");a&&(window[a]=this.ctor)},generateBasePrototype:function(a){var b=this.findBasePrototype(a);if(!b){var b=HTMLElement.getPrototypeForTag(a);b=this.ensureBaseApi(b),g[a]=b}return b},findBasePrototype:function(a){return g[a]},ensureBaseApi:function(a){if(a.PolymerBase)return a;var b=Object.create(a);return c.publish(c.instance,b),this.mixinMethod(b,a,c.instance.mdv,"bind"),b},mixinMethod:function(a,b,c,d){var e=function(a){return b[d].apply(this,a)};a[d]=function(){return this.mixinSuper=e,c[d].apply(this,arguments)}},inheritObject:function(a,b,c){var d=b[a]||{};b[a]=this.chainObject(d,c[a])},registerPrototype:function(a,b){var c={prototype:this.prototype},d=this.findTypeExtension(b);d&&(c.extends=d),HTMLElement.register(a,this.prototype),this.ctor=document.registerElement(a,c)},findTypeExtension:function(a){if(a&&a.indexOf("-")<0)return a;var b=this.findBasePrototype(a);return b.element?this.findTypeExtension(b.element.extends):void 0}},g={};f.chainObject=Object.__proto__?function(a,b){return a&&b&&a!==b&&(a.__proto__=b),a}:function(a,b){if(a&&b&&a!==b){var c=Object.create(b);a=e(c,a)}return a},c.declaration.prototype=f}(Polymer),function(a){function b(a){return document.contains(a)?i:h}function c(){return h.length?h[0]:i[0]}function d(a){e.waitToReady=!0,CustomElements.ready=!1,HTMLImports.whenImportsReady(function(){e.addReadyCallback(a),e.waitToReady=!1,e.check()})}var e={wait:function(a){a.__queue||(a.__queue={},f.push(a))},enqueue:function(a,c,d){var e=a.__queue&&!a.__queue.check;return e&&(b(a).push(a),a.__queue.check=c,a.__queue.go=d),0!==this.indexOf(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?h.length:1e9),c},go:function(a){var b=this.remove(a);b&&(a.__queue.flushable=!0,this.addToFlushQueue(b),this.check())},remove:function(a){var c=this.indexOf(a);if(0===c)return b(a).shift()},check:function(){var a=this.nextElement();return a&&a.__queue.check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){for(var a,b=0,c=f.length;c>b&&(a=f[b]);b++)if(a.__queue&&!a.__queue.flushable)return;return!0},addToFlushQueue:function(a){g.push(a)},flush:function(){if(!this.flushing){g.length&&console.warn("flushing %s elements",g.length),this.flushing=!0;for(var a;g.length;)a=g.shift(),a.__queue.go.call(a),a.__queue=null;
+this.flushing=!1}},ready:function(){this.flush(),CustomElements.ready===!1&&(CustomElements.upgradeDocumentTree(document),CustomElements.ready=!0),Platform.flush(),requestAnimationFrame(this.flushReadyCallbacks)},addReadyCallback:function(a){a&&j.push(a)},flushReadyCallbacks:function(){if(j)for(var a;j.length;)(a=j.shift())()},waitToReady:!0},f=[],g=[],h=[],i=[],j=[];document.addEventListener("WebComponentsReady",function(){CustomElements.ready=!1}),a.elements=f,a.queue=e,a.whenReady=a.whenPolymerReady=d}(Polymer),function(a){function b(a,b){a?(document.head.appendChild(a),d(b)):b&&b()}function c(a,c){if(a&&a.length){for(var d,e,f=document.createDocumentFragment(),g=0,h=a.length;h>g&&(d=a[g]);g++)e=document.createElement("link"),e.rel="import",e.href=d,f.appendChild(e);b(f,c)}else c&&c()}var d=a.whenPolymerReady;a.import=c,a.importElements=b}(Polymer),function(a){function b(a){return Boolean(HTMLElement.getPrototypeForTag(a))}function c(a){return a&&a.indexOf("-")>=0}var d=a.extend,e=a.api,f=a.queue,g=a.whenPolymerReady,h=a.getRegisteredPrototype,i=a.waitingForPrototype,j=d(Object.create(HTMLElement.prototype),{createdCallback:function(){this.getAttribute("name")&&this.init()},init:function(){this.name=this.getAttribute("name"),this.extends=this.getAttribute("extends"),f.wait(this),this.loadResources(),this.registerWhenReady()},registerWhenReady:function(){this.registered||this.waitingForPrototype(this.name)||this.waitingForQueue()||this.waitingForResources()||f.go(this)},_register:function(){c(this.extends)&&!b(this.extends)&&console.warn("%s is attempting to extend %s, an unregistered element or one that was not registered with Polymer.",this.name,this.extends),this.register(this.name,this.extends),this.registered=!0},waitingForPrototype:function(a){return h(a)?void 0:(i(a,this),this.handleNoScript(a),!0)},handleNoScript:function(a){this.hasAttribute("noscript")&&!this.noscript&&(this.noscript=!0,Polymer(a))},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.enqueue(this,this.registerWhenReady,this._register)},loadResources:function(){this._needsResources=!0,this.loadStyles(function(){this._needsResources=!1,this.registerWhenReady()}.bind(this))}});e.publish(e.declaration,j),g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer),function(){var a=document.createElement("polymer-element");a.setAttribute("name","auto-binding"),a.setAttribute("extends","template"),a.init(),Polymer("auto-binding",{createdCallback:function(){this.syntax=this.bindingDelegate=this.makeSyntax(),Polymer.whenPolymerReady(function(){this.model=this,this.setAttribute("bind",""),this.async(function(){this.marshalNodeReferences(this.parentNode),this.fire("template-bound")})}.bind(this))},makeSyntax:function(){var a=Object.create(Polymer.api.declaration.events),b=this;a.findController=function(){return b.model};var c=new PolymerExpressions,d=c.prepareBinding;return c.prepareBinding=function(b,e,f){return a.prepareEventBinding(b,e,f)||d.call(c,b,e,f)},c}})}();
 //# sourceMappingURL=polymer.js.map
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.js.map b/pkg/polymer/lib/src/js/polymer/polymer.js.map
index bd030a6..5d3998a 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.js.map
+++ b/pkg/polymer/lib/src/js/polymer/polymer.js.map
@@ -1 +1 @@
-{"version":3,"file":"polymer.js","sources":["../../polymer-gestures/src/scope.js","../../polymer-gestures/src/targetfind.js","../../polymer-gestures/src/touch-action.js","../../polymer-gestures/src/eventFactory.js","../../polymer-gestures/src/pointermap.js","../../polymer-gestures/src/dispatcher.js","../../polymer-gestures/src/installer.js","../../polymer-gestures/src/mouse.js","../../polymer-gestures/src/touch.js","../../polymer-gestures/src/ms.js","../../polymer-gestures/src/pointer.js","../../polymer-gestures/src/platform-events.js","../../polymer-gestures/src/track.js","../../polymer-gestures/src/hold.js","../../polymer-gestures/src/tap.js","../../polymer-expressions/third_party/esprima/esprima.js","../../polymer-expressions/src/polymer-expressions.js","polymer-versioned.js","../src/boot.js","../src/lib/lang.js","../src/lib/job.js","../src/lib/dom.js","../src/lib/super.js","../src/lib/deserialize.js","../src/api.js","../src/instance/utils.js","../src/instance/events.js","../src/instance/attributes.js","../src/instance/properties.js","../src/instance/mdv.js","../src/instance/base.js","../src/instance/styles.js","../src/declaration/polymer.js","../src/declaration/path.js","../src/declaration/styles.js","../src/declaration/events.js","../src/declaration/properties.js","../src/declaration/attributes.js","../src/declaration/mdv.js","../src/declaration/prototype.js","../src/declaration/queue.js","../src/declaration/import.js","../src/declaration/polymer-element.js","../src/lib/auto-binding.js"],"names":["window","PolymerGestures","hasSDPolyfill","Boolean","ShadowDOMPolyfill","wrap","wrapIfNeeded","a","scope","HAS_FULL_PATH","pathTest","document","createElement","createShadowRoot","sr","s","appendChild","addEventListener","ev","path","stopPropagation","CustomEvent","bubbles","head","dispatchEvent","parentNode","removeChild","target","shadow","inEl","shadowRoot","webkitShadowRoot","canTarget","elementFromPoint","targetingShadow","this","olderShadow","os","olderShadowRoot","se","querySelector","allShadows","element","shadows","push","searchRoot","inRoot","x","y","t","owner","nodeType","Node","DOCUMENT_NODE","DOCUMENT_FRAGMENT_NODE","findTarget","inEvent","clientX","clientY","findScrollAxis","n","i","length","_scrollType","currentTarget","host","LCA","b","contains","adepth","depth","bdepth","d","walk","u","deepContains","common","insideNode","node","rect","getBoundingClientRect","left","right","top","bottom","targetFinding","bind","shadowSelector","v","selector","rule","attrib2css","selectors","styles","hasTouchAction","style","touchAction","hasShadowRoot","forEach","r","String","map","el","textContent","MOUSE_PROPS","MOUSE_DEFAULTS","NOP_FACTORY","eventFactory","preventTap","makeBaseEvent","inType","inDict","e","createEvent","initEvent","cancelable","makeGestureEvent","Object","create","k","keys","makePointerEvent","p","buttons","pressure","pointerId","width","height","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","_source","PointerMap","USE_MAP","m","Map","pointers","POINTERS_FN","values","prototype","size","set","inId","indexOf","has","delete","splice","get","clear","callback","thisArg","call","CLONE_PROPS","CLONE_DEFAULTS","HAS_SVG_INSTANCE","SVGElementInstance","dispatcher","pointermap","eventMap","eventSources","eventSourceList","gestures","gestureQueue","registerSource","name","source","newEvents","events","registerGesture","register","es","l","unregister","down","fireEvent","move","type","fillGestureQueue","up","cancel","tapPrevented","eventHandler","_handledByPG","fn","listen","addEvent","unlisten","removeEvent","eventName","addEventListener_","boundHandler","removeEventListener_","removeEventListener","makeEvent","preventDefault","_target","cloneEvent","eventCopy","correspondingUseElement","clone","gestureTrigger","g","j","requestAnimationFrame","boundGestureTrigger","root","Installer","add","remove","changed","binder","addCallback","removeCallback","changedCallback","MO","observer","mutationWatcher","Array","toArray","slice","filter","MutationObserver","WebKitMutationObserver","SELECTOR","OBSERVER_INIT","subtree","childList","attributes","attributeOldValue","attributeFilter","watchSubtree","observe","enableOnSubtree","readyState","installOnLoad","installNewSubtree","findElements","addElement","querySelectorAll","removeElement","elementChanged","oldValue","concatLists","accum","list","concat","isElement","ELEMENT_NODE","flattenMutationTree","inNodes","tree","reduce","mutations","mutationHandler","added","addedNodes","removed","removedNodes","console","warn","DEDUP_DIST","WHICH_TO_BUTTONS","HAS_BUTTONS","MouseEvent","mouseEvents","POINTER_ID","POINTER_TYPE","lastTouches","isEventSimulatedFromTouch","lts","dx","Math","abs","dy","prepareEvent","which","mousedown","mouseup","mousemove","relatedTarget","cleanupMouse","INSTALLER","DEDUP_TIMEOUT","CLICK_COUNT_TIMEOUT","HYSTERESIS","ATTRIB","CAN_USE_GLOBAL","touchEvents","elementAdded","getAttribute","st","touchActionToScrollType","elementRemoved","undefined","oldSt","scrollTypes","EMITTER","XSCROLLER","YSCROLLER","SCROLLER","exec","firstTouch","isPrimaryTouch","inTouch","identifier","setPrimaryTouch","firstXY","X","Y","scrolling","cancelResetClickCount","removePrimaryPointer","inPointer","resetClickCount","clickCount","resetId","setTimeout","clearTimeout","typeToButtons","ret","touch","id","currentTouchEvent","fastPath","touchToPointer","cte","detail","webkitRadiusX","radiusX","webkitRadiusY","radiusY","webkitForce","force","self","processTouches","inFunction","tl","changedTouches","_cancel","cleanUpPointer","shouldScroll","scrollAxis","oa","da","doa","findTouch","inTL","vacuumTouches","touches","value","key","touchstart","dedupSynthMouse","touchmove","dd","sqrt","touchcancel","touchend","lt","HAS_BITMAP_TYPE","MSPointerEvent","MSPOINTER_TYPE_MOUSE","msEvents","POINTER_TYPES","cleanup","MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel","pointerEvents","pointerdown","pointermove","pointerup","pointercancel","PointerEvent","navigator","msPointerEnabled","ontouchstart","track","WIGGLE_THRESHOLD","clampDir","inDelta","calcPositionDelta","inA","inB","pageX","pageY","fireTrack","inTrackingData","downEvent","lastMoveEvent","xDirection","yDirection","ddx","ddy","screenX","screenY","trackInfo","downTarget","tracking","hold","HOLD_DELAY","heldPointer","holdJob","pulse","Date","now","timeStamp","held","fireHold","clearInterval","setInterval","inHoldTime","holdTime","tap","shouldTap","downState","start","altKey","ctrlKey","metaKey","shiftKey","global","assert","condition","message","Error","isDecimalDigit","ch","isWhiteSpace","fromCharCode","isLineTerminator","isIdentifierStart","isIdentifierPart","isKeyword","skipWhitespace","index","charCodeAt","getIdentifier","scanIdentifier","Token","Identifier","Keyword","NullLiteral","BooleanLiteral","range","scanPunctuator","code2","ch2","code","ch1","Punctuator","throwError","Messages","UnexpectedToken","scanNumericLiteral","number","NumericLiteral","parseFloat","scanStringLiteral","quote","str","octal","StringLiteral","isIdentifierName","token","advance","EOF","lex","lookahead","peek","pos","messageFormat","error","args","arguments","msg","replace","whole","description","throwUnexpected","expect","match","matchKeyword","keyword","parseArrayInitialiser","elements","parseExpression","delegate","createArrayExpression","parseObjectPropertyKey","createLiteral","createIdentifier","parseObjectProperty","createProperty","parseObjectInitialiser","properties","createObjectExpression","parseGroupExpression","expr","parsePrimaryExpression","createThisExpression","parseArguments","parseNonComputedProperty","parseNonComputedMember","parseComputedMember","parseLeftHandSideExpression","property","createMemberExpression","createCallExpression","parseUnaryExpression","parsePostfixExpression","createUnaryExpression","binaryPrecedence","prec","parseBinaryExpression","stack","operator","pop","createBinaryExpression","parseConditionalExpression","consequent","alternate","createConditionalExpression","parseFilter","createFilter","parseFilters","parseTopLevel","Syntax","parseInExpression","parseAsExpression","createTopLevel","createAsExpression","indexName","createInExpression","parse","inDelegate","state","labelSet","TokenName","ArrayExpression","BinaryExpression","CallExpression","ConditionalExpression","EmptyStatement","ExpressionStatement","Literal","LabeledStatement","LogicalExpression","MemberExpression","ObjectExpression","Program","Property","ThisExpression","UnaryExpression","UnknownLabel","Redeclaration","esprima","prepareBinding","expressionText","filterRegistry","expression","getExpression","scopeIdent","tagName","ex","model","oneTime","binding","getBinding","polymerExpressionScopeIdent_","indexIdent","polymerExpressionIndexIdent_","expressionParseCache","ASTDelegate","Expression","valueFn_","IdentPath","Path","object","accessor","computed","dynamicDeps","simplePath","getFn","Filter","notImplemented","arg","valueFn","filters","deps","currentPath","ConstantObservable","value_","convertStylePropertyName","c","toLowerCase","findScope","prop","parentScopeName","hasOwnProperty","isLiteralExpression","pathString","isNaN","Number","PolymerExpressions","addPath","getValueFrom","setValue","newValue","setValueFrom",{"end":{"file":"../../polymer-expressions/src/polymer-expressions.js","comments_before":[],"nlb":false,"endpos":3539,"pos":3531,"col":8,"line":117,"value":"fullPath","type":"name"},"start":{"file":"../../polymer-expressions/src/polymer-expressions.js","comments_before":[],"nlb":false,"endpos":3539,"pos":3531,"col":8,"line":117,"value":"fullPath","type":"name"},"name":"fullPath"},"fullPath","fullPath_","parts","context","propName","transform","toModelDirection","initialArgs","toModel","toDOM","apply","unaryOperators","+","-","!","binaryOperators","*","/","%","<",">","<=",">=","==","!=","===","!==","&&","||","op","argument","test","ident","arr","kind","obj","open","discardChanges","deliver","close","firstTime","firstValue","startReset","getValue","finishReset","setValueFn","CompoundObserver","ObserverTransform","count","random","toString","styleObject","join","tokenList","tokens","prepareInstancePositionChanged","template","templateInstance","valid","PathObserver","prepareInstanceModel","scopeName","parentScope","createScopeObject","__proto__","defineProperty","configurable","writable","Polymer","version","extend","api","getOwnPropertyNames","pd","getOwnPropertyDescriptor","nom","job","wait","stop","Job","go","inContext","boundComplete","complete","h","handle","cancelAnimationFrame","registry","HTMLElement","tag","getPrototypeForTag","getPrototypeOf","originalStopPropagation","Event","cancelBubble","$super","arrayOfArgs","caller","_super","nameInThis","memoizeSuper","n$","method","proto","nextSuper","super","deserializeValue","currentValue","inferredType","typeHandlers","string","date","boolean","parseInt","JSON","function","declaration","instance","publish","apis","utils","async","timeout","Platform","flush","cancelAsync","fire","onNode","event","asyncFire","classFollows","anew","old","className","classList","injectBoundHTML","html","innerHTML","fragment","instanceTemplate","nop","nob","asyncMethod","log","logFlags","EVENT_PREFIX","addHostListeners","eventDelegates","localName","methodName","getEventHandler","dispatchMethod","group","groupEnd","copyInstanceAttributes","a$","_instanceAttributes","hasAttribute","setAttribute","takeAttributes","_publishLC","attributeToProperty","propertyForAttribute","search","bindPattern","stringValue","serializeValue","reflectPropertyToAttribute","serializedValue","removeAttribute","areSameValue","numberIsNaN","resolveBindingValue","updateRecord","createPropertyObserver","_observeNames","o","_propertyObserver","registerObserver","observeArrayValue","openPropertyObserver","notifyPropertyChanges","newValues","oldValues","paths","called","ov","nv","invokeMethod","deliverChanges","propertyChanged_","reflect","callbackName","isArray","closeNamedObserver","ArrayObserver","registerNamedObserver","emitPropertyChangeRecord","Observer","hasObjectObserve","notifier","notifier_","getNotifier","notify","bindToAccessor","observable","resolveFn","privateName","privateObservable","resolvedValue","createComputedProperties","_computedNames","syntax","bindProperty","_observers","closeObservers","observers","o$","_namedObservers","closeNamedObservers","mdv","bindingDelegate","dom","createInstance","bindings_","enableBindingsReflection","path_","_recordBinding","mixinSuper","bindFinished","makeElementReady","asyncUnbindAll","_unbound","unbind","_unbindAllJob","unbindAll","cancelUnbindAll","mustachePattern","isBase","PolymerBase","base","created","ready","createdCallback","prepareElement","ownerDocument","isStagingDocument","_elementPrepared","shadowRoots","_readied","parseDeclarations","attachedCallback","attached","enteredView","hasBeenAttached","domReady","detachedCallback","preventDispose","detached","leftView","enteredViewCallback","leftViewCallback","enteredDocumentCallback","leftDocumentCallback","parseDeclaration","elementElement","fetchTemplate","shadowFromTemplate","shadowRootReady","lightFromTemplate","refNode","eventController","insertBefore","marshalNodeReferences","$","attributeChangedCallback","attributeChanged","onMutation","listener","disconnect","constructor","Base","shimCssText","cssText","is","ShadowCSS","makeScopeSelector","STYLE_SCOPE_ATTRIBUTE","STYLE_CONTROLLER_SCOPE","installControllerStyles","findStyleScope","scopeHasNamedStyle","cssTextForScope","installScopeCssText","installScopeStyle","cssTextToScopeStyle","applyStyleToScope","_scopeStyles","script","_currentScript","getRegisteredPrototype","registerPrototype","notifyPrototype","waitingForPrototype","client","waitPrototype","registerWhenReady","prototypesByName","declarations","deliverDeclarations","resolveElementPaths","urlResolver","resolveDom","addResolvePathApi","assetPath","URL","baseURI","resolvePath","urlPath","href","importRuleForSheet","sheet","baseUrl","createStyleElement","attr","firstElementChild","s$","nextElementSibling","cssTextFromSheet","__resource","matchesSelector","inSelector","matches","STYLE_SELECTOR","STYLE_LOADABLE_MATCH","SHEET_SELECTOR","STYLE_GLOBAL_SCOPE","SCOPE_ATTR","loadStyles","content","templateContent","convertSheetsToStyles","findLoadableStyles","templateUrl","styleResolver","copySheetAttributes","replaceChild","link","loadables","installSheets","cacheSheets","cacheStyles","installLocalSheets","installGlobalStyles","sheets","findNodes","firstChild","matcher","nodes","array","templateNodes","styleForScope","scopeDescriptor","webkitMatchesSelector","mozMatchesSelector","mixedCaseEventTypes","parseHostEvents","delegates","addAttributeDelegates","hasEventPrefix","removeEventPrefix","trim","prefixLength","findController","controller","prepareEventBinding","eventType","bindingValue","handler","inferObservers","explodeObservers","exploded","ni","names","split","optimizePropertyMaps","_publishNames","publishProperties","requireProperties","lowerCaseMap","propertyDescriptors","propertyDescriptor","reflects","reflectHintForDescriptor","valueForDescriptor","createPropertyAccessor","createPropertyAccessors","ATTRIBUTES_ATTRIBUTE","ATTRIBUTES_REGEX","inheritAttributesObjects","inheritObject","publishAttributes","hasValue","accumulateInstanceAttributes","clonable","isInstanceAttribute","blackList","extends","noscript","assetpath","cache-csstext","installBindingDelegate","ensurePrototypeTraversal","ancestor","extendeeName","buildPrototype","publishConstructor","extension","generateBasePrototype","desugarBeforeChaining","chainPrototypes","desugarAfterChaining","inheritMetaData","chained","chainObject","extendee","shimStyling","registerCallback","symbol","ctor","extnds","findBasePrototype","ensureBaseApi","memoizedBases","extended","mixinMethod","info","typeExtension","findTypeExtension","registerElement","inherited","queueForElement","mainQueue","importQueue","nextQueued","whenPolymerReady","queue","waitToReady","CustomElements","HTMLImports","whenImportsReady","addReadyCallback","check","shouldAdd","flushQueue","__check","__go","useNative","readied","addToFlushQueue","shift","nextElement","canReady","isEmpty","upgradeDocumentTree","flushReadyCallbacks","readyCallbacks","importElements","elementOrFragment","importUrls","urls","url","frag","createDocumentFragment","rel","import","isRegistered","isCustomTag","init","loadResources","registered","waitingForQueue","waitingForResources","_register","handleNoScript","_needsResources","body","makeSyntax"],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {\n  hasSDPolyfill: Boolean(window.ShadowDOMPolyfill)\n};\nPolymerGestures.wrap = PolymerGestures.hasSDPolyfill ? ShadowDOMPolyfill.wrapIfNeeded : function(a){ return a; };\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (!scope.hasSDPolyfill && pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findScrollAxis: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n        }\n      } else {\n        n = scope.wrap(inEvent.currentTarget);\n        while(n) {\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n","/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'body /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    },\n    'manipulation'\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var head = document.head;\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      e._source = inDict._source || '';\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  var hasSDPolyfill = scope.hasSDPolyfill;\n  var wrap = scope.wrap;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      this.gestures.push(source);\n    },\n    register: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.addEventListener_(eventName, this.boundHandler);\n      } else {\n        target.addEventListener(eventName, this.boundHandler);\n      }\n    },\n    removeEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.removeEventListener_(eventName, this.boundHandler);\n      } else {\n        target.removeEventListener(eventName, this.boundHandler);\n      }\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n          eventCopy[p] = wrap(eventCopy[p]);\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = inEvent.preventDefault;\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          g = this.gestures[j];\n          fn = g[e.type];\n          if (fn) {\n            fn.call(g, e);\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = function(root) {\n    dispatcher.register(root);\n  };\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n  scope.wrap = wrap;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module uses Mutation Observers to dynamically adjust which nodes will\n * generate Pointer Events.\n *\n * All nodes that wish to generate Pointer Events must have the attribute\n * `touch-action` set to `none`.\n */\n(function(scope) {\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  var map = Array.prototype.map.call.bind(Array.prototype.map);\n  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n  var MO = window.MutationObserver || window.WebKitMutationObserver;\n  var SELECTOR = '[touch-action]';\n  var OBSERVER_INIT = {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeOldValue: true,\n    attributeFilter: ['touch-action']\n  };\n\n  function Installer(add, remove, changed, binder) {\n    this.addCallback = add.bind(binder);\n    this.removeCallback = remove.bind(binder);\n    this.changedCallback = changed.bind(binder);\n    if (MO) {\n      this.observer = new MO(this.mutationWatcher.bind(this));\n    }\n  }\n\n  Installer.prototype = {\n    watchSubtree: function(target) {\n      // Only watch scopes that can target find, as these are top-level.\n      // Otherwise we can see duplicate additions and removals that add noise.\n      //\n      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n      // a removal without an insertion when a node is redistributed among\n      // shadows. Since it all ends up correct in the document, watching only\n      // the document will yield the correct mutations to watch.\n      if (scope.targetFinding.canTarget(target)) {\n        this.observer.observe(target, OBSERVER_INIT);\n      }\n    },\n    enableOnSubtree: function(target) {\n      this.watchSubtree(target);\n      if (target === document && document.readyState !== 'complete') {\n        this.installOnLoad();\n      } else {\n        this.installNewSubtree(target);\n      }\n    },\n    installNewSubtree: function(target) {\n      forEach(this.findElements(target), this.addElement, this);\n    },\n    findElements: function(target) {\n      if (target.querySelectorAll) {\n        return target.querySelectorAll(SELECTOR);\n      }\n      return [];\n    },\n    removeElement: function(el) {\n      this.removeCallback(el);\n    },\n    addElement: function(el) {\n      this.addCallback(el);\n    },\n    elementChanged: function(el, oldValue) {\n      this.changedCallback(el, oldValue);\n    },\n    concatLists: function(accum, list) {\n      return accum.concat(toArray(list));\n    },\n    // register all touch-action = none nodes on document load\n    installOnLoad: function() {\n      document.addEventListener('readystatechange', function() {\n        if (document.readyState === 'complete') {\n          this.installNewSubtree(document);\n        }\n      }.bind(this));\n    },\n    isElement: function(n) {\n      return n.nodeType === Node.ELEMENT_NODE;\n    },\n    flattenMutationTree: function(inNodes) {\n      // find children with touch-action\n      var tree = map(inNodes, this.findElements, this);\n      // make sure the added nodes are accounted for\n      tree.push(filter(inNodes, this.isElement));\n      // flatten the list\n      return tree.reduce(this.concatLists, []);\n    },\n    mutationWatcher: function(mutations) {\n      mutations.forEach(this.mutationHandler, this);\n    },\n    mutationHandler: function(m) {\n      if (m.type === 'childList') {\n        var added = this.flattenMutationTree(m.addedNodes);\n        added.forEach(this.addElement, this);\n        var removed = this.flattenMutationTree(m.removedNodes);\n        removed.forEach(this.removeElement, this);\n      } else if (m.type === 'attributes') {\n        this.elementChanged(m.target, m.oldValue);\n      }\n    }\n  };\n\n  if (!MO) {\n    Installer.prototype.watchSubtree = function(){\n      console.warn('PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.wrap(scope.findTarget(inEvent));\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  var INSTALLER;\n  // maybe one day...\n  // var CAN_USE_GLOBAL = ATTRIB in document.head.style;\n  var CAN_USE_GLOBAL = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        el._scrollType = st;\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      el._scrollType = undefined;\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        s._scrollType = undefined;\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        el._scrollType = st;\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto|manipulation$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = null;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        if (this.isPrimaryTouch(touch)) {\n          var fastPath = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            path: this.currentTouchEvent.path,\n            target: scope.wrap(this.currentTouchEvent.target)\n          };\n          return scope.findTarget(fastPath);\n        } else {\n          return scope.findTarget(touch);\n        }\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = scope.wrap(this.findTarget(inTouch, id));\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'touch';\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t, p; i < tl.length; i++) {\n        t = tl[i];\n        p = this.touchToPointer(t);\n        if (inEvent.type === 'touchstart') {\n          pointermap.set(p.pointerId, p.target);\n        }\n        if (pointermap.has(p.pointerId)) {\n          inFunction.call(this, p);\n        }\n        if (inEvent.type === 'touchend' || inEvent._cancel) {\n          this.cleanUpPointer(p);\n        }\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var scrollAxis = scope.targetFinding.findScrollAxis(inEvent);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(function(p) {\n          this.cancel(p);\n          pointermap.delete(p.pointerId);\n        });\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (CAN_USE_GLOBAL) {\n        this.processTouches(inEvent, this.move);\n      } else {\n        if (!this.scrolling) {\n          if (this.scrolling === null && this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n          } else {\n            this.scrolling = false;\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        } else if (this.firstXY) {\n          var t = inEvent.changedTouches[0];\n          var dx = t.clientX - this.firstXY.X;\n          var dy = t.clientY - this.firstXY.Y;\n          var dd = Math.sqrt(dx * dx + dy * dy);\n          if (dd >= HYSTERESIS) {\n            this.touchcancel(inEvent);\n            this.scrolling = true;\n            this.firstXY = null;\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      inPointer.relatedTarget = scope.wrap(scope.findTarget(inPointer));\n      dispatcher.up(inPointer);\n    },\n    cancel: function(inPointer) {\n      dispatcher.cancel(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      inEvent._cancel = true;\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  if (!CAN_USE_GLOBAL) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (window.navigator.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n    }\n  }\n\n  dispatcher.register(document);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var e = eventFactory.makeGestureEvent(inType, {\n         bubbles: true,\n         cancelable: true,\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         x: inEvent.x,\n         y: inEvent.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       });\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class release\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY,\n        _source: 'hold'\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey,\n            _source: 'tap'\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n","/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, args, property;\n\n        expr = parsePrimaryExpression();\n\n        while (true) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else if (match('.')) {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            } else if (match('(')) {\n                args = parseArguments();\n                expr = delegate.createCallExpression(expr, args);\n            } else {\n                break;\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.computed = accessor == '[';\n\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (this.computed && !(property instanceof Literal));\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        (property instanceof IdentPath || property instanceof Literal) &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = !this.computed || this.simplePath ?\n        property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n\n        var parts = this.object instanceof MemberExpression ?\n            this.object.fullPath.slice() : [this.object.name];\n        parts.push(this.property instanceof IdentPath ?\n            this.property.name : this.property.value);\n        this.fullPath_ = Path.get(parts);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (!this.computed) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n            var propName = property(model, observer, filterRegistry);\n            if (observer)\n              observer.addPath(context, [propName]);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(model, observer, filterRegistry, toModelDirection,\n                        initialArgs) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find function or filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('Cannot find function or filter: ' + this.name);\n        return;\n      }\n\n      var args = initialArgs || [];\n      for (var i = 0; i < this.args.length; i++) {\n        args.push(getFn(this.args[i])(model, observer, filterRegistry));\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer, filterRegistry) {\n        return unaryOperators[op](argument(model, observer, filterRegistry));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      return function(model, observer, filterRegistry) {\n        return binaryOperators[op](left(model, observer, filterRegistry),\n                                   right(model, observer, filterRegistry));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      return function(model, observer, filterRegistry) {\n        return test(model, observer, filterRegistry) ?\n            consequent(model, observer, filterRegistry) :\n            alternate(model, observer, filterRegistry);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createCallExpression: function(expression, args) {\n      if (!(expression instanceof IdentPath))\n        throw Error('Only identifier function invocations are allowed');\n\n      var filter = new Filter(expression.name, args);\n\n      return function(model, observer, filterRegistry) {\n        return filter.transform(model, observer, filterRegistry, false);\n      };\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer, filterRegistry) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer, filterRegistry));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer, filterRegistry) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] =\n              properties[i].value(model, observer, filterRegistry);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer, filterRegistry);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(model, observer, filterRegistry,\n            false, [value]);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(model, undefined,\n            filterRegistry, true, [newValue]);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        return createScopeObject(parentScope, model, scopeName, indexName);\n      };\n    }\n  };\n\n  var createScopeObject = ('__proto__' in {}) ?\n    function(parentScope, model, scopeName, indexName) {\n      var scope = {};\n      scope[scopeName] = model;\n      scope[indexName] = undefined;\n      scope[parentScopeName] = parentScope;\n      scope.__proto__ = parentScope;\n      return scope;\n    } :\n    function(parentScope, model, scopeName, indexName) {\n      var scope = Object.create(parentScope);\n      Object.defineProperty(scope, scopeName,\n          { value: model, configurable: true, writable: true });\n      Object.defineProperty(scope, indexName,\n          { value: undefined, configurable: true, writable: true });\n      Object.defineProperty(scope, parentScopeName,\n          { value: parentScope, configurable: true, writable: true });\n      return scope;\n    };\n\n  global.PolymerExpressions = PolymerExpressions;\n  PolymerExpressions.getExpression = getExpression;\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.3.3-0e73963'\n};\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n  \n  // exports\n\n  scope.extend = extend;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var registry = {};\n\n  HTMLElement.register = function(tag, prototype) {\n    registry[tag] = prototype;\n  }\n\n  // get prototype mapped to node <tag>\n  HTMLElement.getPrototypeForTag = function(tag) {\n    var prototype = !tag ? HTMLElement.prototype : registry[tag];\n    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects\n    return prototype || Object.getPrototypeOf(document.createElement(tag));\n  };\n\n  // we have to flag propagation stoppage for the event dispatcher\n  var originalStopPropagation = Event.prototype.stopPropagation;\n  Event.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n    originalStopPropagation.apply(this, arguments);\n  };\n  \n  // TODO(sorvell): remove when we're sure imports does not need\n  // to load stylesheets\n  /*\n  HTMLImports.importer.preloadSelectors += \n      ', polymer-element link[rel=stylesheet]';\n  */\n})(Polymer);\n","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n (function(scope) {\r\n    // super\r\n\r\n    // `arrayOfArgs` is an optional array of args like one might pass\r\n    // to `Function.apply`\r\n\r\n    // TODO(sjmiles):\r\n    //    $super must be installed on an instance or prototype chain\r\n    //    as `super`, and invoked via `this`, e.g.\r\n    //      `this.super();`\r\n\r\n    //    will not work if function objects are not unique, for example,\r\n    //    when using mixins.\r\n    //    The memoization strategy assumes each function exists on only one \r\n    //    prototype chain i.e. we use the function object for memoizing)\r\n    //    perhaps we can bookkeep on the prototype itself instead\r\n    function $super(arrayOfArgs) {\r\n      // since we are thunking a method call, performance is important here: \r\n      // memoize all lookups, once memoized the fast path calls no other \r\n      // functions\r\n      //\r\n      // find the caller (cannot be `strict` because of 'caller')\r\n      var caller = $super.caller;\r\n      // memoized 'name of method' \r\n      var nom = caller.nom;\r\n      // memoized next implementation prototype\r\n      var _super = caller._super;\r\n      if (!_super) {\r\n        if (!nom) {\r\n          nom = caller.nom = nameInThis.call(this, caller);\r\n        }\r\n        if (!nom) {\r\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\r\n        }\r\n        // super prototype is either cached or we have to find it\r\n        // by searching __proto__ (at the 'top')\r\n        // invariant: because we cache _super on fn below, we never reach \r\n        // here from inside a series of calls to super(), so it's ok to \r\n        // start searching from the prototype of 'this' (at the 'top')\r\n        // we must never memoize a null super for this reason\r\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\r\n      }\r\n      // our super function\r\n      var fn = _super[nom];\r\n      if (fn) {\r\n        // memoize information so 'fn' can call 'super'\r\n        if (!fn._super) {\r\n          // must not memoize null, or we lose our invariant above\r\n          memoizeSuper(fn, nom, _super);\r\n        }\r\n        // invoke the inherited method\r\n        // if 'fn' is not function valued, this will throw\r\n        return fn.apply(this, arrayOfArgs || []);\r\n      }\r\n    }\r\n\r\n    function nameInThis(value) {\r\n      var p = this.__proto__;\r\n      while (p && p !== HTMLElement.prototype) {\r\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\r\n        var n$ = Object.getOwnPropertyNames(p);\r\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\r\n          var d = Object.getOwnPropertyDescriptor(p, n);\r\n          if (typeof d.value === 'function' && d.value === value) {\r\n            return n;\r\n          }\r\n        }\r\n        p = p.__proto__;\r\n      }\r\n    }\r\n\r\n    function memoizeSuper(method, name, proto) {\r\n      // find and cache next prototype containing `name`\r\n      // we need the prototype so we can do another lookup\r\n      // from here\r\n      var s = nextSuper(proto, name, method);\r\n      if (s[name]) {\r\n        // `s` is a prototype, the actual method is `s[name]`\r\n        // tag super method with it's name for quicker lookups\r\n        s[name].nom = name;\r\n      }\r\n      return method._super = s;\r\n    }\r\n\r\n    function nextSuper(proto, name, caller) {\r\n      // look for an inherited prototype that implements name\r\n      while (proto) {\r\n        if ((proto[name] !== caller) && proto[name]) {\r\n          return proto;\r\n        }\r\n        proto = getPrototypeOf(proto);\r\n      }\r\n      // must not return null, or we lose our invariant above\r\n      // in this case, a super() call was invoked where no superclass\r\n      // method exists\r\n      // TODO(sjmiles): thow an exception?\r\n      return Object;\r\n    }\r\n\r\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \r\n    // __proto__. Therefore, always get prototype via __proto__ instead of\r\n    // the more standard Object.getPrototypeOf.\r\n    function getPrototypeOf(prototype) {\r\n      return prototype.__proto__;\r\n    }\r\n\r\n    // utility function to precompute name tags for functions\r\n    // in a (unchained) prototype\r\n    function hintSuper(prototype) {\r\n      // tag functions with their prototype name to optimize\r\n      // super call invocations\r\n      for (var n in prototype) {\r\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\r\n        if (pd && typeof pd.value === 'function') {\r\n          pd.value.nom = n;\r\n        }\r\n      }\r\n    }\r\n\r\n    // exports\r\n\r\n    scope.super = $super;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var typeHandlers = {\n    string: function(value) {\n      return value;\n    },\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  };\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail || {};\n      var event = new CustomEvent(type, {\n        bubbles: (bubbles !== undefined ? bubbles : true), \n        cancelable: (cancelable !== undefined ? cancelable : true), \n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist.\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      * @param String html to inject\n      * @param Element target element\n      */\n    injectBoundHTML: function(html, element) {\n      var template = document.createElement('template');\n      template.innerHTML = html;\n      var fragment = this.instanceTemplate(template);\n      if (element) {\n        element.textContent = '';\n        element.appendChild(fragment);\n      }\n      return fragment;\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        this.addEventListener(type, this.element.getEventHandler(this, this,\n                                                                 methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n})(Polymer);\n","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    copyInstanceAttributes: function () {\r\n      var a$ = this._instanceAttributes;\r\n      for (var k in a$) {\r\n        if (!this.hasAttribute(k)) {\r\n          this.setAttribute(k, a$[k]);\r\n        }\r\n      }\r\n    },\r\n    // for each attribute on this, deserialize value to property as needed\r\n    takeAttributes: function() {\r\n      // if we have no publish lookup table, we have no attributes to take\r\n      // TODO(sjmiles): ad hoc\r\n      if (this._publishLC) {\r\n        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\r\n          this.attributeToProperty(a.name, a.value);\r\n        }\r\n      }\r\n    },\r\n    // if attribute 'name' is mapped to a property, deserialize\r\n    // 'value' into that property\r\n    attributeToProperty: function(name, value) {\r\n      // try to match this attribute to a property (attributes are\r\n      // all lower-case, so this is case-insensitive search)\r\n      var name = this.propertyForAttribute(name);\r\n      if (name) {\r\n        // filter out 'mustached' values, these are to be\r\n        // replaced with bound-data and are not yet values\r\n        // themselves\r\n        if (value && value.search(scope.bindPattern) >= 0) {\r\n          return;\r\n        }\r\n        // get original value\r\n        var currentValue = this[name];\r\n        // deserialize Boolean or Number values from attribute\r\n        var value = this.deserializeValue(value, currentValue);\r\n        // only act if the value has changed\r\n        if (value !== currentValue) {\r\n          // install new value (has side-effects)\r\n          this[name] = value;\r\n        }\r\n      }\r\n    },\r\n    // return the published property matching name, or undefined\r\n    propertyForAttribute: function(name) {\r\n      var match = this._publishLC && this._publishLC[name];\r\n      //console.log('propertyForAttribute:', name, 'matches', match);\r\n      return match;\r\n    },\r\n    // convert representation of 'stringValue' based on type of 'currentValue'\r\n    deserializeValue: function(stringValue, currentValue) {\r\n      return scope.deserializeValue(stringValue, currentValue);\r\n    },\r\n    serializeValue: function(value, inferredType) {\r\n      if (inferredType === 'boolean') {\r\n        return value ? '' : undefined;\r\n      } else if (inferredType !== 'object' && inferredType !== 'function'\r\n          && value !== undefined) {\r\n        return value;\r\n      }\r\n    },\r\n    reflectPropertyToAttribute: function(name) {\r\n      var inferredType = typeof this[name];\r\n      // try to intelligently serialize property value\r\n      var serializedValue = this.serializeValue(this[name], inferredType);\r\n      // boolean properties must reflect as boolean attributes\r\n      if (serializedValue !== undefined) {\r\n        this.setAttribute(name, serializedValue);\r\n        // TODO(sorvell): we should remove attr for all properties\r\n        // that have undefined serialization; however, we will need to\r\n        // refine the attr reflection system to achieve this; pica, for example,\r\n        // relies on having inferredType object properties not removed as\r\n        // attrs.\r\n      } else if (inferredType === 'boolean') {\r\n        this.removeAttribute(name);\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.instance.attributes = attributes;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  var numberIsNaN = Number.isNaN || function(value) {\n    return typeof value === 'number' && isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObserver(o);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without\n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n\n      var self = this;\n      var value = observable.open(function(value, oldValue) {\n        self[privateName] = value;\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      });\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      this[privateName] = value;\n      this.emitPropertyChangeRecord(name, value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      var observers = dom.bindings_;\n      for (var i = 0; i < observers.length; i++) {\n        this.registerObserver(observers[i]);\n      }\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this._recordBinding(property, observer);\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected\n      // https://github.com/Polymer/ShadowDOM/issues/420\n      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      // TODO (sorvell): temporarily open observer when created\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n      // TODO (sorvell): temporarily open observer when created\n      // turn on property observation and take any initial changes\n      //this.openPropertyObserver();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants,\n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants\n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);\n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n      // set up polymer gestures\n      PolymerGestures.register(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n\n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  \n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (window.ShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      scope._scopeStyles[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      scope._scopeStyles = scope._scopeStyles || {};\n      return scope._scopeStyles[name];\n    }\n  };\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'string') {\n      prototype = name;\n      var script = document._currentScript;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  var declarations = Platform.deliverDeclarations();\n  if (declarations) {\n    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n      element.apply(null, d);\n    }\n  }\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Platform.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return Platform.styleResolver.loadStyles(styles, templateUrl, callback);\n        }\n      }\n      if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (window.ShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var events = {\n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    },\n    findController: function(node) {\n      while (node.parentNode) {\n        if (node.eventController) {\n          return node.eventController;\n        }\n        node = node.parentNode;\n      }\n      return node.host;\n    },\n    getEventHandler: function(controller, target, method) {\n      var events = this;\n      return function(e) {\n        if (!controller || !controller.PolymerBase) {\n          controller = events.findController(target);\n        }\n\n        var args = [e, e.detail, e.currentTarget];\n        controller.dispatchMethod(controller, method, args);\n      };\n    },\n    prepareEventBinding: function(pathString, name, node) {\n      if (!this.hasEventPrefix(name))\n        return;\n\n      var eventType = this.removeEventPrefix(name);\n      eventType = mixedCaseEventTypes[eventType] || eventType;\n\n      var events = this;\n\n      return function(model, node, oneTime) {\n        var handler = events.getEventHandler(undefined, node, pathString);\n        node.addEventListener(eventType, handler);\n\n        if (oneTime)\n          return;\n\n        // TODO(rafaelw): This is really pointless work. Aside from the cost\n        // of these allocations, NodeBind is going to setAttribute back to its\n        // current value. Fixing this would mean changing the TemplateBinding\n        // binding delegate API.\n        function bindingValue() {\n          return '{{ ' + pathString + ' }}';\n        }\n\n        return {\n          open: bindingValue,\n          discardChanges: bindingValue,\n          close: function() {\n            node.removeEventListener(eventType, handler);\n          }\n        };\n      };\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n      if (prototype.computed) {\n        // construct name list\n        var a = prototype._computedNames = [];\n        for (var n in prototype.computed) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    // sync prototype to property descriptors;\n    // desriptor format contains default value and optionally a\n    // hint for reflecting the property to an attribute.\n    // e.g. {foo: 5, bar: {value: true, reflect: true}}\n    // reflect: {foo: true} is also supported\n    //\n    requireProperties: function(propertyDescriptors, prototype, base) {\n      // reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyDescriptors) {\n        var propertyDescriptor = propertyDescriptors[n];\n        var reflects = this.reflectHintForDescriptor(propertyDescriptor);\n        if (prototype.reflect[n] === undefined && reflects !== undefined) {\n          prototype.reflect[n] = reflects;\n        }\n        if (prototype[n] === undefined) {\n          prototype[n] = this.valueForDescriptor(propertyDescriptor);\n        }\n      }\n    },\n    valueForDescriptor: function(propertyDescriptor) {\n      var value = typeof propertyDescriptor === 'object' &&\n          propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;\n      return value !== undefined ? value : null;\n    },\n    // returns the value of the descriptor's 'reflect' property or undefined\n    reflectHintForDescriptor: function(propertyDescriptor) {\n      if (typeof propertyDescriptor === 'object' &&\n          propertyDescriptor && propertyDescriptor.reflect !== undefined) {\n        return propertyDescriptor.reflect;\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\n        var publish = prototype.publish || (prototype.publish = {});\n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // if the user hasn't specified a value, we want to use the\n          // default, unless a superclass has already chosen one\n          if (n && publish[n] === undefined) {\n            // TODO(sjmiles): querying native properties on IE11 (and possibly\n            // on other browsers) throws an exception because there is no actual\n            // instance.\n            // In fact, trying to publish native properties is known bad for this\n            // and other reasons, and we need to solve this problem writ large.\n            try {\n              var hasValue = (base[n] !== undefined);\n            } catch(x) {\n              hasValue = false;\n            }\n            // supply an empty 'descriptor' object and let the publishProperties\n            // code determine a default\n            if (!hasValue) {\n              publish[n] = Polymer.nob;\n            }\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && Platform.templateContent(template);\n    },\n    installBindingDelegate: function(template) {\n      if (template) {\n        template.bindingDelegate = this.syntax;\n      }\n    }\n  };\n\n  // exports\n  scope.api.declaration.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (window.ShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n    // tell the queue to wait for an element to be ready\n    wait: function(element, check, go) {\n      var shouldAdd = (this.indexOf(element) === -1 && \n          flushQueue.indexOf(element) === -1);\n      if (shouldAdd) {\n        this.add(element);\n        element.__check = check;\n        element.__go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n    add: function(element) {\n      //console.log('queueing', element.name);\n      queueForElement(element).push(element);\n    },\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n    nextElement: function() {\n      return nextQueued();\n    },\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n    isEmpty: function() {\n      return !importQueue.length && !mainQueue.length;\n    },\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n    flush: function() {\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__go.call(element);\n        element.__check = element.__go = null;\n      }\n    },\n    ready: function() {\n      this.flush();\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n    waitToReady: true\n  };\n\n  var flushQueue = [];\n\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.queue = queue;\n  scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenPolymerReady = scope.whenPolymerReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      // TODO(sorvell): ends up calling '_register' by virtue\n      // of `waitingForQueue` (see below)\n      queue.go(this);\n    },\n\n    // TODO(sorvell): refactor, this method is private-ish, but it's being\n    // called by the queue object.\n    _register: function() {\n      //console.log('registering', this.name);\n      //console.group('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n      //console.groupEnd();\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // TODO(sorvell): CustomElements polyfill awareness:\n        // noscript elements should upgrade in logical order\n        // script injection ensures this under native custom elements;\n        // under imports + ce polyfills, scripts run before upgrades.\n        // dependencies should be ready at upgrade time so register\n        // prototype at this time.\n        if (window.CustomElements && !CustomElements.useNative) {\n          Polymer(name);\n        } else {\n          var script = document.createElement('script');\n          script.textContent = 'Polymer(\\'' + name + '\\');';\n          this.appendChild(script);\n        }\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.wait(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  whenPolymerReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * The `auto-binding` element extends the template element. It provides a quick \n * and easy way to do data binding without the need to setup a model. \n * The `auto-binding` element itself serves as the model and controller for the \n * elements it contains. Both data and event handlers can be bound. \n *\n * The `auto-binding` element acts just like a template that is bound to \n * a model. It stamps its content in the dom adjacent to itself. When the \n * content is stamped, the `template-bound` event is fired.\n *\n * Example:\n *\n *     <template is=\"auto-binding\">\n *       <div>Say something: <input value=\"{{value}}\"></div>\n *       <div>You said: {{value}}</div>\n *       <button on-tap=\"{{buttonTap}}\">Tap me!</button>\n *     </template>\n *     <script>\n *       var template = document.querySelector('template');\n *       template.value = 'something';\n *       template.buttonTap = function() {\n *         console.log('tap!');\n *       };\n *     </script>\n *\n * @module Polymer\n * @status stable\n*/\n\n(function() {\n\n  var element = document.createElement('polymer-element');\n  element.setAttribute('name', 'auto-binding');\n  element.setAttribute('extends', 'template');\n  element.init();\n\n  Polymer('auto-binding', {\n\n    createdCallback: function() {\n      this.syntax = this.bindingDelegate = this.makeSyntax();\n      // delay stamping until polymer-ready so that auto-binding is not\n      // required to load last.\n      Polymer.whenPolymerReady(function() {\n        this.model = this;\n        this.setAttribute('bind', '');\n        // we don't bother with an explicit signal here, we could ust a MO\n        // if necessary\n        this.async(function() {\n          // note: this will marshall *all* the elements in the parentNode\n          // rather than just stamped ones. We'd need to use createInstance\n          // to fix this or something else fancier.\n          this.marshalNodeReferences(this.parentNode);\n          // template stamping is asynchronous so stamping isn't complete\n          // by polymer-ready; fire an event so users can use stamped elements\n          this.fire('template-bound');\n        });\n      }.bind(this));\n    },\n\n    makeSyntax: function() {\n      var events = Object.create(Polymer.api.declaration.events);\n      var self = this;\n      events.findController = function() { return self.model; };\n\n      var syntax = new PolymerExpressions();\n      var prepareBinding = syntax.prepareBinding;  \n      syntax.prepareBinding = function(pathString, name, node) {\n        return events.prepareEventBinding(pathString, name, node) ||\n               prepareBinding.call(syntax, pathString, name, node);\n      };\n      return syntax;\n    }\n\n  });\n\n})();\n"]}
\ No newline at end of file
+{"version":3,"file":"polymer.js","sources":["../polymer-gestures/src/scope.js","../polymer-gestures/src/targetfind.js","../polymer-gestures/src/touch-action.js","../polymer-gestures/src/eventFactory.js","../polymer-gestures/src/pointermap.js","../polymer-gestures/src/dispatcher.js","../polymer-gestures/src/installer.js","../polymer-gestures/src/mouse.js","../polymer-gestures/src/touch.js","../polymer-gestures/src/ms.js","../polymer-gestures/src/pointer.js","../polymer-gestures/src/platform-events.js","../polymer-gestures/src/track.js","../polymer-gestures/src/hold.js","../polymer-gestures/src/tap.js","../polymer-expressions/third_party/esprima/esprima.js","../polymer-expressions/src/polymer-expressions.js","src/boot.js","src/lib/lang.js","src/lib/job.js","src/lib/dom.js","src/lib/super.js","src/lib/deserialize.js","src/api.js","src/instance/utils.js","src/instance/events.js","src/instance/attributes.js","src/instance/properties.js","src/instance/mdv.js","src/instance/base.js","src/instance/styles.js","src/declaration/polymer.js","src/declaration/path.js","src/declaration/styles.js","src/declaration/events.js","src/declaration/properties.js","src/declaration/attributes.js","src/declaration/mdv.js","src/declaration/prototype.js","src/declaration/queue.js","src/declaration/import.js","src/declaration/polymer-element.js","src/lib/auto-binding.js"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {\n  hasSDPolyfill: Boolean(window.ShadowDOMPolyfill)\n};\nPolymerGestures.wrap = PolymerGestures.hasSDPolyfill ? ShadowDOMPolyfill.wrapIfNeeded : function(a){ return a; };\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (!scope.hasSDPolyfill && pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findScrollAxis: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n        }\n      } else {\n        n = scope.wrap(inEvent.currentTarget);\n        while(n) {\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n","/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'body /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    },\n    'manipulation'\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var head = document.head;\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      e._source = inDict._source || '';\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  var hasSDPolyfill = scope.hasSDPolyfill;\n  var wrap = scope.wrap;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      this.gestures.push(source);\n    },\n    register: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.addEventListener_(eventName, this.boundHandler);\n      } else {\n        target.addEventListener(eventName, this.boundHandler);\n      }\n    },\n    removeEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.removeEventListener_(eventName, this.boundHandler);\n      } else {\n        target.removeEventListener(eventName, this.boundHandler);\n      }\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n          eventCopy[p] = wrap(eventCopy[p]);\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = inEvent.preventDefault;\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          g = this.gestures[j];\n          fn = g[e.type];\n          if (fn) {\n            fn.call(g, e);\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = function(root) {\n    dispatcher.register(root);\n  };\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n  scope.wrap = wrap;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module uses Mutation Observers to dynamically adjust which nodes will\n * generate Pointer Events.\n *\n * All nodes that wish to generate Pointer Events must have the attribute\n * `touch-action` set to `none`.\n */\n(function(scope) {\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  var map = Array.prototype.map.call.bind(Array.prototype.map);\n  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n  var MO = window.MutationObserver || window.WebKitMutationObserver;\n  var SELECTOR = '[touch-action]';\n  var OBSERVER_INIT = {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeOldValue: true,\n    attributeFilter: ['touch-action']\n  };\n\n  function Installer(add, remove, changed, binder) {\n    this.addCallback = add.bind(binder);\n    this.removeCallback = remove.bind(binder);\n    this.changedCallback = changed.bind(binder);\n    if (MO) {\n      this.observer = new MO(this.mutationWatcher.bind(this));\n    }\n  }\n\n  Installer.prototype = {\n    watchSubtree: function(target) {\n      // Only watch scopes that can target find, as these are top-level.\n      // Otherwise we can see duplicate additions and removals that add noise.\n      //\n      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n      // a removal without an insertion when a node is redistributed among\n      // shadows. Since it all ends up correct in the document, watching only\n      // the document will yield the correct mutations to watch.\n      if (scope.targetFinding.canTarget(target)) {\n        this.observer.observe(target, OBSERVER_INIT);\n      }\n    },\n    enableOnSubtree: function(target) {\n      this.watchSubtree(target);\n      if (target === document && document.readyState !== 'complete') {\n        this.installOnLoad();\n      } else {\n        this.installNewSubtree(target);\n      }\n    },\n    installNewSubtree: function(target) {\n      forEach(this.findElements(target), this.addElement, this);\n    },\n    findElements: function(target) {\n      if (target.querySelectorAll) {\n        return target.querySelectorAll(SELECTOR);\n      }\n      return [];\n    },\n    removeElement: function(el) {\n      this.removeCallback(el);\n    },\n    addElement: function(el) {\n      this.addCallback(el);\n    },\n    elementChanged: function(el, oldValue) {\n      this.changedCallback(el, oldValue);\n    },\n    concatLists: function(accum, list) {\n      return accum.concat(toArray(list));\n    },\n    // register all touch-action = none nodes on document load\n    installOnLoad: function() {\n      document.addEventListener('readystatechange', function() {\n        if (document.readyState === 'complete') {\n          this.installNewSubtree(document);\n        }\n      }.bind(this));\n    },\n    isElement: function(n) {\n      return n.nodeType === Node.ELEMENT_NODE;\n    },\n    flattenMutationTree: function(inNodes) {\n      // find children with touch-action\n      var tree = map(inNodes, this.findElements, this);\n      // make sure the added nodes are accounted for\n      tree.push(filter(inNodes, this.isElement));\n      // flatten the list\n      return tree.reduce(this.concatLists, []);\n    },\n    mutationWatcher: function(mutations) {\n      mutations.forEach(this.mutationHandler, this);\n    },\n    mutationHandler: function(m) {\n      if (m.type === 'childList') {\n        var added = this.flattenMutationTree(m.addedNodes);\n        added.forEach(this.addElement, this);\n        var removed = this.flattenMutationTree(m.removedNodes);\n        removed.forEach(this.removeElement, this);\n      } else if (m.type === 'attributes') {\n        this.elementChanged(m.target, m.oldValue);\n      }\n    }\n  };\n\n  if (!MO) {\n    Installer.prototype.watchSubtree = function(){\n      console.warn('PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.wrap(scope.findTarget(inEvent));\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  var INSTALLER;\n  // maybe one day...\n  // var CAN_USE_GLOBAL = ATTRIB in document.head.style;\n  var CAN_USE_GLOBAL = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        el._scrollType = st;\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      el._scrollType = undefined;\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        s._scrollType = undefined;\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        el._scrollType = st;\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto|manipulation$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = null;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        if (this.isPrimaryTouch(touch)) {\n          var fastPath = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            path: this.currentTouchEvent.path,\n            target: scope.wrap(this.currentTouchEvent.target)\n          };\n          return scope.findTarget(fastPath);\n        } else {\n          return scope.findTarget(touch);\n        }\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = scope.wrap(this.findTarget(inTouch, id));\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'touch';\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t, p; i < tl.length; i++) {\n        t = tl[i];\n        p = this.touchToPointer(t);\n        if (inEvent.type === 'touchstart') {\n          pointermap.set(p.pointerId, p.target);\n        }\n        if (pointermap.has(p.pointerId)) {\n          inFunction.call(this, p);\n        }\n        if (inEvent.type === 'touchend' || inEvent._cancel) {\n          this.cleanUpPointer(p);\n        }\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var scrollAxis = scope.targetFinding.findScrollAxis(inEvent);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(function(p) {\n          this.cancel(p);\n          pointermap.delete(p.pointerId);\n        });\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (CAN_USE_GLOBAL) {\n        this.processTouches(inEvent, this.move);\n      } else {\n        if (!this.scrolling) {\n          if (this.scrolling === null && this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n          } else {\n            this.scrolling = false;\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        } else if (this.firstXY) {\n          var t = inEvent.changedTouches[0];\n          var dx = t.clientX - this.firstXY.X;\n          var dy = t.clientY - this.firstXY.Y;\n          var dd = Math.sqrt(dx * dx + dy * dy);\n          if (dd >= HYSTERESIS) {\n            this.touchcancel(inEvent);\n            this.scrolling = true;\n            this.firstXY = null;\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      inPointer.relatedTarget = scope.wrap(scope.findTarget(inPointer));\n      dispatcher.up(inPointer);\n    },\n    cancel: function(inPointer) {\n      dispatcher.cancel(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      inEvent._cancel = true;\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  if (!CAN_USE_GLOBAL) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (window.navigator.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n    }\n  }\n\n  dispatcher.register(document);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var e = eventFactory.makeGestureEvent(inType, {\n         bubbles: true,\n         cancelable: true,\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         x: inEvent.x,\n         y: inEvent.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       });\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class release\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY,\n        _source: 'hold'\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey,\n            _source: 'tap'\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n","/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, args, property;\n\n        expr = parsePrimaryExpression();\n\n        while (true) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else if (match('.')) {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            } else if (match('(')) {\n                args = parseArguments();\n                expr = delegate.createCallExpression(expr, args);\n            } else {\n                break;\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.computed = accessor == '[';\n\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (this.computed && !(property instanceof Literal));\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        (property instanceof IdentPath || property instanceof Literal) &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = !this.computed || this.simplePath ?\n        property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n\n        var parts = this.object instanceof MemberExpression ?\n            this.object.fullPath.slice() : [this.object.name];\n        parts.push(this.property instanceof IdentPath ?\n            this.property.name : this.property.value);\n        this.fullPath_ = Path.get(parts);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (!this.computed) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n            var propName = property(model, observer, filterRegistry);\n            if (observer)\n              observer.addPath(context, [propName]);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(model, observer, filterRegistry, toModelDirection,\n                        initialArgs) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find function or filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('Cannot find function or filter: ' + this.name);\n        return;\n      }\n\n      var args = initialArgs || [];\n      for (var i = 0; i < this.args.length; i++) {\n        args.push(getFn(this.args[i])(model, observer, filterRegistry));\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer, filterRegistry) {\n        return unaryOperators[op](argument(model, observer, filterRegistry));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      return function(model, observer, filterRegistry) {\n        return binaryOperators[op](left(model, observer, filterRegistry),\n                                   right(model, observer, filterRegistry));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      return function(model, observer, filterRegistry) {\n        return test(model, observer, filterRegistry) ?\n            consequent(model, observer, filterRegistry) :\n            alternate(model, observer, filterRegistry);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createCallExpression: function(expression, args) {\n      if (!(expression instanceof IdentPath))\n        throw Error('Only identifier function invocations are allowed');\n\n      var filter = new Filter(expression.name, args);\n\n      return function(model, observer, filterRegistry) {\n        return filter.transform(model, observer, filterRegistry, false);\n      };\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer, filterRegistry) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer, filterRegistry));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer, filterRegistry) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] =\n              properties[i].value(model, observer, filterRegistry);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer, filterRegistry);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(model, observer, filterRegistry,\n            false, [value]);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(model, undefined,\n            filterRegistry, true, [newValue]);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        return createScopeObject(parentScope, model, scopeName, indexName);\n      };\n    }\n  };\n\n  var createScopeObject = ('__proto__' in {}) ?\n    function(parentScope, model, scopeName, indexName) {\n      var scope = {};\n      scope[scopeName] = model;\n      scope[indexName] = undefined;\n      scope[parentScopeName] = parentScope;\n      scope.__proto__ = parentScope;\n      return scope;\n    } :\n    function(parentScope, model, scopeName, indexName) {\n      var scope = Object.create(parentScope);\n      Object.defineProperty(scope, scopeName,\n          { value: model, configurable: true, writable: true });\n      Object.defineProperty(scope, indexName,\n          { value: undefined, configurable: true, writable: true });\n      Object.defineProperty(scope, parentScopeName,\n          { value: parentScope, configurable: true, writable: true });\n      return scope;\n    };\n\n  global.PolymerExpressions = PolymerExpressions;\n  PolymerExpressions.getExpression = getExpression;\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n  \n  // exports\n\n  scope.extend = extend;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var registry = {};\n\n  HTMLElement.register = function(tag, prototype) {\n    registry[tag] = prototype;\n  }\n\n  // get prototype mapped to node <tag>\n  HTMLElement.getPrototypeForTag = function(tag) {\n    var prototype = !tag ? HTMLElement.prototype : registry[tag];\n    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects\n    return prototype || Object.getPrototypeOf(document.createElement(tag));\n  };\n\n  // we have to flag propagation stoppage for the event dispatcher\n  var originalStopPropagation = Event.prototype.stopPropagation;\n  Event.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n    originalStopPropagation.apply(this, arguments);\n  };\n  \n  // TODO(sorvell): remove when we're sure imports does not need\n  // to load stylesheets\n  /*\n  HTMLImports.importer.preloadSelectors += \n      ', polymer-element link[rel=stylesheet]';\n  */\n})(Polymer);\n","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n (function(scope) {\r\n    // super\r\n\r\n    // `arrayOfArgs` is an optional array of args like one might pass\r\n    // to `Function.apply`\r\n\r\n    // TODO(sjmiles):\r\n    //    $super must be installed on an instance or prototype chain\r\n    //    as `super`, and invoked via `this`, e.g.\r\n    //      `this.super();`\r\n\r\n    //    will not work if function objects are not unique, for example,\r\n    //    when using mixins.\r\n    //    The memoization strategy assumes each function exists on only one \r\n    //    prototype chain i.e. we use the function object for memoizing)\r\n    //    perhaps we can bookkeep on the prototype itself instead\r\n    function $super(arrayOfArgs) {\r\n      // since we are thunking a method call, performance is important here: \r\n      // memoize all lookups, once memoized the fast path calls no other \r\n      // functions\r\n      //\r\n      // find the caller (cannot be `strict` because of 'caller')\r\n      var caller = $super.caller;\r\n      // memoized 'name of method' \r\n      var nom = caller.nom;\r\n      // memoized next implementation prototype\r\n      var _super = caller._super;\r\n      if (!_super) {\r\n        if (!nom) {\r\n          nom = caller.nom = nameInThis.call(this, caller);\r\n        }\r\n        if (!nom) {\r\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\r\n        }\r\n        // super prototype is either cached or we have to find it\r\n        // by searching __proto__ (at the 'top')\r\n        // invariant: because we cache _super on fn below, we never reach \r\n        // here from inside a series of calls to super(), so it's ok to \r\n        // start searching from the prototype of 'this' (at the 'top')\r\n        // we must never memoize a null super for this reason\r\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\r\n      }\r\n      // our super function\r\n      var fn = _super[nom];\r\n      if (fn) {\r\n        // memoize information so 'fn' can call 'super'\r\n        if (!fn._super) {\r\n          // must not memoize null, or we lose our invariant above\r\n          memoizeSuper(fn, nom, _super);\r\n        }\r\n        // invoke the inherited method\r\n        // if 'fn' is not function valued, this will throw\r\n        return fn.apply(this, arrayOfArgs || []);\r\n      }\r\n    }\r\n\r\n    function nameInThis(value) {\r\n      var p = this.__proto__;\r\n      while (p && p !== HTMLElement.prototype) {\r\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\r\n        var n$ = Object.getOwnPropertyNames(p);\r\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\r\n          var d = Object.getOwnPropertyDescriptor(p, n);\r\n          if (typeof d.value === 'function' && d.value === value) {\r\n            return n;\r\n          }\r\n        }\r\n        p = p.__proto__;\r\n      }\r\n    }\r\n\r\n    function memoizeSuper(method, name, proto) {\r\n      // find and cache next prototype containing `name`\r\n      // we need the prototype so we can do another lookup\r\n      // from here\r\n      var s = nextSuper(proto, name, method);\r\n      if (s[name]) {\r\n        // `s` is a prototype, the actual method is `s[name]`\r\n        // tag super method with it's name for quicker lookups\r\n        s[name].nom = name;\r\n      }\r\n      return method._super = s;\r\n    }\r\n\r\n    function nextSuper(proto, name, caller) {\r\n      // look for an inherited prototype that implements name\r\n      while (proto) {\r\n        if ((proto[name] !== caller) && proto[name]) {\r\n          return proto;\r\n        }\r\n        proto = getPrototypeOf(proto);\r\n      }\r\n      // must not return null, or we lose our invariant above\r\n      // in this case, a super() call was invoked where no superclass\r\n      // method exists\r\n      // TODO(sjmiles): thow an exception?\r\n      return Object;\r\n    }\r\n\r\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \r\n    // __proto__. Therefore, always get prototype via __proto__ instead of\r\n    // the more standard Object.getPrototypeOf.\r\n    function getPrototypeOf(prototype) {\r\n      return prototype.__proto__;\r\n    }\r\n\r\n    // utility function to precompute name tags for functions\r\n    // in a (unchained) prototype\r\n    function hintSuper(prototype) {\r\n      // tag functions with their prototype name to optimize\r\n      // super call invocations\r\n      for (var n in prototype) {\r\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\r\n        if (pd && typeof pd.value === 'function') {\r\n          pd.value.nom = n;\r\n        }\r\n      }\r\n    }\r\n\r\n    // exports\r\n\r\n    scope.super = $super;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var typeHandlers = {\n    string: function(value) {\n      return value;\n    },\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  };\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail || {};\n      var event = new CustomEvent(type, {\n        bubbles: (bubbles !== undefined ? bubbles : true), \n        cancelable: (cancelable !== undefined ? cancelable : true), \n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist.\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      * @param String html to inject\n      * @param Element target element\n      */\n    injectBoundHTML: function(html, element) {\n      var template = document.createElement('template');\n      template.innerHTML = html;\n      var fragment = this.instanceTemplate(template);\n      if (element) {\n        element.textContent = '';\n        element.appendChild(fragment);\n      }\n      return fragment;\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        this.addEventListener(type, this.element.getEventHandler(this, this,\n                                                                 methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n})(Polymer);\n","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    copyInstanceAttributes: function () {\r\n      var a$ = this._instanceAttributes;\r\n      for (var k in a$) {\r\n        if (!this.hasAttribute(k)) {\r\n          this.setAttribute(k, a$[k]);\r\n        }\r\n      }\r\n    },\r\n    // for each attribute on this, deserialize value to property as needed\r\n    takeAttributes: function() {\r\n      // if we have no publish lookup table, we have no attributes to take\r\n      // TODO(sjmiles): ad hoc\r\n      if (this._publishLC) {\r\n        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\r\n          this.attributeToProperty(a.name, a.value);\r\n        }\r\n      }\r\n    },\r\n    // if attribute 'name' is mapped to a property, deserialize\r\n    // 'value' into that property\r\n    attributeToProperty: function(name, value) {\r\n      // try to match this attribute to a property (attributes are\r\n      // all lower-case, so this is case-insensitive search)\r\n      var name = this.propertyForAttribute(name);\r\n      if (name) {\r\n        // filter out 'mustached' values, these are to be\r\n        // replaced with bound-data and are not yet values\r\n        // themselves\r\n        if (value && value.search(scope.bindPattern) >= 0) {\r\n          return;\r\n        }\r\n        // get original value\r\n        var currentValue = this[name];\r\n        // deserialize Boolean or Number values from attribute\r\n        var value = this.deserializeValue(value, currentValue);\r\n        // only act if the value has changed\r\n        if (value !== currentValue) {\r\n          // install new value (has side-effects)\r\n          this[name] = value;\r\n        }\r\n      }\r\n    },\r\n    // return the published property matching name, or undefined\r\n    propertyForAttribute: function(name) {\r\n      var match = this._publishLC && this._publishLC[name];\r\n      //console.log('propertyForAttribute:', name, 'matches', match);\r\n      return match;\r\n    },\r\n    // convert representation of 'stringValue' based on type of 'currentValue'\r\n    deserializeValue: function(stringValue, currentValue) {\r\n      return scope.deserializeValue(stringValue, currentValue);\r\n    },\r\n    serializeValue: function(value, inferredType) {\r\n      if (inferredType === 'boolean') {\r\n        return value ? '' : undefined;\r\n      } else if (inferredType !== 'object' && inferredType !== 'function'\r\n          && value !== undefined) {\r\n        return value;\r\n      }\r\n    },\r\n    reflectPropertyToAttribute: function(name) {\r\n      var inferredType = typeof this[name];\r\n      // try to intelligently serialize property value\r\n      var serializedValue = this.serializeValue(this[name], inferredType);\r\n      // boolean properties must reflect as boolean attributes\r\n      if (serializedValue !== undefined) {\r\n        this.setAttribute(name, serializedValue);\r\n        // TODO(sorvell): we should remove attr for all properties\r\n        // that have undefined serialization; however, we will need to\r\n        // refine the attr reflection system to achieve this; pica, for example,\r\n        // relies on having inferredType object properties not removed as\r\n        // attrs.\r\n      } else if (inferredType === 'boolean') {\r\n        this.removeAttribute(name);\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.instance.attributes = attributes;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  var numberIsNaN = Number.isNaN || function(value) {\n    return typeof value === 'number' && isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObserver(o);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without\n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n\n      var self = this;\n      var value = observable.open(function(value, oldValue) {\n        self[privateName] = value;\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      });\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      this[privateName] = value;\n      this.emitPropertyChangeRecord(name, value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      var observers = dom.bindings_;\n      for (var i = 0; i < observers.length; i++) {\n        this.registerObserver(observers[i]);\n      }\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this._recordBinding(property, observer);\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected\n      // https://github.com/Polymer/ShadowDOM/issues/420\n      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      // TODO (sorvell): temporarily open observer when created\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n      // TODO (sorvell): temporarily open observer when created\n      // turn on property observation and take any initial changes\n      //this.openPropertyObserver();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants,\n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants\n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);\n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n      // set up polymer gestures\n      PolymerGestures.register(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n\n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  \n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (window.ShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      this.styleCacheForScope(scope)[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      var cache = this.styleCacheForScope(scope);\n      return cache[name];\n    },\n    styleCacheForScope: function(scope) {\n      if (window.ShadowDOMPolyfill) {\n        var scopeName = scope.host ? scope.host.localName : scope.localName;\n        return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});\n      } else {\n        return scope._scopeStyles = (scope._scopeStyles || {});\n      }\n    }\n  };\n\n  var polyfillScopeStyleCache = {};\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'string') {\n      prototype = name;\n      var script = document._currentScript;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  var declarations = Platform.deliverDeclarations();\n  if (declarations) {\n    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n      element.apply(null, d);\n    }\n  }\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Platform.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return Platform.styleResolver.loadStyles(styles, templateUrl, callback);\n        }\n      }\n      if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (window.ShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var events = {\n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    },\n    findController: function(node) {\n      while (node.parentNode) {\n        if (node.eventController) {\n          return node.eventController;\n        }\n        node = node.parentNode;\n      }\n      return node.host;\n    },\n    getEventHandler: function(controller, target, method) {\n      var events = this;\n      return function(e) {\n        if (!controller || !controller.PolymerBase) {\n          controller = events.findController(target);\n        }\n\n        var args = [e, e.detail, e.currentTarget];\n        controller.dispatchMethod(controller, method, args);\n      };\n    },\n    prepareEventBinding: function(pathString, name, node) {\n      if (!this.hasEventPrefix(name))\n        return;\n\n      var eventType = this.removeEventPrefix(name);\n      eventType = mixedCaseEventTypes[eventType] || eventType;\n\n      var events = this;\n\n      return function(model, node, oneTime) {\n        var handler = events.getEventHandler(undefined, node, pathString);\n        node.addEventListener(eventType, handler);\n\n        if (oneTime)\n          return;\n\n        // TODO(rafaelw): This is really pointless work. Aside from the cost\n        // of these allocations, NodeBind is going to setAttribute back to its\n        // current value. Fixing this would mean changing the TemplateBinding\n        // binding delegate API.\n        function bindingValue() {\n          return '{{ ' + pathString + ' }}';\n        }\n\n        return {\n          open: bindingValue,\n          discardChanges: bindingValue,\n          close: function() {\n            node.removeEventListener(eventType, handler);\n          }\n        };\n      };\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n      if (prototype.computed) {\n        // construct name list\n        var a = prototype._computedNames = [];\n        for (var n in prototype.computed) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    // sync prototype to property descriptors;\n    // desriptor format contains default value and optionally a\n    // hint for reflecting the property to an attribute.\n    // e.g. {foo: 5, bar: {value: true, reflect: true}}\n    // reflect: {foo: true} is also supported\n    //\n    requireProperties: function(propertyDescriptors, prototype, base) {\n      // reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyDescriptors) {\n        var propertyDescriptor = propertyDescriptors[n];\n        var reflects = this.reflectHintForDescriptor(propertyDescriptor);\n        if (prototype.reflect[n] === undefined && reflects !== undefined) {\n          prototype.reflect[n] = reflects;\n        }\n        if (prototype[n] === undefined) {\n          prototype[n] = this.valueForDescriptor(propertyDescriptor);\n        }\n      }\n    },\n    valueForDescriptor: function(propertyDescriptor) {\n      var value = typeof propertyDescriptor === 'object' &&\n          propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;\n      return value !== undefined ? value : null;\n    },\n    // returns the value of the descriptor's 'reflect' property or undefined\n    reflectHintForDescriptor: function(propertyDescriptor) {\n      if (typeof propertyDescriptor === 'object' &&\n          propertyDescriptor && propertyDescriptor.reflect !== undefined) {\n        return propertyDescriptor.reflect;\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\n        var publish = prototype.publish || (prototype.publish = {});\n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // if the user hasn't specified a value, we want to use the\n          // default, unless a superclass has already chosen one\n          if (n && publish[n] === undefined) {\n            // TODO(sjmiles): querying native properties on IE11 (and possibly\n            // on other browsers) throws an exception because there is no actual\n            // instance.\n            // In fact, trying to publish native properties is known bad for this\n            // and other reasons, and we need to solve this problem writ large.\n            try {\n              var hasValue = (base[n] !== undefined);\n            } catch(x) {\n              hasValue = false;\n            }\n            // supply an empty 'descriptor' object and let the publishProperties\n            // code determine a default\n            if (!hasValue) {\n              publish[n] = Polymer.nob;\n            }\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && Platform.templateContent(template);\n    },\n    installBindingDelegate: function(template) {\n      if (template) {\n        template.bindingDelegate = this.syntax;\n      }\n    }\n  };\n\n  // exports\n  scope.api.declaration.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (window.ShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n\n    // tell the queue to wait for an element to be ready\n    wait: function(element) {\n      if (!element.__queue) {\n        element.__queue = {};\n        elements.push(element);\n      }\n    },\n\n    // enqueue an element to the next spot in the queue.\n    enqueue: function(element, check, go) {\n      var shouldAdd = element.__queue && !element.__queue.check;\n      if (shouldAdd) {\n        queueForElement(element).push(element);\n        element.__queue.check = check;\n        element.__queue.go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        element.__queue.flushable = true;\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__queue.check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n\n    nextElement: function() {\n      return nextQueued();\n    },\n\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n\n    isEmpty: function() {\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          return;\n        }\n      }\n      return true;\n    },\n\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n\n    flush: function() {\n      // prevent re-entrance\n      if (this.flushing) {\n        return;\n      }\n      if (flushQueue.length) {\n        console.warn('flushing %s elements', flushQueue.length);\n      }\n      this.flushing = true;\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__queue.go.call(element);\n        element.__queue = null;\n      }\n      this.flushing = false;\n    },\n\n    ready: function() {\n      this.flush();\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n\n    waitToReady: true\n\n  };\n\n  var elements = [];\n  var flushQueue = [];\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.elements = elements;\n  scope.queue = queue;\n  scope.whenReady = scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenPolymerReady = scope.whenPolymerReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      queue.wait(this);\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    // TODO(sorvell): we currently queue in the order the prototypes are \n    // registered, but we should queue in the order that polymer-elements\n    // are registered. We are currently blocked from doing this based on \n    // crbug.com/395686.\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      queue.go(this);\n    },\n\n    _register: function() {\n      //console.log('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // imperative element registration\n        Polymer(name);\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.enqueue(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  whenPolymerReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * The `auto-binding` element extends the template element. It provides a quick \n * and easy way to do data binding without the need to setup a model. \n * The `auto-binding` element itself serves as the model and controller for the \n * elements it contains. Both data and event handlers can be bound. \n *\n * The `auto-binding` element acts just like a template that is bound to \n * a model. It stamps its content in the dom adjacent to itself. When the \n * content is stamped, the `template-bound` event is fired.\n *\n * Example:\n *\n *     <template is=\"auto-binding\">\n *       <div>Say something: <input value=\"{{value}}\"></div>\n *       <div>You said: {{value}}</div>\n *       <button on-tap=\"{{buttonTap}}\">Tap me!</button>\n *     </template>\n *     <script>\n *       var template = document.querySelector('template');\n *       template.value = 'something';\n *       template.buttonTap = function() {\n *         console.log('tap!');\n *       };\n *     </script>\n *\n * @module Polymer\n * @status stable\n*/\n\n(function() {\n\n  var element = document.createElement('polymer-element');\n  element.setAttribute('name', 'auto-binding');\n  element.setAttribute('extends', 'template');\n  element.init();\n\n  Polymer('auto-binding', {\n\n    createdCallback: function() {\n      this.syntax = this.bindingDelegate = this.makeSyntax();\n      // delay stamping until polymer-ready so that auto-binding is not\n      // required to load last.\n      Polymer.whenPolymerReady(function() {\n        this.model = this;\n        this.setAttribute('bind', '');\n        // we don't bother with an explicit signal here, we could ust a MO\n        // if necessary\n        this.async(function() {\n          // note: this will marshall *all* the elements in the parentNode\n          // rather than just stamped ones. We'd need to use createInstance\n          // to fix this or something else fancier.\n          this.marshalNodeReferences(this.parentNode);\n          // template stamping is asynchronous so stamping isn't complete\n          // by polymer-ready; fire an event so users can use stamped elements\n          this.fire('template-bound');\n        });\n      }.bind(this));\n    },\n\n    makeSyntax: function() {\n      var events = Object.create(Polymer.api.declaration.events);\n      var self = this;\n      events.findController = function() { return self.model; };\n\n      var syntax = new PolymerExpressions();\n      var prepareBinding = syntax.prepareBinding;  \n      syntax.prepareBinding = function(pathString, name, node) {\n        return events.prepareEventBinding(pathString, name, node) ||\n               prepareBinding.call(syntax, pathString, name, node);\n      };\n      return syntax;\n    }\n\n  });\n\n})();\n"]}
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/property_accessor.dart b/pkg/polymer/lib/src/property_accessor.dart
new file mode 100644
index 0000000..b639b47
--- /dev/null
+++ b/pkg/polymer/lib/src/property_accessor.dart
@@ -0,0 +1,66 @@
+// 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.
+
+/// Code for property accessors from declaration/properties.js
+part of polymer;
+
+// Dart note: this matches the property defined by createPropertyAccessor in
+// polymer-dev/src/declarations/properties.js. Unlike Javascript, we can't
+// override the original property, so we instead ask users to write properties
+// using this pattern:
+//
+//     class Foo extends PolymerElement {
+//       ...
+//       @published
+//       get foo => readValue(#foo);
+//       set foo(v) { writeValue(#foo, v); }
+//
+// and internally readValue/writeValue use an instance of this type to
+// implement the semantics in createPropertyAccessor.
+class _PropertyAccessor<T> {
+  // Name of the property, in order to properly fire change notification events.
+  final Symbol _name;
+
+  /// The underlying value of the property.
+  T _value;
+
+  // Polymer element that contains this property, where change notifications are
+  // expected to be fired from.
+  final Polymer _target;
+
+  /// Non-null when the property is bound.
+  Bindable bindable;
+
+  _PropertyAccessor(this._name, this._target, this._value);
+
+  /// Updates the underlyling value and fires the expected notifications.
+  void updateValue(T newValue) {
+    var oldValue = _value;
+    _value = _target.notifyPropertyChange(_name, oldValue, newValue);
+    _target.emitPropertyChangeRecord(_name, newValue, oldValue);
+  }
+
+  /// The current value of the property. If the property is bound, reading this
+  /// property ensures that the changes are first propagated in order to return
+  /// the latest value. Similarly, when setting this property the binding (if
+  /// any) will be updated too.
+  T get value {
+    if (bindable != null) bindable.deliver();
+    return _value;
+  }
+
+  set value(T newValue) {
+    if (bindable != null) {
+      bindable.value = newValue;
+    } else {
+      updateValue(newValue);
+    }
+  }
+
+  toString() {
+    var name = smoke.symbolToName(_name);
+    var hasBinding = bindable == null ? '(no-binding)' : '(with-binding)';
+    return "[$runtimeType: $_target.$name: $_value $hasBinding]";
+  }
+}
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index c09c9a1..a2b8185 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.12.1-dev
+version: 0.12.0+5
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Polymer.dart is a new type of library for the web, built on top of Web
@@ -9,18 +9,19 @@
 dependencies:
   analyzer: '>=0.15.6 <0.16.0'
   args: '>=0.10.0 <0.13.0'
-  barback: '>=0.9.0 <0.15.0'
+  barback: '>=0.14.2 <0.16.0'
   browser: '>=0.10.0 <0.11.0'
-  code_transformers: '>=0.1.4 <0.2.0'
-  html5lib: '>=0.11.0 <0.12.0'
+  code_transformers: '>=0.2.0 <0.3.0'
+  html5lib: '>=0.11.0 <0.13.0'
   logging: '>=0.9.0 <0.10.0'
-  observe: '>=0.11.0-dev <0.12.0'
+  observe: '>=0.11.0 <0.12.0'
   path: '>=0.9.0 <2.0.0'
-  polymer_expressions: '>=0.12.0-dev <0.13.0'
-  smoke: '>=0.2.0-dev <0.3.0'
-  source_maps: '>=0.9.0 <0.10.0'
-  template_binding: '>=0.12.0-dev <0.13.0'
-  web_components: '>=0.4.0 <0.5.0'
+  polymer_expressions: '>=0.12.0 <0.13.0'
+  smoke: '>=0.2.0 <0.3.0'
+  source_maps: '>=0.9.4 <0.11.0'
+  source_span: '>=1.0.0 <2.0.0'
+  template_binding: '>=0.12.0 <0.13.0'
+  web_components: '>=0.5.0 <0.6.0'
   yaml: '>=0.9.0 <3.0.0'
 dev_dependencies:
   unittest: '>=0.10.0 <0.11.0'
diff --git a/pkg/polymer/test/auto_binding_test.dart b/pkg/polymer/test/auto_binding_test.dart
index b563814..1feea16 100644
--- a/pkg/polymer/test/auto_binding_test.dart
+++ b/pkg/polymer/test/auto_binding_test.dart
@@ -39,9 +39,22 @@
         expect(ce.detail, ['handled'], reason: 'element event handler fired');
       }
 
-      if (events == 2) completer.complete();
+      if (events == 3) completer.complete();
+    });
+
+    /// test dynamic creation
+    new Future(() {
+      var d = new DivElement();
+      d.setInnerHtml('<template is="auto-binding">Dynamical'
+          ' <input value="{{value}}"><div>{{value}}</div></template>',
+          treeSanitizer: new _NullSanitizer());
+      document.body.append(d);
     });
 
     return completer.future;
   });
 });
+
+class _NullSanitizer implements NodeTreeSanitizer {
+  sanitizeTree(Node node) {}
+}
diff --git a/pkg/polymer/test/bind_properties_test.dart b/pkg/polymer/test/bind_properties_test.dart
new file mode 100644
index 0000000..5765afb
--- /dev/null
+++ b/pkg/polymer/test/bind_properties_test.dart
@@ -0,0 +1,108 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:html';
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:polymer/polymer.dart';
+
+export 'package:polymer/init.dart';
+
+class XBaz extends PolymerElement {
+  @published
+  int get val => readValue(#val);
+  set val(v) => writeValue(#val, v);
+
+  XBaz.created() : super.created();
+}
+
+class XBar extends PolymerElement {
+  @published
+  int get val => readValue(#val);
+  set val(v) => writeValue(#val, v);
+
+  XBar.created() : super.created();
+}
+
+class XBat extends PolymerElement {
+  @published
+  int get val => readValue(#val);
+  set val(v) => writeValue(#val, v);
+
+  XBat.created() : super.created();
+}
+
+class XFoo extends PolymerElement {
+  @published
+  int get val => readValue(#val);
+  set val(v) => writeValue(#val, v);
+
+  XFoo.created() : super.created();
+}
+
+@CustomTag('bind-properties-test')
+class XTest extends PolymerElement {
+  XTest.created() : super.created();
+
+  @published var obj;
+
+  ready() {
+    obj = toObservable({'path': {'to': {'value': 3}}});
+    readyCalled();
+  }
+}
+
+var completer = new Completer();
+waitForElementReady(_) => completer.future;
+readyCalled() { completer.complete(null); }
+
+@initMethod
+init() {
+  // TODO(sigmund): investigate why are we still seeing failures due to the
+  // order of registrations, then use @CustomTag instead of this.
+  Polymer.register('x-foo', XFoo);
+  Polymer.register('x-bar', XBar);
+  Polymer.register('x-baz', XBaz);
+  Polymer.register('x-bat', XBat);
+
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady.then(waitForElementReady));
+
+  test('bind properties test', () {
+    var e = document.querySelector('bind-properties-test');
+    var foo = e.shadowRoot.querySelector('#foo');
+    var bar = foo.shadowRoot.querySelector('#bar');
+    var bat = foo.shadowRoot.querySelector('#bat');
+    var baz = bar.shadowRoot.querySelector('#baz');
+
+    expect(foo.val, 3);
+    expect(bar.val, 3);
+    expect(bat.val, 3);
+    expect(baz.val, 3);
+
+    foo.val = 4;
+
+    expect(foo.val, 4);
+    expect(bar.val, 4);
+    expect(bat.val, 4);
+    expect(baz.val, 4);
+
+    baz.val = 5;
+
+    expect(foo.val, 5);
+    expect(bar.val, 5);
+    expect(bat.val, 5);
+    expect(baz.val, 5);
+
+    e.obj['path']['to']['value'] = 6;
+
+    expect(foo.val, 6);
+    expect(bar.val, 6);
+    expect(bat.val, 6);
+    expect(baz.val, 6);
+  });
+}
+
diff --git a/pkg/polymer/test/bind_properties_test.html b/pkg/polymer/test/bind_properties_test.html
new file mode 100644
index 0000000..1d828627
--- /dev/null
+++ b/pkg/polymer/test/bind_properties_test.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+  <!--polymer-test: this comment is needed for test_suite.dart-->
+  <head>
+    <title>port of bindProperties test</title>
+    <script src="packages/web_components/platform.js"></script>
+    <script src="packages/web_components/dart_support.js"></script>
+    <link rel="import" href="packages/polymer/polymer.html">
+    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  </head>
+
+  <body>
+    <polymer-element name="x-baz" attributes="val">
+      <template>{{ val }}</template>
+    </polymer-element>
+
+    <polymer-element name="x-bar" attributes="val">
+      <template>
+        <x-baz id=baz val="{{ val }}"></x-baz>
+      </template>
+    </polymer-element>
+
+    <polymer-element name="x-bat" attributes="val">
+      <template>{{ val }}</template>
+    </polymer-element>
+
+    <polymer-element name="x-foo" attributes="val">
+      <template>
+        <x-bar id=bar val="{{ val }}"></x-bar>
+        <x-bat id=bat val="{{ val }}"></x-bat>
+      </template>
+    </polymer-element>
+
+    <polymer-element name="bind-properties-test">
+      <template>
+        <x-foo id="foo" val="{{ obj['path']['to']['value'] }}"></x-foo>
+      </template>
+    </polymer-element>
+    <bind-properties-test></bind-properties-test>
+    <script type="application/dart" src="bind_properties_test.dart"></script>
+  </body>
+</html>
diff --git a/pkg/polymer/test/build/common.dart b/pkg/polymer/test/build/common.dart
index ab78e75..14fc1b5 100644
--- a/pkg/polymer/test/build/common.dart
+++ b/pkg/polymer/test/build/common.dart
@@ -187,6 +187,10 @@
       'part of polymer;\n'
       'class PublishedProperty { const PublishedProperty(); }\n'
       'const published = const PublishedProperty();\n'
+      'class ComputedProperty {'
+      '  final String expression;\n'
+      '  const ComputedProperty();'
+      '}\n'
       'class ObserveProperty { const ObserveProperty(); }\n'
       'abstract class Polymer {}\n'
       'class PolymerElement extends HtmlElement with Polymer {}\n',
diff --git a/pkg/polymer/test/build/import_inliner_test.dart b/pkg/polymer/test/build/import_inliner_test.dart
index f6daa40..3e7c54c 100644
--- a/pkg/polymer/test/build/import_inliner_test.dart
+++ b/pkg/polymer/test/build/import_inliner_test.dart
@@ -159,6 +159,47 @@
       'a|web/second.js': '/*second*/'
     });
 
+  final cspPhases = [[new ImportInliner(
+      new TransformOptions(contentSecurityPolicy: true))]];
+  testPhases('extract Js scripts in CSP mode', cspPhases,
+    {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '<script type="text/javascript">/*first*/</script>'
+          '<script src="second.js"></script>'
+          '<link rel="import" href="test2.html">'
+          '<script type="application/dart">/*fifth*/</script>'
+          '</head></html>',
+      'a|web/test2.html':
+          '<!DOCTYPE html><html><head><script>/*third*/</script>'
+          '<script type="application/dart">/*forth*/</script>'
+          '</head><body><polymer-element>2</polymer-element></html>',
+      'a|web/second.js': '/*second*/'
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '</head><body>'
+          '<script type="text/javascript" src="test.html.0.js"></script>'
+          '<script src="second.js"></script>'
+          '<script src="test.html.2.js"></script>'
+          '<polymer-element>2</polymer-element>'
+          '</body></html>',
+      'a|web/test.html._data': expectedData([
+          'web/test.html.3.dart','web/test.html.1.dart']),
+      'a|web/test.html.3.dart': 'library a.web.test2_html_0;\n/*forth*/',
+      'a|web/test.html.1.dart': 'library a.web.test_html_0;\n/*fifth*/',
+      'a|web/test.html.0.js': '/*first*/',
+      'a|web/test.html.2.js': '/*third*/',
+      'a|web/test2.html':
+          '<!DOCTYPE html><html><head></head><body>'
+          '<script src="test2.html.0.js"></script>'
+          '<polymer-element>2</polymer-element></body></html>',
+      'a|web/test2.html._data': expectedData(['web/test2.html.1.dart']),
+      'a|web/test2.html.0.js': '/*third*/',
+      'a|web/test2.html.1.dart': 'library a.web.test2_html_0;\n/*forth*/',
+      'a|web/second.js': '/*second*/'
+    });
+
   testPhases('Cleans library names generated from file paths.', phases,
       {
         'a|web/01_test.html':
@@ -932,4 +973,4 @@
         '<script rel="import" href="../../packages/b/bar/bar.js"></script>'
         '</body></html>',
   });
-}
\ No newline at end of file
+}
diff --git a/pkg/polymer/test/build/polyfill_injector_test.dart b/pkg/polymer/test/build/polyfill_injector_test.dart
index 6f53367..43a5ad2 100644
--- a/pkg/polymer/test/build/polyfill_injector_test.dart
+++ b/pkg/polymer/test/build/polyfill_injector_test.dart
@@ -15,16 +15,14 @@
   useCompactVMConfiguration();
 
   group('js', () => runTests());
-  group('csp', () => runTests(csp: true));
   group('dart', () => runTests(js: false));
 }
 
-void runTests({bool js: true, bool csp: false}) {
+void runTests({bool js: true}) {
   var phases = [[new PolyfillInjector(new TransformOptions(
-      directlyIncludeJS: js,
-      contentSecurityPolicy: csp))]];
+      directlyIncludeJS: js))]];
 
-  var ext = js ? (csp ? '.precompiled.js' : '.js') : '';
+  var ext = js ? '.js' : '';
   var type = js ? '' : 'type="application/dart" ';
   var dartJsTag = js ? '' : DART_JS_TAG;
   var async = js ? ' async=""' : '';
diff --git a/pkg/polymer/test/build/script_compactor_test.dart b/pkg/polymer/test/build/script_compactor_test.dart
index 727018f..ba53630 100644
--- a/pkg/polymer/test/build/script_compactor_test.dart
+++ b/pkg/polymer/test/build/script_compactor_test.dart
@@ -738,6 +738,125 @@
           'main(){}',
     });
 
+  computedDeclaration(name, expr) =>
+      '#$name: const Declaration(#$name, dynamic, kind: PROPERTY,'
+      ' isFinal: true, annotations: const [const smoke_1.ComputedProperty'
+      '(\'$expr\')])';
+
+  testPhases('computed properties', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><body>'
+          '<polymer-element name="x-foo"><template>'
+          '</template></polymer-element>',
+      'a|web/test.html._data': expectedData(['web/a.dart']),
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          '@CustomTag("x-foo")\n'
+          'class XFoo extends PolymerElement {\n'
+          '  @ComputedProperty("ta.tb")\n'
+          '  get pa => readValue(#pa);\n'
+          '  @ComputedProperty(" tc ")\n' // extra space inside is OK
+          '  get pb => null;\n'
+          '  @ComputedProperty("td.m1(te)")\n'
+          '  get pc => null;\n'
+          '  @ComputedProperty("m2(tf)")\n'
+          '  get pd => null;\n'
+          '  @ComputedProperty("")\n'              // empty is ignored
+          '  get pe => null;\n'
+          '  @ComputedProperty(" ")\n'
+          '  get pf => null;\n'
+          '  @ComputedProperty("tg + th")\n'
+          '  get pg => null;\n'
+          '  @ComputedProperty("ti.tj | tk")\n'
+          '  get ph => null;\n'
+          '}\n'
+          'main(){}',
+    }, {
+      'a|web/test.html_bootstrap.dart':
+          '''$MAIN_HEADER
+          import 'a.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'a.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
+
+          void main() {
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                getters: {
+                  #m1: (o) => o.m1,
+                  #m2: (o) => o.m2,
+                  #pa: (o) => o.pa,
+                  #pb: (o) => o.pb,
+                  #pc: (o) => o.pc,
+                  #pd: (o) => o.pd,
+                  #pe: (o) => o.pe,
+                  #pf: (o) => o.pf,
+                  #pg: (o) => o.pg,
+                  #ph: (o) => o.ph,
+                  #ta: (o) => o.ta,
+                  #tb: (o) => o.tb,
+                  #tc: (o) => o.tc,
+                  #td: (o) => o.td,
+                  #te: (o) => o.te,
+                  #tf: (o) => o.tf,
+                  #tg: (o) => o.tg,
+                  #th: (o) => o.th,
+                  #ti: (o) => o.ti,
+                  #tj: (o) => o.tj,
+                  #tk: (o) => o.tk,
+                },
+                setters: {
+                  #tb: (o, v) { o.tb = v; },
+                  #tc: (o, v) { o.tc = v; },
+                  #tj: (o, v) { o.tj = v; },
+                },
+                parents: {
+                  smoke_0.XFoo: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_0.XFoo: {
+                    ${computedDeclaration('pa', 'ta.tb')},
+                    ${computedDeclaration('pb', ' tc ')},
+                    ${computedDeclaration('pc', 'td.m1(te)')},
+                    ${computedDeclaration('pd', 'm2(tf)')},
+                    ${computedDeclaration('pe', '')},
+                    ${computedDeclaration('pf', ' ')},
+                    ${computedDeclaration('pg', 'tg + th')},
+                    ${computedDeclaration('ph', 'ti.tj | tk')},
+                  },
+                },
+                names: {
+                  #m1: r'm1',
+                  #m2: r'm2',
+                  #pa: r'pa',
+                  #pb: r'pb',
+                  #pc: r'pc',
+                  #pd: r'pd',
+                  #pe: r'pe',
+                  #pf: r'pf',
+                  #pg: r'pg',
+                  #ph: r'ph',
+                  #ta: r'ta',
+                  #tb: r'tb',
+                  #tc: r'tc',
+                  #td: r'td',
+                  #te: r'te',
+                  #tf: r'tf',
+                  #tg: r'tg',
+                  #th: r'th',
+                  #ti: r'ti',
+                  #tj: r'tj',
+                  #tk: r'tk',
+                }));
+            configureForDeployment([
+                () => Polymer.register(\'x-foo\', i0.XFoo),
+              ]);
+            i0.main();
+          }
+          '''.replaceAll('\n          ', '\n'),
+    });
+
   final field1Details = "annotations: const [smoke_1.published]";
   final field3Details = "isFinal: true, annotations: const [smoke_1.published]";
   final prop1Details = "kind: PROPERTY, annotations: const [smoke_1.published]";
diff --git a/pkg/polymer/test/computed_properties_test.dart b/pkg/polymer/test/computed_properties_test.dart
new file mode 100644
index 0000000..df7e535
--- /dev/null
+++ b/pkg/polymer/test/computed_properties_test.dart
@@ -0,0 +1,84 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:html';
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:polymer/polymer.dart';
+
+// Test ported from:
+// https://github.com/Polymer/polymer-dev/blob/0.3.4/test/html/computedProperties.html
+@CustomTag('x-foo')
+class XFoo extends PolymerElement {
+  XFoo.created(): super.created();
+
+  // Left like this to illustrate the old-style @published pattern next to the
+  // new style below.
+  @published int count;
+
+  @published
+  String get foo => readValue(#foo);
+  set foo(String v) => writeValue(#foo, v);
+
+  @published
+  String get bar => readValue(#bar);
+  set bar(String v) => writeValue(#bar, v);
+
+  @ComputedProperty('repeat(fooBar, count)')
+  String get fooBarCounted => readValue(#fooBarCounted);
+
+  @ComputedProperty('foo + "-" + bar')
+  String get fooBar => readValue(#fooBar);
+
+  @ComputedProperty('this.foo')
+  String get foo2 => readValue(#foo2);
+  set foo2(v) => writeValue(#foo2, v);
+
+  @ComputedProperty('bar + ""')
+  String get bar2 => readValue(#bar2);
+  set bar2(v) => writeValue(#bar2, v);
+
+  repeat(String s, int count) {
+    var sb = new StringBuffer();
+    for (var i = 0; i < count; i++) {
+      if (i > 0) sb.write(' ');
+      sb.write(s);
+      sb.write('($i)');
+    }
+    return sb.toString();
+  }
+}
+
+main() => initPolymer().run(() {
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+
+  test('computed properties basic', () {
+    var xFoo = querySelector('x-foo');
+    var html = xFoo.shadowRoot.innerHtml;
+    expect(html, 'mee-too:mee-too(0) mee-too(1) mee-too(2)');
+    expect(xFoo.fooBar, 'mee-too');
+  });
+
+  // Dart note: the following tests were not in the original JS test.
+  test('computed properties can be updated', () {
+    var xFoo = querySelector('x-foo');
+    expect(xFoo.foo, 'mee');
+    expect(xFoo.foo2, 'mee');
+    xFoo.foo2 = 'hi';
+    expect(xFoo.foo, 'hi');
+    expect(xFoo.foo2, 'hi');
+  });
+
+  test('only assignable expressions can be updated', () {
+    var xFoo = querySelector('x-foo');
+    expect(xFoo.bar, 'too');
+    expect(xFoo.bar2, 'too');
+    xFoo.bar2 = 'hi';
+    expect(xFoo.bar, 'too');
+    expect(xFoo.bar2, 'too');
+  });
+});
diff --git a/pkg/polymer/test/computed_properties_test.html b/pkg/polymer/test/computed_properties_test.html
new file mode 100644
index 0000000..cdca3fa
--- /dev/null
+++ b/pkg/polymer/test/computed_properties_test.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+  <!--polymer-test: this comment is needed for test_suite.dart-->
+  <head>
+    <title>property to attribute reflection with bind</title>
+    <script src="packages/web_components/platform.js"></script>
+    <script src="packages/web_components/dart_support.js"></script>
+    <link rel="import" href="packages/polymer/polymer.html">
+    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  </head>
+
+  <body>
+  <x-foo foo="mee" bar="too" count=3></x-foo>
+
+    <polymer-element name="x-foo" attributes="foo bar count">
+      <template>{{ fooBar }}:{{ fooBarCounted }}</template>
+      <script type="application/dart" src="computed_properties_test.dart"></script>
+    </polymer-element>
+  </body>
+</html>
diff --git a/pkg/polymer/test/publish_inherited_properties_test.dart b/pkg/polymer/test/publish_inherited_properties_test.dart
index e900243..583f8cd 100644
--- a/pkg/polymer/test/publish_inherited_properties_test.dart
+++ b/pkg/polymer/test/publish_inherited_properties_test.dart
@@ -6,6 +6,7 @@
 import 'package:unittest/unittest.dart';
 import 'package:unittest/html_config.dart';
 import 'package:polymer/polymer.dart';
+import 'package:logging/logging.dart';
 
 // Dart note: unlike JS, you can't publish something that doesn't
 // have a corresponding field because we can't dynamically add properties.
@@ -26,16 +27,20 @@
 class XZot extends XBar {
   XZot.created() : super.created();
 
+  // Note: this is published because it appears in the `attributes` attribute.
   var m;
+
   @published int zot = 3;
 }
 
-// TODO(sigmund): uncomment this part of the test too (see dartbug.com/14559)
-// class XWho extends XZot {
-//   XWho.created() : super.created();
-//
-//   @published var zap;
-// }
+// Regresion test for dartbug.comk/14559. The bug is still open, but we don't
+// hit it now that we use smoke. The bug was assinging @CustomTag('x-zot') to
+// this class incorrectly and as a result `zap` was listed in `x-zot`.
+class XWho extends XZot {
+  XWho.created() : super.created();
+
+  @published var zap;
+}
 
 @CustomTag('x-squid')
 class XSquid extends XZot {
@@ -47,11 +52,13 @@
 }
 
 main() => initPolymer().run(() {
+  Logger.root.level = Level.ALL;
+  Logger.root.onRecord.listen((r) => print('${r.loggerName} ${r.message}'));
   useHtmlConfiguration();
 
-  setUp(() => Polymer.onReady.then((_) {
-    Polymer.register('x-noscript', XZot);
-  }));
+  Polymer.register('x-noscript', XZot);
+
+  setUp(() => Polymer.onReady);
 
   test('published properties', () {
     published(tag) => (new Element.tag(tag) as PolymerElement)
@@ -60,7 +67,6 @@
     expect(published('x-zot'), ['Foo', 'Bar', 'zot', 'm']);
     expect(published('x-squid'), ['Foo', 'Bar', 'zot', 'm', 'baz', 'squid']);
     expect(published('x-noscript'), ['Foo', 'Bar', 'zot', 'm']);
-    // TODO(sigmund): uncomment, see above
-    // expect(published('x-squid'), [#Foo, #Bar, #zot, #zap, #baz, #squid]);
+    expect(published('x-squid'), ['Foo', 'Bar', 'zot', 'm', 'baz', 'squid']);
   });
 });
diff --git a/pkg/polymer/test/unbind_test.dart b/pkg/polymer/test/unbind_test.dart
index 8bf7256..13d80ef 100644
--- a/pkg/polymer/test/unbind_test.dart
+++ b/pkg/polymer/test/unbind_test.dart
@@ -64,8 +64,12 @@
 // TODO(jmesserly): fix this when it's easier to get a private symbol.
 final unboundSymbol = reflectClass(Polymer).declarations.keys
     .firstWhere((s) => MirrorSystem.getName(s) == '_unbound');
+final observersSymbol = reflectClass(Polymer).declarations.keys
+    .firstWhere((s) => MirrorSystem.getName(s) == '_observers');
 
 _unbound(node) => reflect(node).getField(unboundSymbol).reflectee;
+_observerCount(node) =>
+    reflect(node).getField(observersSymbol).reflectee.length;
 
 unbindTests() {
   var xTest = document.querySelector('x-test');
@@ -77,38 +81,48 @@
         'element is bound when inserted');
     expect(xTest.fooWasChanged, true, reason:
         'element is actually bound');
+    // Dart note: we don't have a way to check for the global count of
+    // observables/bindables, so we just check the count in the node.
+    expect(_observerCount(xTest), greaterThan(0));
     xTest.remove();
   }).then(delay).then((_) {
     expect(_unbound(xTest), true, reason:
         'element is unbound when removed');
+    expect(_observerCount(xTest), 0);
     return new XTest();
   }).then(delay).then((node) {
     expect(_unbound(node), null, reason:
         'element is bound when not inserted');
     node.foo = 'bar';
+    expect(_observerCount(node), greaterThan(0));
     scheduleMicrotask(Observable.dirtyCheck);
     return node;
   }).then(delay).then((node) {
     expect(node.fooWasChanged, true, reason: 'node is actually bound');
+    node.unbindAll();
     var n = new XTest();
     n.cancelUnbindAll();
     return n;
   }).then(delay).then((node) {
     expect(_unbound(node), null, reason:
         'element is bound when cancelUnbindAll is called');
+    expect(_observerCount(node), greaterThan(0));
     node.unbindAll();
     expect(_unbound(node), true, reason:
         'element is unbound when unbindAll is called');
+    expect(_observerCount(node), 0);
     var n = new XTest()..id = 'foobar!!!';
     document.body.append(n);
     return n;
   }).then(delay).then((node) {
     expect(_unbound(node), null, reason:
         'element is bound when manually inserted');
+    expect(_observerCount(node), greaterThan(0));
     node.remove();
     return node;
   }).then(delay).then((node) {
     expect(_unbound(node), true, reason:
         'element is unbound when manually removed is called');
+    expect(_observerCount(node), 0);
   });
 }
diff --git a/pkg/polymer_expressions/CHANGELOG.md b/pkg/polymer_expressions/CHANGELOG.md
index 8683f55..74259f8 100644
--- a/pkg/polymer_expressions/CHANGELOG.md
+++ b/pkg/polymer_expressions/CHANGELOG.md
@@ -3,7 +3,9 @@
 This file contains highlights of what changes on each version of the
 polymer_expressions package.
 
-#### Pub version 0.12.0-dev
+#### Pub version 0.12.0
+  * Exposed a couple new APIs to create a polymer expression binding outside the
+    context of a template binding.
   * Updated to depend on latest template_binding and observe. Setting a value on
     a polymer expression binding now produces a change notification.
 
diff --git a/pkg/polymer_expressions/lib/eval.dart b/pkg/polymer_expressions/lib/eval.dart
index 1594121..8f7988b 100644
--- a/pkg/polymer_expressions/lib/eval.dart
+++ b/pkg/polymer_expressions/lib/eval.dart
@@ -66,8 +66,8 @@
 /**
  * Causes [expr] to be reevaluated a returns it's value.
  */
-Object update(ExpressionObserver expr, Scope scope) {
-  new Updater(scope).visit(expr);
+Object update(ExpressionObserver expr, Scope scope, {skipChanges: false}) {
+  new Updater(scope, skipChanges).visit(expr);
   return expr.currentValue;
 }
 
@@ -293,7 +293,7 @@
   _updateSelf(Scope scope) {}
 
   _invalidate(Scope scope) {
-    _observe(scope);
+    _observe(scope, false);
     if (_parent != null) {
       _parent._invalidate(scope);
     }
@@ -306,7 +306,7 @@
     }
   }
 
-  _observe(Scope scope) {
+  _observe(Scope scope, skipChanges) {
     _unobserve();
 
     var _oldValue = _value;
@@ -314,7 +314,7 @@
     // evaluate
     _updateSelf(scope);
 
-    if (!identical(_value, _oldValue)) {
+    if (!skipChanges && !identical(_value, _oldValue)) {
       _controller.add(_value);
     }
   }
@@ -324,11 +324,12 @@
 
 class Updater extends RecursiveVisitor {
   final Scope scope;
+  final bool skipChanges;
 
-  Updater(this.scope);
+  Updater(this.scope, [this.skipChanges = false]);
 
   visitExpression(ExpressionObserver e) {
-    e._observe(scope);
+    e._observe(scope, skipChanges);
   }
 }
 
diff --git a/pkg/polymer_expressions/lib/polymer_expressions.dart b/pkg/polymer_expressions/lib/polymer_expressions.dart
index 00e5409..332e3a1 100644
--- a/pkg/polymer_expressions/lib/polymer_expressions.dart
+++ b/pkg/polymer_expressions/lib/polymer_expressions.dart
@@ -97,7 +97,7 @@
               ? model
               : _scopeFactory.modelScope(model: model, variables: globals);
           if (oneTime) {
-            return _Binding._oneTime(expr, scope, null);
+            return _Binding._oneTime(expr, scope);
           }
           return new _Binding(expr, scope);
         };
@@ -250,6 +250,23 @@
     }
   }
 
+  /// Parse the expression string and return an expression tree.
+  static Expression getExpression(String exprString) =>
+      new Parser(exprString).parse();
+
+  /// Determines the value of evaluating [expr] on the given [model] and returns
+  /// either its value or a binding for it. If [oneTime] is true, it direclty
+  /// returns the value. Otherwise, when [oneTime] is false, it returns a
+  /// [Bindable] that besides evaluating the expression, it will also react to
+  /// observable changes from the model and update the value accordingly.
+  static getBinding(Expression expr, model, {Map<String, Object> globals,
+      oneTime: false}) {
+    if (globals == null) globals = new Map.from(DEFAULT_GLOBALS);
+    var scope = model is Scope ? model
+        : new Scope(model: model, variables: globals);
+    return oneTime ? _Binding._oneTime(expr, scope)
+        : new _Binding(expr, scope);
+  }
 }
 
 typedef Object _Converter(Object);
@@ -264,10 +281,9 @@
   ExpressionObserver _observer;
   var _value;
 
-  _Binding(this._expr, this._scope, [converter])
-      : _converter = converter == null ? _identity : converter;
+  _Binding(this._expr, this._scope, [this._converter]);
 
-  static Object _oneTime(Expression expr, Scope scope, _Converter converter) {
+  static Object _oneTime(Expression expr, Scope scope, [_Converter converter]) {
     try {
       var value = eval(expr, scope);
       return (converter == null) ? value : converter(value);
@@ -280,7 +296,7 @@
 
   bool _convertAndCheck(newValue, {bool skipChanges: false}) {
     var oldValue = _value;
-    _value = _converter(newValue);
+    _value = _converter == null ? newValue : _converter(newValue);
 
     if (!skipChanges && _callback != null && oldValue != _value) {
       _callback(_value);
@@ -289,20 +305,19 @@
     return false;
   }
 
-  // TODO(jmesserly): this should discard changes, but it caused
-  // a strange infinite loop in one of the bindings_tests.
-  // For now skipping the test. See http://dartbug.com/19105.
   get value {
     // if there's a callback, then _value has been set, if not we need to
     // force an evaluation
-    if (_callback != null) return _value;
-    return _oneTime(_expr, _scope, _converter);
+    if (_callback != null) {
+      _check(skipChanges: true);
+      return _value;
+    }
+    return _Binding._oneTime(_expr, _scope, _converter);
   }
 
   set value(v) {
     try {
-      var newValue = assign(_expr, v, _scope, checkAssignability: false);
-      _convertAndCheck(newValue);
+      assign(_expr, v, _scope, checkAssignability: false);
     } catch (e, s) {
       new Completer().completeError(
           "Error evaluating expression '$_expr': $e", s);
@@ -325,8 +340,7 @@
 
   bool _check({bool skipChanges: false}) {
     try {
-      // this causes a call to _updateValue with the new value
-      update(_observer, _scope);
+      update(_observer, _scope, skipChanges: skipChanges);
       return _convertAndCheck(_observer.currentValue, skipChanges: skipChanges);
     } catch (e, s) {
       new Completer().completeError(
diff --git a/pkg/polymer_expressions/pubspec.yaml b/pkg/polymer_expressions/pubspec.yaml
index 22adf00..02eac81 100644
--- a/pkg/polymer_expressions/pubspec.yaml
+++ b/pkg/polymer_expressions/pubspec.yaml
@@ -1,12 +1,12 @@
 name: polymer_expressions
-version: 0.12.0-pre.1.dev
+version: 0.12.0
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: An expressive custom binding syntax for HTML templates
 homepage: http://www.dartlang.org/polymer-dart/
 dependencies:
   browser: ">=0.10.0 <0.11.0"
-  observe: ">=0.11.0-dev <0.12.0"
-  template_binding: ">=0.12.0-dev <0.13.0"
+  observe: ">=0.11.0 <0.12.0"
+  template_binding: ">=0.12.0 <0.13.0"
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
   benchmark_harness: ">=1.0.0 <2.0.0"
diff --git a/pkg/polymer_expressions/test/bindings_test.dart b/pkg/polymer_expressions/test/bindings_test.dart
index c5469ba..b067782 100644
--- a/pkg/polymer_expressions/test/bindings_test.dart
+++ b/pkg/polymer_expressions/test/bindings_test.dart
@@ -49,11 +49,8 @@
     // regression test for issue 19296
     test('should not throw when data changes', () {
       var model = new NotifyModel();
-      var tag = new Element.html('<template>'
-          '<template repeat="{{ i in x }}">{{ i }}</template></template>');
-      TemplateBindExtension.bootstrap(tag);
-      var template = templateBind(tag);
-      testDiv.append(template.createInstance(model, new PolymerExpressions()));
+      testDiv.append(_createTemplateInstance(
+          '<template repeat="{{ i in x }}">{{ i }}</template>', model));
 
       return new Future(() {
         model.x = [1, 2, 3];
@@ -65,11 +62,7 @@
 
     test('should update text content when data changes', () {
       var model = new NotifyModel('abcde');
-      var tag = new Element.html(
-      '<template><span>{{x}}</span></template>');
-      TemplateBindExtension.bootstrap(tag);
-      var template = templateBind(tag);
-      testDiv.append(template.createInstance(model, new PolymerExpressions()));
+      testDiv.append(_createTemplateInstance('<span>{{x}}</span>', model));
 
       var el;
       return new Future(() {
@@ -87,13 +80,7 @@
       var model = new NotifyModel('abcde');
       var completer = new Completer();
       runZoned(() {
-        var tag = new Element.html(
-        '<template><span>{{foo}}</span></template>');
-        TemplateBindExtension.bootstrap(tag);
-        var template = templateBind(tag);
-        testDiv.append(template.createInstance(model,
-            new PolymerExpressions()));
-
+        testDiv.append(_createTemplateInstance('<span>{{foo}}</span>', model));
         return _nextMicrotask(null);
       }, onError: (e) {
         expect('$e', startsWith("Error evaluating expression 'foo':"));
@@ -104,13 +91,8 @@
 
     test('detects changes to ObservableList', () {
       var list = new ObservableList.from([1, 2, 3]);
-
-      var tag = new Element.html('<template>{{x[1]}}</template>');
-      TemplateBindExtension.bootstrap(tag);
-      var template = templateBind(tag);
-
       var model = new NotifyModel(list);
-      testDiv.append(template.createInstance(model, new PolymerExpressions()));
+      testDiv.append(_createTemplateInstance('{{x[1]}}', model));
 
       return new Future(() {
         expect(testDiv.text, '2');
@@ -133,44 +115,19 @@
       });
     });
 
-    test('detects changes to ObservableMap keys/values', () {
-      var map = new ObservableMap.from({'a': 1, 'b': 2});
-
-      var tag = new Element.html('<template>'
-          '<template repeat="{{k in x.keys}}">{{k}}:{{x[k]}},</template>'
-          '</template>');
-      TemplateBindExtension.bootstrap(tag);
-      var template = templateBind(tag);
-
-      var model = new NotifyModel(map);
-      testDiv.append(template.createInstance(model, new PolymerExpressions()));
-
-      return new Future(() {
-        expect(testDiv.text, 'a:1,b:2,');
-        map.remove('b');
-        map['c'] = 3;
-      }).then(_nextMicrotask).then((_) {
-        expect(testDiv.text, 'a:1,c:3,');
-        map['a'] = 4;
-      }).then(_nextMicrotask).then((_) {
-        expect(testDiv.text, 'a:4,c:3,');
-      });
-    });
-
     // Regression tests for issue 18792.
     for (var usePolymer in [true, false]) {
       // We run these tests both with PolymerExpressions and with the default
-      // delegate to ensure the results are consistent. The expressions on these
-      // tests use syntax common to both delegates.
+      // delegate to ensure the results are consistent. When possible, the
+      // expressions on these tests use syntax common to both delegates.
       var name = usePolymer ? 'polymer-expressions' : 'default';
       group('$name delegate', () {
         // Use <option template repeat="{{y}}" value="{{}}">item {{}}
         _initialSelectTest('{{y}}', '{{}}', usePolymer);
         _updateSelectTest('{{y}}', '{{}}', usePolymer);
-
-        // TODO(jmesserly): this is broken with polymer-expressions, see
-        // http://dartbug.com/19105
-        if (!usePolymer) _cursorPositionTest(usePolymer);
+        _detectKeyValueChanges(usePolymer);
+        if (usePolymer) _detectKeyValueChangesPolymerSyntax();
+        _cursorPositionTest(usePolymer);
       });
     }
 
@@ -186,15 +143,8 @@
 _cursorPositionTest(bool usePolymer) {
   test('should preserve the cursor position', () {
     var model = new NotifyModel('abcde');
-
-    var tag = new Element.html(
-        '<template><input id="i1" value={{x}}></template>');
-    TemplateBindExtension.bootstrap(tag);
-    var template = templateBind(tag);
-
-    var delegate = usePolymer ? new PolymerExpressions() : null;
-    testDiv.append(template.createInstance(model, delegate));
-
+    testDiv.append(_createTemplateInstance(
+        '<input id="i1" value={{x}}>', model, usePolymer: usePolymer));
     var el;
     return new Future(() {
       el = testDiv.query("#i1");
@@ -247,18 +197,11 @@
 _initialSelectTest(String repeatExp, String valueExp, bool usePolymer) {
   test('initial select value is set correctly', () {
     var list = const ['a', 'b'];
-
-    var tag = new Element.html('<template>'
-        '<select value="{{x}}">'
-        '<option template repeat="$repeatExp" value="$valueExp">item $valueExp'
-        '</option></select></template>',
-        treeSanitizer: _nullTreeSanitizer);
-    TemplateBindExtension.bootstrap(tag);
-    var template = templateBind(tag);
-
     var model = new NotifyModel('b', list);
-    var delegate = usePolymer ? new PolymerExpressions() : null;
-    testDiv.append(template.createInstance(model, delegate));
+    testDiv.append(_createTemplateInstance('<select value="{{x}}">'
+        '<option template repeat="$repeatExp" value="$valueExp">item $valueExp'
+        '</option></select>',
+        model, usePolymer: usePolymer));
 
     expect(testDiv.querySelector('select').value, 'b');
     return new Future(() {
@@ -271,18 +214,11 @@
 _updateSelectTest(String repeatExp, String valueExp, bool usePolymer) {
   test('updates to select value propagate correctly', () {
     var list = const ['a', 'b'];
-
-    var tag = new Element.html('<template>'
-        '<select value="{{x}}">'
-        '<option template repeat="$repeatExp" value="$valueExp">item $valueExp'
-        '</option></select></template>',
-        treeSanitizer: _nullTreeSanitizer);
-    TemplateBindExtension.bootstrap(tag);
-    var template = templateBind(tag);
-
     var model = new NotifyModel('a', list);
-    var delegate = usePolymer ? new PolymerExpressions() : null;
-    testDiv.append(template.createInstance(model, delegate));
+
+    testDiv.append(_createTemplateInstance('<select value="{{x}}">'
+        '<option template repeat="$repeatExp" value="$valueExp">item $valueExp'
+        '</option></select></template>', model, usePolymer: usePolymer));
 
     expect(testDiv.querySelector('select').value, 'a');
     return new Future(() {
@@ -294,6 +230,57 @@
   });
 }
 
+_detectKeyValueChanges(bool usePolymer) {
+  test('detects changes to ObservableMap keys', () {
+    var map = new ObservableMap.from({'a': 1, 'b': 2});
+    var model = new NotifyModel(map);
+    testDiv.append(_createTemplateInstance(
+        '<template repeat="{{x.keys}}">{{}},</template>',
+        model, usePolymer: usePolymer));
+
+    return new Future(() {
+      expect(testDiv.text, 'a,b,');
+      map.remove('b');
+      map['c'] = 3;
+    }).then(_nextMicrotask).then((_) {
+      expect(testDiv.text, 'a,c,');
+      map['a'] = 4;
+    }).then(_nextMicrotask).then((_) {
+      expect(testDiv.text, 'a,c,');
+    });
+  });
+}
+
+// This test uses 'in', which is a polymer_expressions only feature.
+_detectKeyValueChangesPolymerSyntax() {
+  test('detects changes to ObservableMap values', () {
+    var map = new ObservableMap.from({'a': 1, 'b': 2});
+    var model = new NotifyModel(map);
+    testDiv.append(_createTemplateInstance(
+        '<template repeat="{{k in  x.keys}}">{{x[k]}},</template>', model));
+
+    return new Future(() {
+      expect(testDiv.text, '1,2,');
+      map.remove('b');
+      map['c'] = 3;
+    }).then(_nextMicrotask).then((_) {
+      expect(testDiv.text, '1,3,');
+      map['a'] = 4;
+    }).then(_nextMicrotask).then((_) {
+      expect(testDiv.text, '4,3,');
+    });
+  });
+}
+
+_createTemplateInstance(String templateBody, model, {bool usePolymer: true}) {
+  var tag = new Element.html('<template>$templateBody</template>',
+        treeSanitizer: _nullTreeSanitizer);
+  TemplateBindExtension.bootstrap(tag);
+  var template = templateBind(tag);
+  var delegate = usePolymer ? new PolymerExpressions() : null;
+  return template.createInstance(model, delegate);
+}
+
 _nextMicrotask(_) => new Future(() {});
 _afterTimeout(_) => new Future.delayed(new Duration(milliseconds: 30), () {});
 
diff --git a/pkg/smoke/CHANGELOG.md b/pkg/smoke/CHANGELOG.md
index f593356..79842ed 100644
--- a/pkg/smoke/CHANGELOG.md
+++ b/pkg/smoke/CHANGELOG.md
@@ -2,7 +2,14 @@
 
 This file contains highlights of what changes on each version of this package.
 
-#### Pub version 0.2.0-dev
+#### Pub version 0.2.0+2
+  * Widen the constraint on barback.
+
+#### Pub version 0.2.0+1
+  * Switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan`
+    class.
+
+#### Pub version 0.2.0
   * Static configuration can be modified, so code generators can split the
     static configuration in pieces.
   * **breaking change**: for codegen call `writeStaticConfiguration` instead of
diff --git a/pkg/smoke/pubspec.yaml b/pkg/smoke/pubspec.yaml
index afe5211..de1cdcb 100644
--- a/pkg/smoke/pubspec.yaml
+++ b/pkg/smoke/pubspec.yaml
@@ -1,5 +1,5 @@
 name: smoke
-version: 0.2.0-dev
+version: 0.2.0+2
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: "https://api.dartlang.org/apidocs/channels/be/#smoke"
 description: >
@@ -7,7 +7,7 @@
   can be replaced with non-reflective calls using code generation. See README.md
   for mode details.
 dependencies:
-  barback: ">=0.9.0 <0.15.0"
+  barback: ">=0.9.0 <0.16.0"
   logging: ">=0.9.0 <0.10.0"
   analyzer: ">=0.13.0 <0.16.0"
 # TODO(sigmund): once we have some easier way to do global app-level
@@ -19,6 +19,6 @@
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
   path: ">=1.0.0 <2.0.0"
-  code_transformers: ">=0.1.3 <0.2.0"
+  code_transformers: ">=0.2.0 <0.3.0"
 environment:
   sdk: ">=1.3.0-dev.7.9 <2.0.0"
diff --git a/pkg/source_maps/CHANGELOG.md b/pkg/source_maps/CHANGELOG.md
index 6d371c9..a70bc44 100644
--- a/pkg/source_maps/CHANGELOG.md
+++ b/pkg/source_maps/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.10.0
+
+* Remove the `Span`, `Location` and `SourceFile` classes. Use the
+  corresponding `source_span` classes instead.
+
 ## 0.9.4
 
 * Update `SpanFormatException` with `source` and `offset`.
diff --git a/pkg/source_maps/lib/builder.dart b/pkg/source_maps/lib/builder.dart
index 494a6b6..091e220 100644
--- a/pkg/source_maps/lib/builder.dart
+++ b/pkg/source_maps/lib/builder.dart
@@ -9,9 +9,10 @@
 
 import 'dart:convert';
 
+import 'package:source_span/source_span.dart';
+
 import 'parser.dart';
-import 'span.dart';
-import 'src/span_wrapper.dart';
+import 'src/source_map_span.dart';
 
 /// Builds a source map given a set of mappings.
 class SourceMapBuilder {
@@ -19,39 +20,33 @@
   final List<Entry> _entries = <Entry>[];
 
   /// Adds an entry mapping the [targetOffset] to [source].
-  ///
-  /// [source] can be either a [Location] or a [SourceLocation]. Using a
-  /// [Location] is deprecated and will be unsupported in version 0.10.0.
-  void addFromOffset(source, targetFile, int targetOffset, String identifier) {
+  void addFromOffset(SourceLocation source, SourceFile targetFile,
+      int targetOffset, String identifier) {
     if (targetFile == null) {
       throw new ArgumentError('targetFile cannot be null');
     }
-    _entries.add(new Entry(source,
-          new FileLocation(targetFile, targetOffset), identifier));
+    _entries.add(
+        new Entry(source, targetFile.location(targetOffset), identifier));
   }
 
   /// Adds an entry mapping [target] to [source].
   ///
-  /// [source] and [target] can be either a [Span] or a [SourceSpan]. Using a
-  /// [Span] is deprecated and will be unsupported in version 0.10.0.
-  ///
-  /// If [isIdentifier] is true, this entry is considered to represent an
-  /// identifier whose value will be stored in the source map.
-  void addSpan(source, target, {bool isIdentifier}) {
-    source = SpanWrapper.wrap(source);
-    target = SpanWrapper.wrap(target);
-    if (isIdentifier == null) isIdentifier = source.isIdentifier;
+  /// If [isIdentifier] is true or if [target] is a [SourceMapSpan] with
+  /// `isIdentifier` set to true, this entry is considered to represent an
+  /// identifier whose value will be stored in the source map. [isIdenfier]
+  /// takes precedence over [target]'s `isIdentifier` value.
+  void addSpan(SourceSpan source, SourceSpan target, {bool isIdentifier}) {
+    if (isIdentifier == null) {
+      isIdentifier = source is SourceMapSpan ? source.isIdentifier : false;
+    }
 
     var name = isIdentifier ? source.text : null;
     _entries.add(new Entry(source.start, target.start, name));
   }
 
   /// Adds an entry mapping [target] to [source].
-  ///
-  /// [source] and [target] can be either a [Location] or a [SourceLocation].
-  /// Using a [Location] is deprecated and will be unsupported in version
-  /// 0.10.0.
-  void addLocation(source, target, String identifier) {
+  void addLocation(SourceLocation source, SourceLocation target,
+      String identifier) {
     _entries.add(new Entry(source, target, identifier));
   }
 
@@ -67,22 +62,16 @@
 /// An entry in the source map builder.
 class Entry implements Comparable {
   /// Span denoting the original location in the input source file
-  final Location source;
+  final SourceLocation source;
 
   /// Span indicating the corresponding location in the target file.
-  final Location target;
+  final SourceLocation target;
 
   /// An identifier name, when this location is the start of an identifier.
   final String identifierName;
 
   /// Creates a new [Entry] mapping [target] to [source].
-  ///
-  /// [source] and [target] can be either a [Location] or a [SourceLocation].
-  /// Using a [Location] is deprecated and will be unsupported in version
-  /// 0.10.0.
-  Entry(source, target, this.identifierName)
-      : source = LocationWrapper.wrap(source),
-        target = LocationWrapper.wrap(target);
+  Entry(this.source, this.target, this.identifierName);
 
   /// Implements [Comparable] to ensure that entries are ordered by their
   /// location in the target file. We sort primarily by the target offset
@@ -91,7 +80,8 @@
   int compareTo(Entry other) {
     int res = target.compareTo(other.target);
     if (res != 0) return res;
-    res = source.sourceUrl.compareTo(other.source.sourceUrl);
+    res = source.sourceUrl.toString().compareTo(
+        other.source.sourceUrl.toString());
     if (res != 0) return res;
     return source.compareTo(other.source);
   }
diff --git a/pkg/source_maps/lib/parser.dart b/pkg/source_maps/lib/parser.dart
index c18a1d6..d67a65e 100644
--- a/pkg/source_maps/lib/parser.dart
+++ b/pkg/source_maps/lib/parser.dart
@@ -8,9 +8,10 @@
 import 'dart:collection';
 import 'dart:convert';
 
+import 'package:source_span/source_span.dart';
+
 import 'builder.dart' as builder;
-import 'span.dart';
-import 'src/span_wrapper.dart';
+import 'src/source_map_span.dart';
 import 'src/utils.dart';
 import 'src/vlq.dart';
 
@@ -49,19 +50,11 @@
 /// A mapping parsed out of a source map.
 abstract class Mapping {
   /// Returns the span associated with [line] and [column].
-  ///
-  /// The values of [files] can be either `source_map` [SourceFile]s or
-  /// `source_span` `SourceFile`s. Using `source_map` [SourceFile]s is
-  /// deprecated and will be unsupported in version 0.10.0.
-  Span spanFor(int line, int column, {Map<String, dynamic> files});
+  SourceMapSpan spanFor(int line, int column, {Map<String, SourceFile> files});
 
   /// Returns the span associated with [location].
-  ///
-  /// The values of [files] may be either `source_map` [SourceFile]s or
-  /// `source_span` `SourceFile`s. Using `source_map` [SourceFile]s is
-  /// deprecated and will be unsupported in version 0.10.0.
-  Span spanForLocation(location, {Map<String, dynamic> files}) {
-    location = LocationWrapper.wrap(location);
+  SourceMapSpan spanForLocation(SourceLocation location,
+      {Map<String, SourceFile> files}) {
     return spanFor(location.line, location.column, files: files);
   }
 }
@@ -124,7 +117,7 @@
     return _lineStart.length - 1;
   }
 
-  Span spanFor(int line, int column, {Map<String, dynamic> files}) {
+  SourceMapSpan spanFor(int line, int column, {Map<String, SourceFile> files}) {
     int index = _indexFor(line, column);
     return _maps[index].spanFor(
         line - _lineStart[index], column - _columnStart[index], files: files);
@@ -191,8 +184,9 @@
       if (sourceEntry.source == null) {
         targetEntries.add(new TargetEntry(sourceEntry.target.column));
       } else {
+        var sourceUrl = sourceEntry.source.sourceUrl;
         var urlId = urls.putIfAbsent(
-            sourceEntry.source.sourceUrl, () => urls.length);
+            sourceUrl == null ? '' : sourceUrl.toString(), () => urls.length);
         var srcNameId = sourceEntry.identifierName == null ? null :
             names.putIfAbsent(sourceEntry.identifierName, () => names.length);
         targetEntries.add(new TargetEntry(
@@ -363,7 +357,7 @@
     return (index <= 0) ? null : entries[index - 1];
   }
 
-  Span spanFor(int line, int column, {Map<String, dynamic> files}) {
+  SourceMapSpan spanFor(int line, int column, {Map<String, SourceFile> files}) {
     var entry = _findColumn(line, column, _findLine(line));
     if (entry == null || entry.sourceUrlId == null) return null;
     var url = urls[entry.sourceUrlId];
@@ -371,21 +365,24 @@
       url = '${sourceRoot}${url}';
     }
     if (files != null && files[url] != null) {
-      var file = SourceFileWrapper.wrap(files[url]);
+      var file = files[url];
       var start = file.getOffset(entry.sourceLine, entry.sourceColumn);
       if (entry.sourceNameId != null) {
         var text = names[entry.sourceNameId];
-        return new FileSpan(files[url], start, start + text.length, true);
+        return new SourceMapFileSpan(
+            files[url].span(start, start + text.length),
+            isIdentifier: true);
       } else {
-        return new FileSpan(files[url], start);
+        return new SourceMapFileSpan(files[url].location(start).pointSpan());
       }
     } else {
+      var start = new SourceLocation(0,
+          sourceUrl: url, line: entry.sourceLine, column: entry.sourceColumn);
       // Offset and other context is not available.
       if (entry.sourceNameId != null) {
-        return new FixedSpan(url, 0, entry.sourceLine, entry.sourceColumn,
-            text: names[entry.sourceNameId], isIdentifier: true);
+        return new SourceMapSpan.identifier(start, names[entry.sourceNameId]);
       } else {
-        return new FixedSpan(url, 0, entry.sourceLine, entry.sourceColumn);
+        return new SourceMapSpan(start, start, '');
       }
     }
   }
diff --git a/pkg/source_maps/lib/printer.dart b/pkg/source_maps/lib/printer.dart
index aa18bd7..906e260 100644
--- a/pkg/source_maps/lib/printer.dart
+++ b/pkg/source_maps/lib/printer.dart
@@ -5,11 +5,10 @@
 /// Contains a code printer that generates code by recording the source maps.
 library source_maps.printer;
 
-import 'package:source_span/source_span.dart' as source_span;
+import 'package:source_span/source_span.dart';
 
 import 'builder.dart';
-import 'span.dart';
-import 'src/span_wrapper.dart';
+import 'src/source_map_span.dart';
 
 const int _LF = 10;
 const int _CR = 13;
@@ -24,7 +23,7 @@
   String get map => _maps.toJson(filename);
 
   /// Current source location mapping.
-  Location _loc;
+  SourceLocation _loc;
 
   /// Current line in the buffer;
   int _line = 0;
@@ -49,11 +48,12 @@
         _line++;
         _column = 0;
         if (projectMarks && _loc != null) {
-          if (_loc is FixedLocation) {
-            mark(new FixedLocation(0, _loc.sourceUrl, _loc.line + 1, 0));
-          } else if (_loc is FileLocation) {
+          if (_loc is FileLocation) {
             var file = (_loc as FileLocation).file;
-            mark(new FileLocation(file, file.getOffset(_loc.line + 1, 0)));
+            mark(file.location(file.getOffset(_loc.line + 1)));
+          } else {
+            mark(new SourceLocation(0,
+                sourceUrl: _loc.sourceUrl, line: _loc.line + 1, column: 0));
           }
         }
       } else {
@@ -72,21 +72,23 @@
   }
 
   /// Marks that the current point in the target file corresponds to the [mark]
-  /// in the source file, which can be either a [Location] or a [Span]. When the
-  /// mark is an identifier's Span, this also records the name of the identifier
-  /// in the source map information.
+  /// in the source file, which can be either a [SourceLocation] or a
+  /// [SourceSpan]. When the mark is a [SourceMapSpan] with `isIdentifier` set,
+  /// this also records the name of the identifier in the source map
+  /// information.
   void mark(mark) {
     var loc;
     var identifier = null;
-    if (mark is Location || mark is source_span.SourceLocation) {
-      loc = LocationWrapper.wrap(mark);
-    } else if (mark is Span || mark is source_span.SourceSpan) {
-      mark = SpanWrapper.wrap(mark);
+    if (mark is SourceLocation) {
+      loc = mark;
+    } else if (mark is SourceSpan) {
       loc = mark.start;
-      if (mark.isIdentifier) identifier = mark.text;
+      if (mark is SourceMapSpan && mark.isIdentifier) identifier = mark.text;
     }
-    _maps.addLocation(loc,
-        new FixedLocation(_buff.length, null, _line, _column), identifier);
+    _maps.addLocation(
+        loc,
+        new SourceLocation(_buff.length, line: _line, column: _column),
+        identifier);
     _loc = loc;
   }
 }
@@ -101,7 +103,8 @@
 class NestedPrinter implements NestedItem {
 
   /// Items recoded by this printer, which can be [String] literals,
-  /// [NestedItem]s, and source map information like [Location] and [Span].
+  /// [NestedItem]s, and source map information like [SourceLocation] and
+  /// [SourceSpan].
   List _items = [];
 
   /// Internal buffer to merge consecutive strings added to this printer.
@@ -128,19 +131,16 @@
   /// location of [object] in the original input. Only one, [location] or
   /// [span], should be provided at a time.
   ///
-  /// [location] can be either a [Location] or a [SourceLocation]. [span] can be
-  /// either a [Span] or a [SourceSpan]. Using a [Location] or a [Span] is
-  /// deprecated and will be unsupported in version 0.10.0.
-  ///
   /// Indicate [isOriginal] when [object] is copied directly from the user code.
   /// Setting [isOriginal] will make this printer propagate source map locations
   /// on every line-break.
-  void add(object, {location, span, bool isOriginal: false}) {
+  void add(object, {SourceLocation location, SourceSpan span,
+      bool isOriginal: false}) {
     if (object is! String || location != null || span != null || isOriginal) {
       _flush();
       assert(location == null || span == null);
-      if (location != null) _items.add(LocationWrapper.wrap(location));
-      if (span != null) _items.add(SpanWrapper.wrap(span));
+      if (location != null) _items.add(location);
+      if (span != null) _items.add(span);
       if (isOriginal) _items.add(_ORIGINAL);
     }
 
@@ -164,16 +164,12 @@
   /// The [location] and [span] parameters indicate the corresponding source map
   /// location of [object] in the original input. Only one, [location] or
   /// [span], should be provided at a time.
-  ///
-  /// [location] can be either a [Location] or a [SourceLocation]. [span] can be
-  /// either a [Span] or a [SourceSpan]. Using a [Location] or a [Span] is
-  /// deprecated and will be unsupported in version 0.10.0.
-  void addLine(String line, {location, span}) {
+  void addLine(String line, {SourceLocation location, SourceSpan span}) {
     if (location != null || span != null) {
       _flush();
       assert(location == null || span == null);
-      if (location != null) _items.add(LocationWrapper.wrap(location));
-      if (span != null) _items.add(SpanWrapper.wrap(span));
+      if (location != null) _items.add(location);
+      if (span != null) _items.add(span);
     }
     if (line == null) return;
     if (line != '') {
@@ -235,7 +231,7 @@
       } else if (item is String) {
         printer.add(item, projectMarks: propagate);
         propagate = false;
-      } else if (item is Location || item is Span) {
+      } else if (item is SourceLocation || item is SourceSpan) {
         printer.mark(item);
       } else if (item == _ORIGINAL) {
         // we insert booleans when we are about to quote text that was copied
diff --git a/pkg/source_maps/lib/refactor.dart b/pkg/source_maps/lib/refactor.dart
index 47ce2ed9..a33b86b 100644
--- a/pkg/source_maps/lib/refactor.dart
+++ b/pkg/source_maps/lib/refactor.dart
@@ -8,9 +8,9 @@
 /// [guessIndent] helps to guess the appropriate indentiation for the new code.
 library source_maps.refactor;
 
-import 'span.dart';
+import 'package:source_span/source_span.dart';
+
 import 'printer.dart';
-import 'src/span_wrapper.dart';
 
 /// Editable text transaction.
 ///
@@ -22,12 +22,7 @@
   final _edits = <_TextEdit>[];
 
   /// Creates a new transaction.
-  ///
-  /// [file] can be either a `source_map` [SourceFile] or a `source_span`
-  /// `SourceFile`. Using a `source_map` [SourceFile] is deprecated and will be
-  /// unsupported in version 0.10.0.
-  TextEditTransaction(this.original, file)
-      : file = SourceFileWrapper.wrap(file);
+  TextEditTransaction(this.original, this.file);
 
   bool get hasEdits => _edits.length > 0;
 
@@ -38,8 +33,8 @@
     _edits.add(new _TextEdit(begin, end, replacement));
   }
 
-  /// Create a source map [Location] for [offset].
-  Location _loc(int offset) =>
+  /// Create a source map [SourceLocation] for [offset].
+  SourceLocation _loc(int offset) =>
       file != null ? file.location(offset) : null;
 
   /// Applies all pending [edit]s and returns a [NestedPrinter] containing the
@@ -62,7 +57,7 @@
     for (var edit in _edits) {
       if (consumed > edit.begin) {
         var sb = new StringBuffer();
-        sb..write(file.location(edit.begin).formatString)
+        sb..write(file.location(edit.begin).toolString)
             ..write(': overlapping edits. Insert at offset ')
             ..write(edit.begin)
             ..write(' but have consumed ')
diff --git a/pkg/source_maps/lib/source_maps.dart b/pkg/source_maps/lib/source_maps.dart
index 2d4a4cc..9531903 100644
--- a/pkg/source_maps/lib/source_maps.dart
+++ b/pkg/source_maps/lib/source_maps.dart
@@ -11,7 +11,8 @@
 ///         ..add(inputSpan3, outputSpan3)
 ///         .toJson(outputFile);
 ///
-/// Use the [Span] and [SourceFile] classes to specify span locations.
+/// Use the source_span package's [SourceSpan] and [SourceFile] classes to
+/// specify span locations.
 ///
 /// Parse a source map using [parse], and call `spanFor` on the returned mapping
 /// object. For example:
@@ -40,4 +41,4 @@
 export "parser.dart";
 export "printer.dart";
 export "refactor.dart";
-export "span.dart";
+export 'src/source_map_span.dart';
diff --git a/pkg/source_maps/lib/span.dart b/pkg/source_maps/lib/span.dart
deleted file mode 100644
index a21e893..0000000
--- a/pkg/source_maps/lib/span.dart
+++ /dev/null
@@ -1,404 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Dart classes representing the souce spans and source files.
-library source_maps.span;
-
-import 'dart:math' show min, max;
-
-import 'package:path/path.dart' as p;
-
-import 'src/utils.dart';
-
-/// A simple class that describe a segment of source text.
-@Deprecated("Use the source_span package instead.")
-abstract class Span implements Comparable {
-  /// The start location of this span.
-  final Location start;
-
-  /// The end location of this span, exclusive.
-  final Location end;
-
-  /// Url of the source (typically a file) containing this span.
-  String get sourceUrl => start.sourceUrl;
-
-  /// The length of this span, in characters.
-  int get length => end.offset - start.offset;
-
-  /// The source text for this span, if available.
-  String get text;
-
-  /// Whether [text] corresponds to an identifier symbol.
-  final bool isIdentifier;
-
-  Span(this.start, this.end, bool isIdentifier)
-      : isIdentifier = isIdentifier != null ? isIdentifier : false {
-    _checkRange();
-  }
-
-  /// Creates a new span that is the union of two existing spans [start] and
-  /// [end]. Note that the resulting span might contain some positions that were
-  /// not in either of the original spans if [start] and [end] are disjoint.
-  Span.union(Span start, Span end)
-      : start = start.start, end = end.end, isIdentifier = false {
-    _checkRange();
-  }
-
-  void _checkRange() {
-    if (start.offset < 0) throw new ArgumentError('start $start must be >= 0');
-    if (end.offset < start.offset) {
-      throw new ArgumentError('end $end must be >= start $start');
-    }
-  }
-
-  /// Compares two spans. If the spans are not in the same source, this method
-  /// generates an error.
-  int compareTo(Span other) {
-    int d = start.compareTo(other.start);
-    return d == 0 ? end.compareTo(other.end) : d;
-  }
-
-  /// Gets the location in standard printed form `filename:line:column`, where
-  /// line and column are adjusted by 1 to match the convention in editors.
-  String get formatLocation => start.formatString;
-
-  String getLocationMessage(String message,
-      {bool useColors: false, String color}) {
-    var source = start.sourceUrl == null ? '' :
-        ' of ${p.prettyUri(start.sourceUrl)}';
-    return 'line ${start.line + 1}, column ${start.column + 1}$source: ' +
-        message;
-  }
-
-  bool operator ==(Span other) =>
-    sourceUrl == other.sourceUrl && start == other.start && end == other.end;
-
-  int get hashCode => sourceUrl.hashCode + start.offset + (31 * length);
-
-  String toString() => '<$runtimeType: $start $end $formatLocation $text>';
-}
-
-/// A location in the source text
-@Deprecated("Use the source_span package instead.")
-abstract class Location implements Comparable {
-  /// Url of the source containing this span.
-  String get sourceUrl;
-
-  /// The offset of this location, 0-based.
-  final int offset;
-
-  /// The 0-based line in the source of this location.
-  int get line;
-
-  /// The 0-based column in the source of this location.
-  int get column;
-
-  Location(this.offset);
-
-  /// Compares two locations. If the locations are not in the same source, this
-  /// method generates an error.
-  int compareTo(Location other) {
-    if (sourceUrl != other.sourceUrl) {
-      throw new ArgumentError('can only compare locations of the same source');
-    }
-    return offset - other.offset;
-  }
-
-  bool operator ==(Location other) =>
-      sourceUrl == other.sourceUrl && offset == other.offset;
-
-  int get hashCode => sourceUrl.hashCode + offset;
-
-  String toString() => '(Location $offset)';
-  String get formatString => '$sourceUrl:${line + 1}:${column + 1}';
-}
-
-/// Implementation of [Location] with fixed values given at allocation time.
-@Deprecated("Use the source_span package instead.")
-class FixedLocation extends Location {
-  final String sourceUrl;
-  final int line;
-  final int column;
-
-  FixedLocation(int offset, this.sourceUrl, this.line, this.column)
-      : super(offset);
-}
-
-/// Implementation of [Span] where all the values are given at allocation time.
-@Deprecated("Use the source_span package instead.")
-class FixedSpan extends Span {
-  /// The source text for this span, if available.
-  final String text;
-
-  /// Creates a span which starts and end in the same line.
-  FixedSpan(String sourceUrl, int start, int line, int column,
-            {String text: '', bool isIdentifier: false})
-      : text = text, super(new FixedLocation(start, sourceUrl, line, column),
-            new FixedLocation(start + text.length, sourceUrl, line,
-                column + text.length),
-            isIdentifier);
-}
-
-/// [Location] with values computed from an underling [SourceFile].
-@Deprecated("Use the source_span package instead.")
-class FileLocation extends Location {
-  /// The source file containing this location.
-  final SourceFile file;
-
-  String get sourceUrl => file.url;
-  int get line => file.getLine(offset);
-  int get column => file.getColumn(line, offset);
-
-  FileLocation(this.file, int offset): super(offset);
-}
-
-/// [Span] where values are computed from an underling [SourceFile].
-@Deprecated("Use the source_span package instead.")
-class FileSpan extends Span {
-  /// The source file containing this span.
-  final SourceFile file;
-
-  /// The source text for this span, if available.
-  String get text => file.getText(start.offset, end.offset);
-
-  factory FileSpan(SourceFile file, int start,
-      [int end, bool isIdentifier = false]) {
-    var startLoc = new FileLocation(file, start);
-    var endLoc = end == null ? startLoc : new FileLocation(file, end);
-    return new FileSpan.locations(startLoc, endLoc, isIdentifier);
-  }
-
-  FileSpan.locations(FileLocation start, FileLocation end,
-      bool isIdentifier)
-      : file = start.file, super(start, end, isIdentifier);
-
-  /// Creates a new span that is the union of two existing spans [start] and
-  /// [end]. Note that the resulting span might contain some positions that were
-  /// not in either of the original spans if [start] and [end] are disjoint.
-  FileSpan.union(FileSpan start, FileSpan end)
-      : file = start.file, super.union(start, end) {
-    if (start.file != end.file) {
-      throw new ArgumentError('start and end must be from the same file');
-    }
-  }
-
-  String getLocationMessage(String message,
-      {bool useColors: false, String color}) {
-    return file.getLocationMessage(message, start.offset, end.offset,
-        useColors: useColors, color: color);
-  }
-}
-
-// Constants to determine end-of-lines.
-const int _LF = 10;
-const int _CR = 13;
-
-// Color constants used for generating messages.
-const String _RED_COLOR = '\u001b[31m';
-const String _NO_COLOR = '\u001b[0m';
-
-/// Stores information about a source file, to permit computation of the line
-/// and column. Also contains a nice default error message highlighting the code
-/// location.
-@Deprecated("Use the source_span package instead.")
-class SourceFile {
-  /// Url where the source file is located.
-  final String url;
-  final List<int> _lineStarts;
-  final List<int> _decodedChars;
-
-  SourceFile(this.url, this._lineStarts, this._decodedChars);
-
-  SourceFile.text(this.url, String text)
-      : _lineStarts = <int>[0],
-        _decodedChars = text.runes.toList() {
-    for (int i = 0; i < _decodedChars.length; i++) {
-      var c = _decodedChars[i];
-      if (c == _CR) {
-        // Return not followed by newline is treated as a newline
-        int j = i + 1;
-        if (j >= _decodedChars.length || _decodedChars[j] != _LF) {
-          c = _LF;
-        }
-      }
-      if (c == _LF) _lineStarts.add(i + 1);
-    }
-  }
-
-  /// Returns a span in this [SourceFile] with the given offsets.
-  Span span(int start, [int end, bool isIdentifier = false]) =>
-      new FileSpan(this, start, end, isIdentifier);
-
-  /// Returns a location in this [SourceFile] with the given offset.
-  Location location(int offset) => new FileLocation(this, offset);
-
-  /// Gets the 0-based line corresponding to an offset.
-  int getLine(int offset) => binarySearch(_lineStarts, (o) => o > offset) - 1;
-
-  /// Gets the 0-based column corresponding to an offset.
-  int getColumn(int line, int offset) {
-    if (line < 0 || line >= _lineStarts.length) return 0;
-    return offset - _lineStarts[line];
-  }
-
-  /// Get the offset for a given line and column
-  int getOffset(int line, int column) {
-    if (line < 0) return getOffset(0, 0);
-    if (line < _lineStarts.length) {
-      return _lineStarts[line] + column;
-    } else {
-      return _decodedChars.length;
-    }
-  }
-
-  /// Gets the text at the given offsets.
-  String getText(int start, [int end]) =>
-      new String.fromCharCodes(_decodedChars.sublist(max(start, 0), end));
-
-  /// Create a pretty string representation from a span.
-  String getLocationMessage(String message, int start, int end,
-      {bool useColors: false, String color}) {
-    // TODO(jmesserly): it would be more useful to pass in an object that
-    // controls how the errors are printed. This method is a bit too smart.
-    var line = getLine(start);
-    var column = getColumn(line, start);
-
-    var source = url == null ? '' : ' of ${p.prettyUri(url)}';
-    var msg = 'line ${line + 1}, column ${column + 1}$source: $message';
-
-    if (_decodedChars == null) {
-      // We don't have any text to include, so exit.
-      return msg;
-    }
-
-    var buf = new StringBuffer(msg);
-    buf.write('\n');
-
-    // +1 for 0-indexing, +1 again to avoid the last line
-    var textLine = getText(getOffset(line, 0), getOffset(line + 1, 0));
-
-    column = min(column, textLine.length - 1);
-    int toColumn = min(column + end - start, textLine.length);
-    if (useColors) {
-      if (color == null) {
-        color = _RED_COLOR;
-      }
-      buf.write(textLine.substring(0, column));
-      buf.write(color);
-      buf.write(textLine.substring(column, toColumn));
-      buf.write(_NO_COLOR);
-      buf.write(textLine.substring(toColumn));
-    } else {
-      buf.write(textLine);
-      if (textLine != '' && !textLine.endsWith('\n')) buf.write('\n');
-    }
-
-    int i = 0;
-    for (; i < column; i++) {
-      buf.write(' ');
-    }
-
-    if (useColors) buf.write(color);
-    for (; i < toColumn; i++) {
-      buf.write('^');
-    }
-    if (useColors) buf.write(_NO_COLOR);
-    return buf.toString();
-  }
-}
-
-/// A convenience type to treat a code segment as if it were a separate
-/// [SourceFile]. A [SourceFileSegment] shifts all locations by an offset, which
-/// allows you to set source-map locations based on the locations relative to
-/// the start of the segment, but that get translated to absolute locations in
-/// the original source file.
-@Deprecated("Use the source_span package instead.")
-class SourceFileSegment extends SourceFile {
-  final int _baseOffset;
-  final int _baseLine;
-  final int _baseColumn;
-  final int _maxOffset;
-
-  SourceFileSegment(String url, String textSegment, Location startOffset)
-      : _baseOffset = startOffset.offset,
-        _baseLine = startOffset.line,
-        _baseColumn = startOffset.column,
-        _maxOffset = startOffset.offset + textSegment.length,
-        super.text(url, textSegment);
-
-  /// Craete a span, where [start] is relative to this segment's base offset.
-  /// The returned span stores the real offset on the file, so that error
-  /// messages are reported at the real location.
-  Span span(int start, [int end, bool isIdentifier = false]) =>
-      super.span(start + _baseOffset,
-          end == null ? null : end + _baseOffset, isIdentifier);
-
-  /// Create a location, where [offset] relative to this segment's base offset.
-  /// The returned span stores the real offset on the file, so that error
-  /// messages are reported at the real location.
-  Location location(int offset) => super.location(offset + _baseOffset);
-
-  /// Return the line on the underlying file associated with the [offset] of the
-  /// underlying file. This method operates on the real offsets from the
-  /// original file, so that error messages can be reported accurately. When the
-  /// requested offset is past the length of the segment, this returns the line
-  /// number after the end of the segment (total lines + 1).
-  int getLine(int offset) {
-    var res = super.getLine(max(offset - _baseOffset, 0)) + _baseLine;
-    return (offset > _maxOffset) ? res + 1 : res;
-  }
-
-  /// Return the column on the underlying file associated with [line] and
-  /// [offset], where [line] is absolute from the beginning of the underlying
-  /// file. This method operates on the real offsets from the original file, so
-  /// that error messages can be reported accurately.
-  int getColumn(int line, int offset) {
-    var col = super.getColumn(line - _baseLine, max(offset - _baseOffset, 0));
-    return line == _baseLine ? col + _baseColumn : col;
-  }
-
-  /// Return the offset associated with a line and column. This method operates
-  /// on the real offsets from the original file, so that error messages can be
-  /// reported accurately.
-  int getOffset(int line, int column) =>
-    super.getOffset(line - _baseLine,
-        line == _baseLine ? column - _baseColumn : column) + _baseOffset;
-
-  /// Retrieve the text associated with the specified range. This method
-  /// operates on the real offsets from the original file, so that error
-  /// messages can be reported accurately.
-  String getText(int start, [int end]) =>
-    super.getText(start - _baseOffset, end == null ? null : end - _baseOffset);
-}
-
-/// A class for exceptions that have source span information attached.
-@Deprecated("Use the source_span package instead.")
-class SpanException implements Exception {
-  /// A message describing the exception.
-  final String message;
-
-  /// The span associated with this exception.
-  ///
-  /// This may be `null` if the source location can't be determined.
-  final Span span;
-
-  SpanException(this.message, this.span);
-
-  String toString({bool useColors: false, String color}) {
-    if (span == null) return message;
-    return "Error on " + span.getLocationMessage(message,
-        useColors: useColors, color: color);
-  }
-}
-
-/// A [SpanException] that's also a [FormatException].
-@Deprecated("Use the source_span package instead.")
-class SpanFormatException extends SpanException implements FormatException {
-  final source;
-
-  SpanFormatException(String message, Span span, [this.source])
-      : super(message, span);
-
-  int get offset => span == null ? null : span.start.offset;
-}
diff --git a/pkg/source_maps/lib/src/source_map_span.dart b/pkg/source_maps/lib/src/source_map_span.dart
new file mode 100644
index 0000000..20eb17a
--- /dev/null
+++ b/pkg/source_maps/lib/src/source_map_span.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source_maps.source_map_span;
+
+import 'package:source_span/source_span.dart';
+
+/// A [SourceSpan] for spans coming from or being written to source maps.
+///
+/// These spans have an extra piece of metadata: whether or not they represent
+/// an identifier (see [isIdentifier]).
+class SourceMapSpan extends SourceSpanBase {
+  /// Whether this span represents an identifier.
+  ///
+  /// If this is `true`, [text] is the value of the identifier.
+  final bool isIdentifier;
+
+  SourceMapSpan(SourceLocation start, SourceLocation end, String text,
+          {this.isIdentifier: false})
+      : super(start, end, text);
+
+  /// Creates a [SourceMapSpan] for an identifier with value [text] starting at
+  /// [start].
+  ///
+  /// The [end] location is determined by adding [text] to [start].
+  SourceMapSpan.identifier(SourceLocation start, String text)
+      : this(
+          start,
+          new SourceLocation(start.offset + text.length,
+              sourceUrl: start.sourceUrl,
+              line: start.line,
+              column: start.column + text.length),
+          text,
+          isIdentifier: true);
+}
+
+/// A wrapper aruond a [FileSpan] that implements [SourceMapSpan].
+class SourceMapFileSpan implements SourceMapSpan, FileSpan {
+  final FileSpan _inner;
+  final bool isIdentifier;
+
+  SourceFile get file => _inner.file;
+  FileLocation get start => _inner.start;
+  FileLocation get end => _inner.end;
+  String get text => _inner.text;
+  Uri get sourceUrl => _inner.sourceUrl;
+  int get length => _inner.length;
+
+  SourceMapFileSpan(this._inner, {this.isIdentifier: false});
+
+  int compareTo(SourceSpan other) => _inner.compareTo(other);
+  SourceSpan union(SourceSpan other) => _inner.union(other);
+  FileSpan expand(FileSpan other) => _inner.expand(other);
+  String message(String message, {color}) =>
+      _inner.message(message, color: color);
+  String toString() => _inner.toString()
+      .replaceAll("FileSpan", "SourceMapFileSpan");
+}
diff --git a/pkg/source_maps/lib/src/span_wrapper.dart b/pkg/source_maps/lib/src/span_wrapper.dart
deleted file mode 100644
index e0c107b..0000000
--- a/pkg/source_maps/lib/src/span_wrapper.dart
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library source_maps.span_wrapper;
-
-import 'package:source_span/source_span.dart' as source_span;
-
-import '../span.dart';
-
-/// A wrapper that exposes a [source_span.SourceSpan] as a [Span].
-class SpanWrapper extends Span {
-  final source_span.SourceSpan _inner;
-
-  String get text => _inner.text;
-
-  SpanWrapper(source_span.SourceSpan inner, bool isIdentifier)
-      : _inner = inner,
-        super(
-            new LocationWrapper(inner.start),
-            new LocationWrapper(inner.end),
-            isIdentifier);
-
-  static Span wrap(span, [bool isIdentifier = false]) {
-    if (span is Span) return span;
-    return new SpanWrapper(span, isIdentifier);
-  }
-}
-
-/// A wrapper that exposes a [source_span.SourceLocation] as a [Location].
-class LocationWrapper extends Location {
-  final source_span.SourceLocation _inner;
-
-  String get sourceUrl => _inner.sourceUrl.toString();
-  int get line => _inner.line;
-  int get column => _inner.column;
-
-  LocationWrapper(source_span.SourceLocation inner)
-      : _inner = inner,
-        super(inner.offset);
-
-  static Location wrap(location) {
-    if (location is Location) return location;
-    return new LocationWrapper(location);
-  }
-}
-
-/// A wrapper that exposes a [source_span.SourceFile] as a [SourceFile].
-class SourceFileWrapper implements SourceFile {
-  final source_span.SourceFile _inner;
-
-  // These are necessary to avoid analyzer warnings;
-  final _lineStarts = null;
-  final _decodedChars = null;
-
-  String get url => _inner.url.toString();
-
-  SourceFileWrapper(this._inner);
-
-  static SourceFile wrap(sourceFile) {
-    if (sourceFile is SourceFile) return sourceFile;
-    return new SourceFileWrapper(sourceFile);
-  }
-
-  Span span(int start, [int end, bool isIdentifier = false]) {
-    if (end == null) end = start;
-    return new SpanWrapper(_inner.span(start, end), isIdentifier);
-  }
-
-  Location location(int offset) => new LocationWrapper(_inner.location(offset));
-
-  int getLine(int offset) => _inner.getLine(offset);
-
-  int getColumn(int line, int offset) => _inner.getColumn(offset, line: line);
-
-  int getOffset(int line, int column) => _inner.getOffset(line, column);
-
-  String getText(int start, [int end]) => _inner.getText(start, end);
-
-  String getLocationMessage(String message, int start, int end,
-      {bool useColors: false, String color}) {
-    return span(start, end).getLocationMessage(message,
-        useColors: useColors, color: color);
-  }
-}
diff --git a/pkg/source_maps/pubspec.yaml b/pkg/source_maps/pubspec.yaml
index 0548215..4af996e 100644
--- a/pkg/source_maps/pubspec.yaml
+++ b/pkg/source_maps/pubspec.yaml
@@ -1,13 +1,5 @@
 name: source_maps
-
-# Note! This version number is referenced directly in the pub source code in
-# lib/src/barback.dart. Pub implicitly places a version constraint on
-# source_maps to ensure users only select a version of source_maps that works
-# with their current version of pub.
-#
-# When the minor version is upgraded, you *must* update that version constraint
-# in pub to stay in sync with this.
-version: 0.9.4-dev
+version: 0.10.0
 author: Dart Team <misc@dartlang.org>
 description: Library to programmatically manipulate source map files.
 homepage: http://www.dartlang.org
diff --git a/pkg/source_maps/test/builder_test.dart b/pkg/source_maps/test/builder_test.dart
index 8842c62..ca0ca8d 100644
--- a/pkg/source_maps/test/builder_test.dart
+++ b/pkg/source_maps/test/builder_test.dart
@@ -16,7 +16,7 @@
         ..addSpan(inputFunction, outputFunction)
         ..addSpan(inputVar2, outputVar2)
         ..addSpan(inputExpr, outputExpr))
-        .build(output.url);
+        .build(output.url.toString());
     expect(map, equals(EXPECTED_MAP));
   });
 
@@ -26,7 +26,7 @@
         ..addLocation(inputFunction.start, outputFunction.start, 'longName')
         ..addLocation(inputVar2.start, outputVar2.start, 'longVar2')
         ..addLocation(inputExpr.start, outputExpr.start, null))
-        .toJson(output.url);
+        .toJson(output.url.toString());
     expect(str, JSON.encode(EXPECTED_MAP));
   });
 }
diff --git a/pkg/source_maps/test/common.dart b/pkg/source_maps/test/common.dart
index 0c1f28a..73a8d40 100644
--- a/pkg/source_maps/test/common.dart
+++ b/pkg/source_maps/test/common.dart
@@ -6,6 +6,7 @@
 library test.common;
 
 import 'package:source_maps/source_maps.dart';
+import 'package:source_span/source_span.dart';
 import 'package:unittest/unittest.dart';
 
 /// Content of the source file
@@ -18,40 +19,40 @@
   return longVar1 + longVar2;
 }
 ''';
-var input = new SourceFile.text('input.dart', INPUT);
+var input = new SourceFile(INPUT, url: 'input.dart');
 
 /// A span in the input file
-Span ispan(int start, int end, [bool isIdentifier = false]) =>
-    new FileSpan(input, start, end, isIdentifier);
+SourceMapSpan ispan(int start, int end, [bool isIdentifier = false]) =>
+    new SourceMapFileSpan(input.span(start, end), isIdentifier: isIdentifier);
 
-Span inputVar1 = ispan(30, 38, true);
-Span inputFunction = ispan(74, 82, true);
-Span inputVar2 = ispan(87, 95, true);
+SourceMapSpan inputVar1 = ispan(30, 38, true);
+SourceMapSpan inputFunction = ispan(74, 82, true);
+SourceMapSpan inputVar2 = ispan(87, 95, true);
 
-Span inputVar1NoSymbol = ispan(30, 38);
-Span inputFunctionNoSymbol = ispan(74, 82);
-Span inputVar2NoSymbol = ispan(87, 95);
+SourceMapSpan inputVar1NoSymbol = ispan(30, 38);
+SourceMapSpan inputFunctionNoSymbol = ispan(74, 82);
+SourceMapSpan inputVar2NoSymbol = ispan(87, 95);
 
-Span inputExpr = ispan(108, 127);
+SourceMapSpan inputExpr = ispan(108, 127);
 
 /// Content of the target file
 const String OUTPUT = '''
 var x = 3;
 f(y) => x + y;
 ''';
-var output = new SourceFile.text('output.dart', OUTPUT);
+var output = new SourceFile(OUTPUT, url: 'output.dart');
 
 /// A span in the output file
-Span ospan(int start, int end, [bool isIdentifier = false]) =>
-    new FileSpan(output, start, end, isIdentifier);
+SourceMapSpan ospan(int start, int end, [bool isIdentifier = false]) =>
+    new SourceMapFileSpan(output.span(start, end), isIdentifier: isIdentifier);
 
-Span outputVar1 = ospan(4, 5, true);
-Span outputFunction = ospan(11, 12, true);
-Span outputVar2 = ospan(13, 14, true);
-Span outputVar1NoSymbol = ospan(4, 5);
-Span outputFunctionNoSymbol = ospan(11, 12);
-Span outputVar2NoSymbol = ospan(13, 14);
-Span outputExpr = ospan(19, 24);
+SourceMapSpan outputVar1 = ospan(4, 5, true);
+SourceMapSpan outputFunction = ospan(11, 12, true);
+SourceMapSpan outputVar2 = ospan(13, 14, true);
+SourceMapSpan outputVar1NoSymbol = ospan(4, 5);
+SourceMapSpan outputFunctionNoSymbol = ospan(11, 12);
+SourceMapSpan outputVar2NoSymbol = ospan(13, 14);
+SourceMapSpan outputExpr = ospan(19, 24);
 
 /// Expected output mapping when recording the following four mappings:
 ///      inputVar1       <=   outputVar1
@@ -70,7 +71,8 @@
     'file': 'output.dart'
 };
 
-check(Span outputSpan, Mapping mapping, Span inputSpan, bool realOffsets) {
+check(SourceSpan outputSpan, Mapping mapping, SourceMapSpan inputSpan,
+    bool realOffsets) {
   var line = outputSpan.start.line;
   var column = outputSpan.start.column;
   var files = realOffsets ? {'input.dart': input} : null; 
diff --git a/pkg/source_maps/test/end2end_test.dart b/pkg/source_maps/test/end2end_test.dart
index 99fe40d..7dbc6bd 100644
--- a/pkg/source_maps/test/end2end_test.dart
+++ b/pkg/source_maps/test/end2end_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:unittest/unittest.dart';
 import 'package:source_maps/source_maps.dart';
+import 'package:source_span/source_span.dart';
 import 'common.dart';
 
 main() {
@@ -33,7 +34,7 @@
         ..addSpan(inputFunction, outputFunction)
         ..addSpan(inputVar2, outputVar2)
         ..addSpan(inputExpr, outputExpr))
-        .build(output.url);
+        .build(output.url.toString());
     var mapping = parseJson(map);
     check(outputVar1, mapping, inputVar1, false);
     check(outputVar2, mapping, inputVar2, false);
@@ -47,7 +48,7 @@
         ..addSpan(inputFunctionNoSymbol, outputFunctionNoSymbol)
         ..addSpan(inputVar2NoSymbol, outputVar2NoSymbol)
         ..addSpan(inputExpr, outputExpr))
-        .build(output.url);
+        .build(output.url.toString());
     var mapping = parseJson(map);
     check(outputVar1NoSymbol, mapping, inputVar1NoSymbol, false);
     check(outputVar2NoSymbol, mapping, inputVar2NoSymbol, false);
@@ -65,7 +66,7 @@
         ..addSpan(inputVar2, outputVar2)
         ..addSpan(inputExpr, outputExpr)
         ..addSpan(inputExpr, outputExpr))
-        .build(output.url);
+        .build(output.url.toString());
     var mapping = parseJson(map);
     check(outputVar1, mapping, inputVar1, false);
     check(outputVar2, mapping, inputVar2, false);
@@ -82,7 +83,7 @@
         ..addSpan(inputVar2NoSymbol, outputVar2NoSymbol)
         ..addSpan(inputVar2NoSymbol, outputVar2NoSymbol)
         ..addSpan(inputExpr, outputExpr))
-        .build(output.url);
+        .build(output.url.toString());
     var mapping = parseJson(map);
     check(outputVar1NoSymbol, mapping, inputVar1NoSymbol, false);
     check(outputVar2NoSymbol, mapping, inputVar2NoSymbol, false);
@@ -96,7 +97,7 @@
         ..addSpan(inputFunction, outputFunction)
         ..addSpan(inputVar2, outputVar2)
         ..addSpan(inputExpr, outputExpr))
-        .toJson(output.url);
+        .toJson(output.url.toString());
     var mapping = parse(json);
     check(outputVar1, mapping, inputVar1, true);
     check(outputVar2, mapping, inputVar2, true);
@@ -106,7 +107,7 @@
 
   test('printer projecting marks + parse', () {
     var out = INPUT.replaceAll('long', '_s');
-    var file = new SourceFile.text('output2.dart', out);
+    var file = new SourceFile(out, url: 'output2.dart');
     var printer = new Printer('output2.dart');
     printer.mark(ispan(0, 0));
 
@@ -132,10 +133,11 @@
     expect(printer.text, out);
 
     var mapping = parse(printer.map);
-    checkHelper(Span inputSpan, int adjustment) {
+    checkHelper(SourceMapSpan inputSpan, int adjustment) {
       var start = inputSpan.start.offset - adjustment;
       var end = (inputSpan.end.offset - adjustment) - 2;
-      var span = new FileSpan(file, start, end, inputSpan.isIdentifier);
+      var span = new SourceMapFileSpan(file.span(start, end),
+          isIdentifier: inputSpan.isIdentifier);
       check(span, mapping, inputSpan, true);
     }
 
@@ -145,17 +147,16 @@
     checkHelper(inputExpr, 6);
 
     // We projected correctly lines that have no mappings
-    check(new FileSpan(file, 66, 66, false), mapping, ispan(45, 45), true);
-    check(new FileSpan(file, 63, 64, false), mapping, ispan(45, 45), true);
-    check(new FileSpan(file, 68, 68, false), mapping, ispan(70, 70), true);
-    check(new FileSpan(file, 71, 71, false), mapping, ispan(70, 70), true);
+    check(file.span(66, 66), mapping, ispan(45, 45), true);
+    check(file.span(63, 64), mapping, ispan(45, 45), true);
+    check(file.span(68, 68), mapping, ispan(70, 70), true);
+    check(file.span(71, 71), mapping, ispan(70, 70), true);
 
     // Start of the last line
     var oOffset = out.length - 2;
     var iOffset = INPUT.length - 2;
-    check(new FileSpan(file, oOffset, oOffset, false), mapping,
-        ispan(iOffset, iOffset), true);
-    check(new FileSpan(file, oOffset + 1, oOffset + 1, false), mapping,
+    check(file.span(oOffset, oOffset), mapping, ispan(iOffset, iOffset), true);
+    check(file.span(oOffset + 1, oOffset + 1), mapping,
         ispan(iOffset, iOffset), true);
   });
 }
diff --git a/pkg/source_maps/test/parser_test.dart b/pkg/source_maps/test/parser_test.dart
index 62cd08f..8528683 100644
--- a/pkg/source_maps/test/parser_test.dart
+++ b/pkg/source_maps/test/parser_test.dart
@@ -104,7 +104,7 @@
     var inputMap = new Map.from(MAP_WITH_SOURCE_LOCATION);
     inputMap['sourceRoot'] = '/pkg/';
     var mapping = parseJson(inputMap);
-    expect(mapping.spanFor(0, 0).sourceUrl, "/pkg/input.dart");
+    expect(mapping.spanFor(0, 0).sourceUrl, Uri.parse("/pkg/input.dart"));
 
     var newSourceRoot = '/new/';
 
diff --git a/pkg/source_maps/test/printer_test.dart b/pkg/source_maps/test/printer_test.dart
index fe27f76..e55ca9f 100644
--- a/pkg/source_maps/test/printer_test.dart
+++ b/pkg/source_maps/test/printer_test.dart
@@ -6,8 +6,8 @@
 
 import 'dart:convert';
 import 'package:unittest/unittest.dart';
-import 'package:source_maps/printer.dart';
-import 'package:source_maps/span.dart';
+import 'package:source_maps/source_maps.dart';
+import 'package:source_span/source_span.dart';
 import 'common.dart';
 
 main() {
@@ -53,13 +53,12 @@
     // 8 new lines in the source map:
     expect(printer.map.split(';').length, 8);
 
-    asFixed(Span s) => new FixedSpan(s.sourceUrl,
-        s.start.offset, s.start.line, s.start.column,
-        text: s.text, isIdentifier: s.isIdentifier);
+    asFixed(SourceMapSpan s) => new SourceMapSpan(s.start, s.end, s.text,
+        isIdentifier: s.isIdentifier);
 
     // The result is the same if we use fixed positions
     var printer2 = new Printer('output2.dart');
-    printer2..mark(new FixedSpan('input.dart', 0, 0, 0))
+    printer2..mark(new SourceLocation(0, sourceUrl: 'input.dart').pointSpan())
         ..add(segments[0], projectMarks: true)
         ..mark(asFixed(inputVar1))
         ..add('_s')
diff --git a/pkg/source_maps/test/refactor_test.dart b/pkg/source_maps/test/refactor_test.dart
index 5d0abf1..08b89651 100644
--- a/pkg/source_maps/test/refactor_test.dart
+++ b/pkg/source_maps/test/refactor_test.dart
@@ -6,13 +6,13 @@
 
 import 'package:unittest/unittest.dart';
 import 'package:source_maps/refactor.dart';
-import 'package:source_maps/span.dart';
 import 'package:source_maps/parser.dart' show parse, Mapping;
+import 'package:source_span/source_span.dart';
 
 main() {
   group('conflict detection', () {
     var original = "0123456789abcdefghij";
-    var file = new SourceFile.text('', original);
+    var file = new SourceFile(original);
 
     test('no conflict, in order', () {
       var txn = new TextEditTransaction(original, file);
@@ -48,7 +48,7 @@
   test('generated source maps', () {
     var original =
         "0123456789\n0*23456789\n01*3456789\nabcdefghij\nabcd*fghij\n";
-    var file = new SourceFile.text('', original);
+    var file = new SourceFile(original);
     var txn = new TextEditTransaction(original, file);
     txn.edit(27, 29, '__\n    ');
     txn.edit(34, 35, '___');
@@ -60,42 +60,90 @@
 
     // Line 1 and 2 are unmodified: mapping any column returns the beginning
     // of the corresponding line:
-    expect(_span(1, 1, map, file), "line 1, column 1 of .: \n0123456789");
-    expect(_span(1, 5, map, file), "line 1, column 1 of .: \n0123456789");
-    expect(_span(2, 1, map, file), "line 2, column 1 of .: \n0*23456789");
-    expect(_span(2, 8, map, file), "line 2, column 1 of .: \n0*23456789");
+    expect(_span(1, 1, map, file),
+        "line 1, column 1: \n"
+        "0123456789\n"
+        "^");
+    expect(_span(1, 5, map, file),
+        "line 1, column 1: \n"
+        "0123456789\n"
+        "^");
+    expect(_span(2, 1, map, file),
+        "line 2, column 1: \n"
+        "0*23456789\n"
+        "^");
+    expect(_span(2, 8, map, file),
+        "line 2, column 1: \n"
+        "0*23456789\n"
+        "^");
 
     // Line 3 is modified part way: mappings before the edits have the right
     // mapping, after the edits the mapping is null.
-    expect(_span(3, 1, map, file), "line 3, column 1 of .: \n01*3456789");
-    expect(_span(3, 5, map, file), "line 3, column 1 of .: \n01*3456789");
+    expect(_span(3, 1, map, file),
+        "line 3, column 1: \n"
+        "01*3456789\n"
+        "^");
+    expect(_span(3, 5, map, file),
+        "line 3, column 1: \n"
+        "01*3456789\n"
+        "^");
 
     // Start of edits map to beginning of the edit secion:
-    expect(_span(3, 6, map, file), "line 3, column 6 of .: \n01*3456789");
-    expect(_span(3, 7, map, file), "line 3, column 6 of .: \n01*3456789");
+    expect(_span(3, 6, map, file),
+        "line 3, column 6: \n"
+        "01*3456789\n"
+        "     ^");
+    expect(_span(3, 7, map, file),
+        "line 3, column 6: \n"
+        "01*3456789\n"
+        "     ^");
 
     // Lines added have no mapping (they should inherit the last mapping),
     // but the end of the edit region continues were we left off:
     expect(_span(4, 1, map, file), isNull);
-    expect(_span(4, 5, map, file), "line 3, column 8 of .: \n01*3456789");
+    expect(_span(4, 5, map, file),
+        "line 3, column 8: \n"
+        "01*3456789\n"
+        "       ^");
 
     // Subsequent lines are still mapped correctly:
     // a (in a___cd...)
-    expect(_span(5, 1, map, file), "line 4, column 1 of .: \nabcdefghij");
+    expect(_span(5, 1, map, file),
+        "line 4, column 1: \n"
+        "abcdefghij\n"
+        "^");
     // _ (in a___cd...)
-    expect(_span(5, 2, map, file), "line 4, column 2 of .: \nabcdefghij");
+    expect(_span(5, 2, map, file),
+        "line 4, column 2: \n"
+        "abcdefghij\n"
+        " ^");
     // _ (in a___cd...)
-    expect(_span(5, 3, map, file), "line 4, column 2 of .: \nabcdefghij");
+    expect(_span(5, 3, map, file),
+        "line 4, column 2: \n"
+        "abcdefghij\n"
+        " ^");
     // _ (in a___cd...)
-    expect(_span(5, 4, map, file), "line 4, column 2 of .: \nabcdefghij");
+    expect(_span(5, 4, map, file),
+        "line 4, column 2: \n"
+        "abcdefghij\n"
+        " ^");
     // c (in a___cd...)
-    expect(_span(5, 5, map, file), "line 4, column 3 of .: \nabcdefghij");
-    expect(_span(6, 1, map, file), "line 5, column 1 of .: \nabcd*fghij");
-    expect(_span(6, 8, map, file), "line 5, column 1 of .: \nabcd*fghij");
+    expect(_span(5, 5, map, file),
+        "line 4, column 3: \n"
+        "abcdefghij\n"
+        "  ^");
+    expect(_span(6, 1, map, file),
+        "line 5, column 1: \n"
+        "abcd*fghij\n"
+        "^");
+    expect(_span(6, 8, map, file),
+        "line 5, column 1: \n"
+        "abcd*fghij\n"
+        "^");
   });
 }
 
 String _span(int line, int column, Mapping map, SourceFile file) {
   var span = map.spanFor(line - 1, column - 1, files: {'': file});
-  return span == null ? null : span.getLocationMessage('').trim();
+  return span == null ? null : span.message('').trim();
 }
diff --git a/pkg/source_maps/test/run.dart b/pkg/source_maps/test/run.dart
index 21d2037..ec3c3ab 100755
--- a/pkg/source_maps/test/run.dart
+++ b/pkg/source_maps/test/run.dart
@@ -14,7 +14,6 @@
 import 'parser_test.dart' as parser_test;
 import 'printer_test.dart' as printer_test;
 import 'refactor_test.dart' as refactor_test;
-import 'span_test.dart' as span_test;
 import 'utils_test.dart' as utils_test;
 import 'vlq_test.dart' as vlq_test;
 
@@ -33,7 +32,6 @@
   addGroup('parser_test.dart', parser_test.main);
   addGroup('printer_test.dart', printer_test.main);
   addGroup('refactor_test.dart', refactor_test.main);
-  addGroup('span_test.dart', span_test.main);
   addGroup('utils_test.dart', utils_test.main);
   addGroup('vlq_test.dart', vlq_test.main);
 }
diff --git a/pkg/source_maps/test/span_test.dart b/pkg/source_maps/test/span_test.dart
deleted file mode 100644
index 190b7a6..0000000
--- a/pkg/source_maps/test/span_test.dart
+++ /dev/null
@@ -1,341 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.span_test;
-
-import 'package:unittest/unittest.dart';
-import 'package:source_maps/span.dart';
-
-const String TEST_FILE = '''
-+23456789_
- +       _123456789_123456789_123456789_123456789_123456789_123456789_123456789_
-  +                _123456789_1
-123+56789_123456789_1234567
-1234+6789_1234
-12345+789_123456789_12345
-123456+89_123456789_123456789_123456789_123456789_123456789_123456789_123456789
-1234567+9_123456789_123456789_123456789_123456789_123456789_123456789_123
-12345678+_123456789_123456789_123456789_123456789_1
-123456789+123456789_123456789_12345678
-123456789_+23456789_123456789_123456789_123
-123456789_1+3456789_123456789
-''';
-
-List<int> newLines = TEST_FILE.split('\n').map((s) => s.length).toList();
-
-main() {
-  var file = new SourceFile.text('file', TEST_FILE);
-  span(int start, int end) => file.span(start, end);
-  loc(int offset) => file.location(offset);
-
-  test('validate test input', () {
-    expect(newLines,
-      const [10, 80, 31, 27, 14, 25, 79, 73, 51, 38, 43, 29, 0]);
-  });
-
-  test('get line and column', () {
-    line(int n) => file.getLine(n);
-    col(int n) => file.getColumn(file.getLine(n), n);
-
-    expect(line(8), 0);
-    expect(line(10), 0);
-    expect(line(11), 1);
-    expect(line(12), 1);
-    expect(line(91), 1);
-    expect(line(92), 2);
-    expect(line(93), 2);
-    expect(col(11), 0);
-    expect(col(12), 1);
-    expect(col(91), 80);
-    expect(col(92), 0);
-    expect(col(93), 1);
-
-    int j = 0;
-    int lineOffset = 0;
-    for (int i = 0; i < TEST_FILE.length; i++) {
-      if (i > lineOffset + newLines[j]) {
-        lineOffset += newLines[j] + 1;
-        j++;
-      }
-      expect(line(i), j, reason: 'position: $i');
-      expect(col(i), i - lineOffset, reason: 'position: $i');
-    }
-  });
-
-  test('get text', () {
-    // fifth line (including 4 new lines), columns 2 .. 11
-    var line = 10 + 80 + 31 + 27 + 4;
-    expect(file.getText(line + 2, line + 11), '34+6789_1');
-  });
-
-  group('location message', () {
-    test('first line', () {
-      expect(file.getLocationMessage('the message', 1, 3),
-          'line 1, column 2 of file: the message\n'
-          '+23456789_\n'
-          ' ^^');
-    });
-
-    test('in the middle of the file', () {
-      // fifth line (including 4 new lines), columns 2 .. 11
-      var line = 10 + 80 + 31 + 27 + 4;
-      expect(file.getLocationMessage('the message', line + 2, line + 11),
-          'line 5, column 3 of file: the message\n'
-          '1234+6789_1234\n'
-          '  ^^^^^^^^^');
-    });
-
-    test('no file url', () {
-      var line = 10 + 80 + 31 + 27 + 4;
-      expect(new SourceFile.text(null, TEST_FILE).getLocationMessage(
-          'the message', line + 2, line + 11),
-          'line 5, column 3: the message\n'
-          '1234+6789_1234\n'
-          '  ^^^^^^^^^');
-    });
-
-    test('penultimate line', () {
-      // We search '\n' backwards twice because last line is \n terminated:
-      int index = TEST_FILE.lastIndexOf('\n');
-      var start = TEST_FILE.lastIndexOf('\n', index - 1) - 3;
-      expect(file.getLocationMessage('the message', start, start + 2),
-          'line 11, column 41 of file: the message\n'
-          '123456789_+23456789_123456789_123456789_123\n'
-          '                                        ^^');
-    });
-
-    test('last line', () {
-      var start = TEST_FILE.lastIndexOf('\n') - 2;
-      expect(file.getLocationMessage('the message', start, start + 1),
-          'line 12, column 28 of file: the message\n'
-          '123456789_1+3456789_123456789\n'
-          '                           ^');
-    });
-
-    group('no trailing empty-line at the end -', () {
-      var text = TEST_FILE.substring(0, TEST_FILE.length - 1);
-      var file2 = new SourceFile.text('file', text);
-
-      test('penultimate line', () {
-        var start = text.lastIndexOf('\n') - 3;
-        expect(file2.getLocationMessage('the message', start, start + 2),
-            'line 11, column 41 of file: the message\n'
-            '123456789_+23456789_123456789_123456789_123\n'
-            '                                        ^^');
-      });
-
-      test('last line', () {
-        var start = text.length - 2;
-        expect(file2.getLocationMessage('the message', start, start + 1),
-            'line 12, column 28 of file: the message\n'
-            '123456789_1+3456789_123456789\n'
-            '                           ^');
-      });
-    });
-
-    test('single line', () {
-      var text = "this is a single line";
-      int start = text.indexOf(' ') + 1;
-      var file2 = new SourceFile.text('file', text);
-      expect(file2.getLocationMessage('the message', start, start + 2),
-            'line 1, column ${start + 1} of file: the message\n'
-            'this is a single line\n'
-            '     ^^');
-    });
-  });
-
-  test('location getters', () {
-    expect(loc(8).line, 0);
-    expect(loc(8).column, 8);
-    expect(loc(9).line, 0);
-    expect(loc(9).column, 9);
-    expect(loc(8).formatString, 'file:1:9');
-    expect(loc(12).line, 1);
-    expect(loc(12).column, 1);
-    expect(loc(95).line, 2);
-    expect(loc(95).column, 3);
-  });
-
-  test('location compare', () {
-    var list = [9, 8, 11, 14, 6, 6, 1, 1].map((n) => loc(n)).toList();
-    list.sort();
-    var lastOffset = 0;
-    for (var location in list) {
-      expect(location.offset, greaterThanOrEqualTo(lastOffset));
-      lastOffset = location.offset;
-    }
-  });
-
-  test('span getters', () {
-    expect(span(8, 9).start.line, 0);
-    expect(span(8, 9).start.column, 8);
-    expect(span(8, 9).end.line, 0);
-    expect(span(8, 9).end.column, 9);
-    expect(span(8, 9).text, '9');
-    expect(span(8, 9).isIdentifier, false);
-    expect(span(8, 9).formatLocation, 'file:1:9');
-
-    var line = 10 + 80 + 31 + 27 + 4;
-    expect(span(line + 2, line + 11).getLocationMessage('the message'),
-        'line 5, column 3 of file: the message\n'
-        '1234+6789_1234\n'
-        '  ^^^^^^^^^');
-
-    expect(span(12, 95).start.line, 1);
-    expect(span(12, 95).start.column, 1);
-    expect(span(12, 95).end.line, 2);
-    expect(span(12, 95).end.column, 3);
-    expect(span(12, 95).text,
-        '+       _123456789_123456789_123456789_123456789_123456789_1234567'
-        '89_123456789_\n  +');
-    expect(span(12, 95).formatLocation, 'file:2:2');
-  });
-
-  test('span union', () {
-    var union = new FileSpan.union(span(8, 9), span(12, 95));
-    expect(union.start.offset, 8);
-    expect(union.start.line, 0);
-    expect(union.start.column, 8);
-    expect(union.end.offset, 95);
-    expect(union.end.line, 2);
-    expect(union.end.column, 3);
-    expect(union.text,
-        '9_\n'
-        ' +       _123456789_123456789_123456789_123456789_123456789_'
-        '123456789_123456789_\n  +');
-    expect(union.formatLocation, 'file:1:9');
-  });
-
-  test('span compare', () {
-    var list = [span(9, 10), span(8, 9), span(11, 12), span(14, 19),
-        span(6, 12), span(6, 8), span(1, 9), span(1, 2)];
-    list.sort();
-    var lastStart = 0;
-    var lastEnd = 0;
-    for (var span in list) {
-      expect(span.start.offset, greaterThanOrEqualTo(lastStart));
-      if (span.start.offset == lastStart) {
-        expect(span.end.offset, greaterThanOrEqualTo(lastEnd));
-      }
-      lastStart = span.start.offset;
-      lastEnd = span.end.offset;
-    }
-  });
-
-  test('range check for large offsets', () {
-    var start = TEST_FILE.length;
-    expect(file.getLocationMessage('the message', start, start + 9),
-        'line 13, column 1 of file: the message\n');
-  });
-
-  group('file segment', () {
-    var baseOffset = 123;
-    var segmentText = TEST_FILE.substring(baseOffset, TEST_FILE.length - 100);
-    var segment = new SourceFileSegment('file', segmentText, loc(baseOffset));
-    sline(int n) => segment.getLine(n);
-    scol(int n) => segment.getColumn(segment.getLine(n), n);
-    line(int n) => file.getLine(n);
-    col(int n) => file.getColumn(file.getLine(n), n);
-
-    test('get line and column', () {
-      int j = 0;
-      int lineOffset = 0;
-      for (int i = baseOffset; i < segmentText.length; i++) {
-        if (i > lineOffset + newLines[j]) {
-          lineOffset += newLines[j] + 1;
-          j++;
-        }
-        expect(segment.location(i - baseOffset).offset, i);
-        expect(segment.location(i - baseOffset).line, line(i));
-        expect(segment.location(i - baseOffset).column, col(i));
-        expect(segment.span(i - baseOffset).start.offset, i);
-        expect(segment.span(i - baseOffset).start.line, line(i));
-        expect(segment.span(i - baseOffset).start.column, col(i));
-
-        expect(sline(i), line(i));
-        expect(scol(i), col(i));
-      }
-    });
-
-    test('get text', () {
-      var start = 10 + 80 + 31 + 27 + 4 + 2;
-      expect(segment.getText(start, start + 9), file.getText(start, start + 9));
-    });
-
-    group('location message', () {
-      test('first line', () {
-        var start = baseOffset + 7;
-        expect(segment.getLocationMessage('the message', start, start + 2),
-            file.getLocationMessage('the message', start, start + 2));
-      });
-
-      test('in a middle line', () {
-        // Example from another test above:
-        var start = 10 + 80 + 31 + 27 + 4 + 2;
-        expect(segment.getLocationMessage('the message', start, start + 9),
-            file.getLocationMessage('the message', start, start + 9));
-      });
-
-      test('last segment line', () {
-        var start = segmentText.length - 4;
-        expect(segment.getLocationMessage('the message', start, start + 2),
-            file.getLocationMessage('the message', start, start + 2));
-      });
-
-      test('past segment, same as last segment line', () {
-        var start = segmentText.length;
-        expect(segment.getLocationMessage('the message', start, start + 2),
-            file.getLocationMessage('the message', start, start + 2));
-
-        start = segmentText.length + 20;
-        expect(segment.getLocationMessage('the message', start, start + 2),
-            file.getLocationMessage('the message', start, start + 2));
-      });
-
-      test('past segment, past its line', () {
-        var start = TEST_FILE.length - 2;
-        expect(file.getLocationMessage('the message', start, start + 1),
-          'line 12, column 29 of file: the message\n'
-          '123456789_1+3456789_123456789\n'
-          '                            ^');
-
-        // The answer below is different because the segment parsing only knows
-        // about the 10 lines it has (and nothing about the possible extra lines
-        // afterwards)
-        expect(segment.getLocationMessage('the message', start, start + 1),
-          'line 11, column 1 of file: the message\n');
-      });
-    });
-  });
-
-  test('span isIdentifier defaults to false', () {
-    var start = new TestLocation(0);
-    var end = new TestLocation(1);
-    expect(new TestSpan(start, end).isIdentifier, false);
-    expect(file.span(8, 9, null).isIdentifier, false);
-    expect(new FixedSpan('', 8, 1, 8, isIdentifier: null).isIdentifier, false);
-  });
-
-  test('span/location implement == and hashCode', () {
-    expect(identical(span(10, 14), span(10, 14)), isFalse);
-    expect(span(10, 14), equals(span(10, 14)));
-    expect(span(10, 14).hashCode, span(10, 14).hashCode);
-
-    expect(identical(loc(13), loc(13)), isFalse);
-    expect(loc(13), equals(loc(13)));
-    expect(loc(13).hashCode, loc(13).hashCode);
-  });
-}
-
-class TestSpan extends Span {
-  TestSpan(Location start, Location end) : super(start, end, null);
-  get text => null;
-}
-
-class TestLocation extends Location {
-  String get sourceUrl => '';
-  TestLocation(int offset) : super(offset);
-  get line => 0;
-  get column => 0;
-}
diff --git a/pkg/template_binding/CHANGELOG.md b/pkg/template_binding/CHANGELOG.md
index fbc46ff..984dbfc 100644
--- a/pkg/template_binding/CHANGELOG.md
+++ b/pkg/template_binding/CHANGELOG.md
@@ -3,15 +3,21 @@
 This file contains highlights of what changes on each version of the
 template_binding package.
 
-#### Pub version 0.12.0-dev
+#### Pub version 0.12.0+3
+  * fix bug in interop layer to ensure callbacks are run in the dirty-checking
+    zone (this only affected running code directly in Dartium without running
+    pub-build or pub-serve)
+
+#### Pub version 0.12.0
   * NodeBind interop support. This allows elements such as Polymer's
     core-elements and paper-elements to work properly with Dart binding paths,
     including using Elements and functions as values, and two-way bindings.
   * NodeBind is no longer ported. It now comes from
     packages/web_components/platform.js
+  * Up to date with [TemplateBinding#d9f4543][d9f4543] (release 0.3.4)
 
 #### Pub version 0.11.0
-  * Ported up to commit [TemplateBinding#1cee02][5b9a3b] and
+  * Ported up to commit [TemplateBinding#5b9a3b][5b9a3b] and
     [NodeBind#c47bc1][c47bc1].
 
 #### Pub version 0.10.0
@@ -22,7 +28,8 @@
   * Ported up to commit [TemplateBinding#99e52d][99e52d] and
     [NodeBind#f7cc76][f7cc76].
 
-[1cee02]: https://github.com/Polymer/TemplateBinding/commit/5b9a3be40682e1ccd5e6c0b04fbe2c54d74b5d1e
+[d9f4543]: https://github.com/Polymer/TemplateBinding/commit/d9f4543dc06935824bfd43564c442b0897ce1c54
+[5b9a3b]: https://github.com/Polymer/TemplateBinding/commit/5b9a3be40682e1ccd5e6c0b04fbe2c54d74b5d1e
 [c47bc1]: https://github.com/Polymer/NodeBind/commit/c47bc1b40d1cf0123b29620820a7111471e83ff3
 [51df59]: https://github.com/Polymer/TemplateBinding/commit/51df59c16e0922dec041cfe604016aac00918d5d
 [99e52d]: https://github.com/Polymer/TemplateBinding/commit/99e52dd7fbaefdaee9807648d1d6097eb3e99eda
diff --git a/pkg/template_binding/lib/src/node.dart b/pkg/template_binding/lib/src/node.dart
index c4bb5f3..fbcf96a 100644
--- a/pkg/template_binding/lib/src/node.dart
+++ b/pkg/template_binding/lib/src/node.dart
@@ -26,7 +26,7 @@
     var b = _js['bindings_'];
     if (b == null) return null;
     // TODO(jmesserly): should cache this for identity.
-    return new _NodeBindingsMap(b);
+    return new _NodeBindingsMap(_node, b);
   }
   
   set bindings(Map<String, Bindable> value) {
@@ -48,7 +48,7 @@
    * Returns the [Bindable] instance.
    */
   Bindable bind(String name, value, {bool oneTime: false}) {
-    name = _dartToJsName(name);
+    name = _dartToJsName(_node, name);
 
     if (!oneTime && value is Bindable) {
       value = bindableToJsObject(value);
@@ -73,23 +73,25 @@
 }
 
 class _NodeBindingsMap extends MapBase<String, Bindable> {
+  final Node _node;
   final JsObject _bindings;
 
-  _NodeBindingsMap(this._bindings);
+  _NodeBindingsMap(this._node, this._bindings);
 
   // TODO(jmesserly): this should be lazy
   Iterable<String> get keys =>
-      js.context['Object'].callMethod('keys', [_bindings]).map(_jsToDartName);
+      js.context['Object'].callMethod('keys', [_bindings]).map(
+          (name) => _jsToDartName(_node, name));
 
   Bindable operator[](String name) =>
-      jsObjectToBindable(_bindings[_dartToJsName(name)]);
+      jsObjectToBindable(_bindings[_dartToJsName(_node, name)]);
 
   operator[]=(String name, Bindable value) {
-    _bindings[_dartToJsName(name)] = bindableToJsObject(value);
+    _bindings[_dartToJsName(_node, name)] = bindableToJsObject(value);
   }
 
   @override Bindable remove(String name) {
-    name = _dartToJsName(name);
+    name = _dartToJsName(_node, name);
     var old = this[name];
     _bindings.deleteProperty(name);
     return old;
@@ -108,14 +110,14 @@
 // called on Text nodes, which is unlikely to be used except by TemplateBinding.
 // Seems like a lot of magic to support it. I don't think Node.bind promises any
 // strong relationship between properties and [name], so textContent seems fine.
-String _dartToJsName(String name) {
-  if (name == 'text') name = 'textContent';
+String _dartToJsName(Node node, String name) {
+  if (node is Text && name == 'text') name = 'textContent';
   return name;
 }
 
 
-String _jsToDartName(String name) {
-  if (name == 'textContent') name = 'text';
+String _jsToDartName(Node node, String name) {
+  if (node is Text && name == 'textContent') name = 'text';
   return name;
 }
 
@@ -135,7 +137,8 @@
   final JsObject _js;
   _JsBindable(JsObject obj) : _js = obj;
 
-  open(callback) => _js.callMethod('open', [callback]);
+  open(callback) => _js.callMethod('open',
+      [Zone.current.bindUnaryCallback(callback)]);
 
   close() => _js.callMethod('close');
 
@@ -153,16 +156,21 @@
 JsObject bindableToJsObject(Bindable bindable) {
   if (bindable is _JsBindable) return bindable._js;
 
+  var zone = Zone.current;
+  inZone(f) => zone.bindCallback(f, runGuarded: false);
+  inZoneUnary(f) => zone.bindUnaryCallback(f, runGuarded: false);
+
   return new JsObject.jsify({
-    'open': (callback) => bindable.open((x) => callback.apply([x])),
-    'close': () => bindable.close(),
-    'discardChanges': () => bindable.value,
-    'setValue': (x) => bindable.value = x,
+    'open': inZoneUnary(
+        (callback) => bindable.open((x) => callback.apply([x]))),
+    'close': inZone(() => bindable.close()),
+    'discardChanges': inZone(() => bindable.value),
+    'setValue': inZoneUnary((x) => bindable.value = x),
     // NOTE: this is not used by Node.bind, but it's used by Polymer:
     // https://github.com/Polymer/polymer-dev/blob/ba2b68fe5a5721f60b5994135f3270e63588809a/src/declaration/properties.js#L130
     // Technically this works because 'deliver' is on PathObserver and
     // CompoundObserver. But ideally Polymer-JS would not assume that.
-    'deliver': () => bindable.deliver(),
+    'deliver': inZone(() => bindable.deliver()),
     // Save this so we can return it from [jsObjectToBindable]
     '__dartBindable': bindable
   });
diff --git a/pkg/template_binding/pubspec.yaml b/pkg/template_binding/pubspec.yaml
index 8247c2e..7f2de55 100644
--- a/pkg/template_binding/pubspec.yaml
+++ b/pkg/template_binding/pubspec.yaml
@@ -1,12 +1,12 @@
 name: template_binding
-version: 0.12.0-dev
+version: 0.12.0+3
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: >
   Extends the capabilities of the HTML Template Element by enabling it to
   create, manage, and remove instances of content bound to data defined in Dart.
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
-  observe: ">=0.11.0-dev <0.12.0"
+  observe: ">=0.11.0 <0.12.0"
 dev_dependencies:
   web_components: ">=0.3.1 <0.4.0"
   unittest: ">=0.10.0 <0.11.0"
diff --git a/pkg/third_party/html5lib/CHANGELOG.md b/pkg/third_party/html5lib/CHANGELOG.md
index 7c7ebb0..6d485f4 100644
--- a/pkg/third_party/html5lib/CHANGELOG.md
+++ b/pkg/third_party/html5lib/CHANGELOG.md
@@ -3,6 +3,13 @@
 This file contains highlights of what changes on each version of the html5lib
 package.
 
+#### Pub version 0.12.0
+  * switch from `source_maps`' `Span` class to `source_span`'s
+    `SourceSpan` class.
+
+#### Pub version 0.11.0+2
+  * expand the version constraint for csslib.
+
 #### Pub version 0.10.0+1
   * use a more recent source_maps version.
 
diff --git a/pkg/third_party/html5lib/lib/dom.dart b/pkg/third_party/html5lib/lib/dom.dart
index a87bca9..3c5b332 100644
--- a/pkg/third_party/html5lib/lib/dom.dart
+++ b/pkg/third_party/html5lib/lib/dom.dart
@@ -8,7 +8,7 @@
 // implement that.
 
 import 'dart:collection';
-import 'package:source_maps/span.dart' show FileSpan;
+import 'package:source_span/source_span.dart';
 
 import 'src/constants.dart';
 import 'src/css_class_set.dart';
diff --git a/pkg/third_party/html5lib/lib/parser.dart b/pkg/third_party/html5lib/lib/parser.dart
index aca5661..ded6a74 100644
--- a/pkg/third_party/html5lib/lib/parser.dart
+++ b/pkg/third_party/html5lib/lib/parser.dart
@@ -15,7 +15,7 @@
 
 import 'dart:collection';
 import 'dart:math';
-import 'package:source_maps/span.dart' show Span, FileSpan;
+import 'package:source_span/source_span.dart';
 
 import 'src/treebuilder.dart';
 import 'src/constants.dart';
@@ -32,7 +32,7 @@
 /// [encoding], which must be a string. If specified that encoding will be
 /// used regardless of any BOM or later declaration (such as in a meta element).
 ///
-/// Set [generateSpans] if you want to generate [Span]s, otherwise the
+/// Set [generateSpans] if you want to generate [SourceSpan]s, otherwise the
 /// [Node.sourceSpan] property will be `null`. When using [generateSpans] you
 /// can additionally pass [sourceUrl] to indicate where the [input] was
 /// extracted from.
@@ -52,7 +52,7 @@
 /// [encoding], which must be a string. If specified, that encoding will be used,
 /// regardless of any BOM or later declaration (such as in a meta element).
 ///
-/// Set [generateSpans] if you want to generate [Span]s, otherwise the
+/// Set [generateSpans] if you want to generate [SourceSpan]s, otherwise the
 /// [Node.sourceSpan] property will be `null`. When using [generateSpans] you can
 /// additionally pass [sourceUrl] to indicate where the [input] was extracted
 /// from.
@@ -70,7 +70,7 @@
   /// Raise an exception on the first error encountered.
   final bool strict;
 
-  /// True to generate [Span]s for the [Node.sourceSpan] property.
+  /// True to generate [SourceSpan]s for the [Node.sourceSpan] property.
   final bool generateSpans;
 
   final HtmlTokenizer tokenizer;
@@ -363,12 +363,13 @@
 
   /// The last span available. Used for EOF errors if we don't have something
   /// better.
-  Span get _lastSpan {
+  SourceSpan get _lastSpan {
+    if (tokenizer.stream.fileInfo == null) return null;
     var pos = tokenizer.stream.position;
-    return new FileSpan(tokenizer.stream.fileInfo, pos, pos);
+    return tokenizer.stream.fileInfo.location(pos).pointSpan();
   }
 
-  void parseError(Span span, String errorcode,
+  void parseError(SourceSpan span, String errorcode,
       [Map datavars = const {}]) {
 
     if (!generateSpans && span == null) {
@@ -2177,9 +2178,7 @@
     var span = null;
 
     if (parser.generateSpans) {
-      span = new FileSpan.union(
-          characterTokens[0].span,
-          characterTokens.last.span);
+      span = characterTokens[0].span.expand(characterTokens.last.span);
     }
 
     if (!allWhitespace(data)) {
@@ -3333,9 +3332,9 @@
 
 
 /// Error in parsed document.
-class ParseError implements Exception {
+class ParseError implements SourceSpanException {
   final String errorCode;
-  final Span span;
+  final SourceSpan span;
   final Map data;
 
   ParseError(this.errorCode, this.span, this.data);
@@ -3352,8 +3351,8 @@
   /// [toString] will include 'ParserError:' as a prefix.
   String get message => formatStr(errorMessages[errorCode], data);
 
-  String toString() {
-    var res = span.getLocationMessage(message);
+  String toString({color}) {
+    var res = span.message(message, color: color);
     return span.sourceUrl == null ? 'ParserError on $res' : 'On $res';
   }
 }
diff --git a/pkg/third_party/html5lib/lib/src/inputstream.dart b/pkg/third_party/html5lib/lib/src/inputstream.dart
index 5686abf..231fed0 100644
--- a/pkg/third_party/html5lib/lib/src/inputstream.dart
+++ b/pkg/third_party/html5lib/lib/src/inputstream.dart
@@ -2,7 +2,7 @@
 
 import 'dart:collection';
 import 'package:utf/utf.dart';
-import 'package:source_maps/span.dart' show SourceFile;
+import 'package:source_span/source_span.dart';
 import 'char_encodings.dart';
 import 'constants.dart';
 import 'utils.dart';
@@ -135,8 +135,9 @@
     // Free decoded characters if they aren't needed anymore.
     if (_rawBytes != null) _rawChars = null;
 
-    fileInfo = new SourceFile(sourceUrl, _lineStarts,
-        generateSpans ? _chars : null);
+    // TODO(sigmund): Don't parse the file at all if spans aren't being
+    // generated.
+    fileInfo = new SourceFile.decoded(_chars, url: sourceUrl);
   }
 
 
diff --git a/pkg/third_party/html5lib/lib/src/token.dart b/pkg/third_party/html5lib/lib/src/token.dart
index b1ec1de..9340153 100644
--- a/pkg/third_party/html5lib/lib/src/token.dart
+++ b/pkg/third_party/html5lib/lib/src/token.dart
@@ -2,7 +2,7 @@
 library token;
 
 import 'dart:collection';
-import 'package:source_maps/span.dart' show FileSpan;
+import 'package:source_span/source_span.dart';
 
 /// An html5 token.
 abstract class Token {
diff --git a/pkg/third_party/html5lib/lib/src/tokenizer.dart b/pkg/third_party/html5lib/lib/src/tokenizer.dart
index b486375..1b63114 100644
--- a/pkg/third_party/html5lib/lib/src/tokenizer.dart
+++ b/pkg/third_party/html5lib/lib/src/tokenizer.dart
@@ -2,7 +2,6 @@
 
 import 'dart:collection';
 import 'package:html5lib/parser.dart' show HtmlParser;
-import 'package:source_maps/span.dart' show Span, FileSpan;
 import 'constants.dart';
 import 'inputstream.dart';
 import 'token.dart';
@@ -157,7 +156,7 @@
   void _addToken(Token token) {
     if (generateSpans && token.span == null) {
       int offset = stream.position;
-      token.span = new FileSpan(stream.fileInfo, _lastOffset, offset);
+      token.span = stream.fileInfo.span(_lastOffset, offset);
       if (token is! ParseErrorToken) {
         _lastOffset = offset;
       }
diff --git a/pkg/third_party/html5lib/lib/src/treebuilder.dart b/pkg/third_party/html5lib/lib/src/treebuilder.dart
index 0e17ab5..4b8dfc4 100644
--- a/pkg/third_party/html5lib/lib/src/treebuilder.dart
+++ b/pkg/third_party/html5lib/lib/src/treebuilder.dart
@@ -4,7 +4,7 @@
 import 'dart:collection';
 import 'package:html5lib/dom.dart';
 import 'package:html5lib/parser.dart' show getElementNameTuple;
-import 'package:source_maps/span.dart' show FileSpan;
+import 'package:source_span/source_span.dart';
 import 'constants.dart';
 import 'list_proxy.dart';
 import 'token.dart';
diff --git a/pkg/third_party/html5lib/pubspec.yaml b/pkg/third_party/html5lib/pubspec.yaml
index e4a2d9a..2be7677 100644
--- a/pkg/third_party/html5lib/pubspec.yaml
+++ b/pkg/third_party/html5lib/pubspec.yaml
@@ -1,13 +1,13 @@
 name: html5lib
-version: 0.11.0+1
+version: 0.12.0
 author: Dart Team <misc@dartlang.org>
 description: A library for working with HTML documents.
 homepage: http://pub.dartlang.org/packages/html5lib
 environment:
   sdk: '>=1.2.0 <2.0.0'
 dependencies:
-  csslib: '>=0.10.0 <0.11.0'
-  source_maps: '>=0.9.1 <0.10.0'
+  csslib: '>=0.10.0 <0.12.0'
+  source_span: '>=1.0.0 <2.0.0'
   utf: '>=0.9.0 <0.10.0'
 dev_dependencies:
   path: '>=0.9.0 <2.0.0'
diff --git a/pkg/third_party/html5lib/test/parser_feature_test.dart b/pkg/third_party/html5lib/test/parser_feature_test.dart
index e5b036f..2950a77 100644
--- a/pkg/third_party/html5lib/test/parser_feature_test.dart
+++ b/pkg/third_party/html5lib/test/parser_feature_test.dart
@@ -246,7 +246,9 @@
         'Unexpected non-space characters. Expected DOCTYPE.');
     expect(parser.errors[0].toString(),
         'ParserError on line 1, column 4: Unexpected non-space characters. '
-        'Expected DOCTYPE.');
+          'Expected DOCTYPE.\n'
+        'foo\n'
+        '  ^');
   });
 
   test('Element.text', () {
diff --git a/pkg/web_components/CHANGELOG.md b/pkg/web_components/CHANGELOG.md
index fcb5e5a..1f0fedb 100644
--- a/pkg/web_components/CHANGELOG.md
+++ b/pkg/web_components/CHANGELOG.md
@@ -2,6 +2,9 @@
 
 This file contains highlights of what changes on each version of this package.
 
+#### Pub version 0.5.0
+  * Upgrades to platform version 0.3.4-02a0f66 (see lib/build.log for details).
+
 #### Pub version 0.4.0
   * Adds `registerDartType` and updates to platform 0.3.3-29065bc
     (re-applies the changes in 0.3.5).
diff --git a/pkg/web_components/lib/build.log b/pkg/web_components/lib/build.log
index f88207b..f1cbe74 100644
--- a/pkg/web_components/lib/build.log
+++ b/pkg/web_components/lib/build.log
@@ -1,39 +1,45 @@
 BUILD LOG
 ---------
-Build Time: 2014-05-21T18:37:28
+Build Time: 2014-07-24T18:04:50
 
 NODEJS INFORMATION
 ==================
-nodejs: v0.10.24
-chai: 1.9.1
-grunt: 0.4.5
-grunt-audit: 0.0.3
+nodejs: v0.10.21
+chai: 1.9.0
+grunt: 0.4.2
+grunt-audit: 0.0.2
 grunt-concat-sourcemap: 0.4.1
-grunt-contrib-concat: 0.4.0
-grunt-contrib-uglify: 0.4.0
-grunt-contrib-yuidoc: 0.5.2
-grunt-karma: 0.8.3
-karma: 0.12.16
+grunt-contrib-concat: 0.3.0
+grunt-contrib-uglify: 0.3.2
+grunt-contrib-yuidoc: 0.5.1
+grunt-karma: 0.6.2
+karma: 0.10.9
+karma-chrome-launcher: 0.1.2
+karma-coffee-preprocessor: 0.1.3
 karma-crbot-reporter: 0.0.4
 karma-firefox-launcher: 0.1.3
-karma-ie-launcher: 0.1.5
-karma-mocha: 0.1.3
+karma-html2js-preprocessor: 0.1.0
+karma-ie-launcher: 0.1.1
+karma-jasmine: 0.1.5
+karma-mocha: 0.1.1
+karma-phantomjs-launcher: 0.1.2
+karma-requirejs: 0.2.1
 karma-safari-launcher: 0.1.1
 karma-script-launcher: 0.1.0
-mocha: 1.19.0
-Platform: 0.2.4
+mocha: 1.17.1
+requirejs: 2.1.11
 
 REPO REVISIONS
 ==============
-CustomElements: 9cfef1fc323a9e9d4f5ff398750a6e4908bd47e3
-HTMLImports: 1ee73575c760350b9b670b5e414468ce6b94f529
-NodeBind: c47bc1b40d1cf0123b29620820a7111471e83ff3
-ShadowDOM: 9d2bdaa70a37df25e71abed658088cb117be7473
-TemplateBinding: 5b9a3be40682e1ccd5e6c0b04fbe2c54d74b5d1e
-WeakMap: a0947a9a0f58f5733f464755c3b86de624b00a5d
-observe-js: adccb62bd0b6915179671d567b224d60b7c7ff20
-platform-dev: 15e4e51efe8c8bb78b13ec345a1f705727b71474
+CustomElements: 2df917e8b1fb1928651a71372ae901a400ddf726
+HTMLImports: d240c62fe5b784239f08f77eff40efb4aabf0105
+NodeBind: 9f0089946c312d9ac9ca45d06913fce507a8b185
+ShadowDOM: 86943c29aa8a10da214bc2f42e3067cf0f190279
+TemplateBinding: d9f4543dc06935824bfd43564c442b0897ce1c54
+WeakMap: 43ab1056a0d821af9b6028fc27ddf30db817c05a
+observe-js: e212e7473962067c099a3d1859595c2f8baa36d7
+platform-dev: 02a0f66b65c34585b4b986e6a3a73cc0d743683a
 
 BUILD HASHES
 ============
-build/platform.js: aec8ca1ee3aab5e29f6fdf2518f5abad4f45ce21
\ No newline at end of file
+build/platform.js: 9ca6c8137fefb7461693d8ec7bac2af8d5a4fd1a
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.concat.js b/pkg/web_components/lib/platform.concat.js
index 9481eee..68b593d 100644
--- a/pkg/web_components/lib/platform.concat.js
+++ b/pkg/web_components/lib/platform.concat.js
@@ -407,8 +407,9 @@
     if (privateToken !== constructorIsPrivate)
       throw Error('Use Path.get to retrieve path objects');
 
-    if (parts.length)
-      Array.prototype.push.apply(this, parts.slice());
+    for (var i = 0; i < parts.length; i++) {
+      this.push(String(parts[i]));
+    }
 
     if (hasEval && this.length) {
       this.getValueFrom = this.compiledGetValueFromFn();
@@ -894,7 +895,7 @@
 
   var runningMicrotaskCheckpoint = false;
 
-  var hasDebugForceFullDelivery = hasObserve && (function() {
+  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {
     try {
       eval('%RunMicrotasks()');
       return true;
@@ -5454,7 +5455,6 @@
   var registerWrapper = scope.registerWrapper;
   var wrapHTMLCollection = scope.wrapHTMLCollection;
   var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
 
   var OriginalHTMLFormElement = window.HTMLFormElement;
 
@@ -6692,6 +6692,9 @@
     invalidate: function() {
       if (!this.dirty) {
         this.dirty = true;
+        var parentRenderer = this.parentRenderer;
+        if (parentRenderer)
+          parentRenderer.invalidate();
         pendingDirtyRenderers.push(this);
         if (renderTimer)
           return;
@@ -7605,9 +7608,35 @@
   var OriginalDataTransferSetDragImage =
       OriginalDataTransfer.prototype.setDragImage;
 
-  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {
-    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);
-  };
+  if (OriginalDataTransferSetDragImage) {
+    OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {
+      OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);
+    };
+  }
+
+})(window.ShadowDOMPolyfill);
+
+/**
+ * Copyright 2014 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.
+ */
+
+(function(scope) {
+  'use strict';
+
+  var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
+
+  var OriginalFormData = window.FormData;
+
+  function FormData(formElement) {
+    this.impl = new OriginalFormData(formElement && unwrap(formElement));
+  }
+
+  registerWrapper(OriginalFormData, FormData, new OriginalFormData());
+
+  scope.wrappers.FormData = FormData;
 
 })(window.ShadowDOMPolyfill);
 
@@ -8113,7 +8142,7 @@
     cssText = this.insertPolyfillHostInCssText(cssText);
     cssText = this.convertColonHost(cssText);
     cssText = this.convertColonHostContext(cssText);
-    cssText = this.convertCombinators(cssText);
+    cssText = this.convertShadowDOMSelectors(cssText);
     if (scopeSelector) {
       var self = this, cssText;
       withCssRules(cssText, function(rules) {
@@ -8206,11 +8235,12 @@
     return host + part.replace(polyfillHost, '') + suffix;
   },
   /*
-   * Convert ^ and ^^ combinators by replacing with space.
+   * Convert combinators like ::shadow and pseudo-elements like ::content
+   * by replacing with space.
   */
-  convertCombinators: function(cssText) {
-    for (var i=0; i < combinatorsRe.length; i++) {
-      cssText = cssText.replace(combinatorsRe[i], ' ');
+  convertShadowDOMSelectors: function(cssText) {
+    for (var i=0; i < shadowDOMSelectorsRe.length; i++) {
+      cssText = cssText.replace(shadowDOMSelectorsRe[i], ' ');
     }
     return cssText;
   },
@@ -8365,13 +8395,13 @@
     cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
     // TODO(sorvell): remove either content or comment
     cssCommentNextSelectorRe = /\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,
-    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*'([^']*)'[^}]*}([^{]*?){/gim,
+    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*['|"]([^'"]*)['|"][^}]*}([^{]*?){/gim,
     // TODO(sorvell): remove either content or comment
     cssCommentRuleRe = /\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
-    cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,
+    cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*['|"]([^'"]*)['|"][^;]*;)[^}]*}/gim,
     // TODO(sorvell): remove either content or comment
     cssCommentUnscopedRuleRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
-    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,
+    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*['|"]([^'"]*)['|"][^;]*;)[^}]*}/gim,
     cssPseudoRe = /::(x-[^\s{,(]*)/gim,
     cssPartRe = /::part\(([^)]*)\)/gim,
     // note: :host pre-processed to -shadowcsshost.
@@ -8390,13 +8420,14 @@
     polyfillHostNoCombinator = polyfillHost + '-no-combinator',
     polyfillHostRe = new RegExp(polyfillHost, 'gim'),
     polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),
-    combinatorsRe = [
+    shadowDOMSelectorsRe = [
       /\^\^/g,
       /\^/g,
       /\/shadow\//g,
       /\/shadow-deep\//g,
       /::shadow/g,
-      /\/deep\//g
+      /\/deep\//g,
+      /::content/g
     ];
 
 function stylesToCssText(styles, preserveComments) {
@@ -10858,15 +10889,16 @@
 }
 
 function generateScriptDataUrl(script) {
-  var scriptContent = generateScriptContent(script), b64;
+  var scriptContent = generateScriptContent(script);
+  var b64 = 'data:text/javascript';
+  // base64 may be smaller, but does not handle unicode characters
+  // attempt base64 first, fall back to escaped text
   try {
-    b64 = btoa(scriptContent);
+    b64 += (';base64,' + btoa(scriptContent));
   } catch(e) {
-    b64 = btoa(unescape(encodeURIComponent(scriptContent)));
-    console.warn('Script contained non-latin characters that were forced ' +
-      'to latin. Some characters may be wrong.', script);
+    b64 += (';charset=utf-8,' + encodeURIComponent(scriptContent));
   }
-  return 'data:text/javascript;base64,' + b64;
+  return b64;
 }
 
 function generateScriptContent(script) {
@@ -11224,10 +11256,13 @@
 scope.hasNative = hasNative;
 scope.useNative = useNative;
 scope.importer = importer;
-scope.whenImportsReady = whenImportsReady;
 scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
 scope.isImportLoaded = isImportLoaded;
 scope.importLoader = importLoader;
+scope.whenReady = whenImportsReady;
+
+// deprecated
+scope.whenImportsReady = whenImportsReady;
 
 })(window.HTMLImports);
 
diff --git a/pkg/web_components/lib/platform.concat.js.map b/pkg/web_components/lib/platform.concat.js.map
index 46cb900..3c24cdf 100644
--- a/pkg/web_components/lib/platform.concat.js.map
+++ b/pkg/web_components/lib/platform.concat.js.map
@@ -50,6 +50,7 @@
     "../ShadowDOM/src/wrappers/Document.js",
     "../ShadowDOM/src/wrappers/Window.js",
     "../ShadowDOM/src/wrappers/DataTransfer.js",
+    "../ShadowDOM/src/wrappers/FormData.js",
     "../ShadowDOM/src/wrappers/override-constructors.js",
     "src/patches-shadowdom-polyfill.js",
     "src/ShadowCSS.js",
@@ -85,11 +86,11 @@
     "src/patches-mdv.js"
   ],
   "names": [],
-  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;CClEA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;CCnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;CCprDA;AACA;CCDA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC/ZA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CChDA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CCnXA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CChFA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCn4BA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,C;AC5HA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CC/CA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;CCdA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC9tBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CCjHA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CC1EA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CC5CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;CCzCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;CC7CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;CCrJA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;CC1TA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CC9BA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCtCA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCnCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;CC1CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CCzBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CCtEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCrBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;CCzCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;CC9DA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCjDA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CC/DA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCnCA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCpCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CC9BA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;CC3BA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;CC7CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;CClEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCvCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCjDA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CC9FA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;CCvBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CCzEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;CC9oBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CCrDA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CClEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CC1UA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CCpEA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CCvBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;CC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CCjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CCpwBA,Q;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC5CA,C;ACAA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CCpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;CCdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CCpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,C;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CChIA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CCjiBA;AACA;AACA;AACA;AACA;AACA,sD;ACLA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CCtLA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CCvTA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCtSA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CCpEA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCvDA;AACA;AACA;AACA;AACA;AACA,4D;ACLA;AACA;AACA;AACA;AACA;AACA,EACA;AACA,EACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA,EACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA,EACA;AACA,EACA;CCvVA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;CC3dA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA,0B;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;CCjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;CCtEA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;CCtVA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;CCtuCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,C",
+  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrrDA;AACA;A;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACn4BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtwBA,Q;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA,C;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjiBA;AACA;AACA;AACA;AACA;AACA,sD;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvDA;AACA;AACA;AACA;AACA;AACA,4D;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0B;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtuCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
   "sourcesContent": [
     "/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n",
     "/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n",
-    "// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (parts.length)\n      Array.prototype.push.apply(this, parts.slice());\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n",
+    "// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n",
     "// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n",
     "// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.polymerWrapper_ ||\n        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.impl;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.polymerWrapper_ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.impl[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n",
@@ -109,7 +110,7 @@
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        this.impl.innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return this.impl[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        this.impl[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return this.impl[name].apply(this.impl, arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = this.impl.getContext.apply(this.impl, arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n",
-    "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLFormElement = window.HTMLFormElement;\n\n  function HTMLFormElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLFormElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLFormElement.prototype, {\n    get elements() {\n      // Note: technically this should be an HTMLFormControlsCollection, but\n      // that inherits from HTMLCollection, so should be good enough. Spec:\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection\n      return wrapHTMLCollection(unwrap(this).elements);\n    }\n  });\n\n  registerWrapper(OriginalHTMLFormElement, HTMLFormElement,\n                  document.createElement('form'));\n\n  scope.wrappers.HTMLFormElement = HTMLFormElement;\n})(window.ShadowDOMPolyfill);\n",
+    "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n\n  var OriginalHTMLFormElement = window.HTMLFormElement;\n\n  function HTMLFormElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLFormElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLFormElement.prototype, {\n    get elements() {\n      // Note: technically this should be an HTMLFormControlsCollection, but\n      // that inherits from HTMLCollection, so should be good enough. Spec:\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection\n      return wrapHTMLCollection(unwrap(this).elements);\n    }\n  });\n\n  registerWrapper(OriginalHTMLFormElement, HTMLFormElement,\n                  document.createElement('form'));\n\n  scope.wrappers.HTMLFormElement = HTMLFormElement;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n\n  // getDistributedNodes is added in ShadowRenderer\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(this.impl.content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n",
@@ -129,15 +130,16 @@
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    this.impl = impl;\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(this.impl.startContainer);\n    },\n    get endContainer() {\n      return wrap(this.impl.endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(this.impl.commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      this.impl.setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      this.impl.setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      this.impl.setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      this.impl.setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      this.impl.setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      this.impl.setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      this.impl.selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      this.impl.selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(this.impl.extractContents());\n    },\n    cloneContents: function() {\n      return wrap(this.impl.cloneContents());\n    },\n    insertNode: function(node) {\n      this.impl.insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      this.impl.surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(this.impl.cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return this.impl.comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return this.impl.intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(this.impl.createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    this.treeScope_ =\n        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  var selectorStartCharRe = /^[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = this.impl.polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    this.impl.polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        var parentRenderer = this.parentRenderer;\n        if (parentRenderer)\n          parentRenderer.invalidate();\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  var selectorStartCharRe = /^[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = this.impl.polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    this.impl.polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(doc.impl, unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    getElementsByName: function(name) {\n      return SelectorsInterface.querySelectorAll.call(this,\n          '[name=' + JSON.stringify(String(name)) + ']');\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        this.impl = node;\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getElementsByName',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n",
-    "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n  };\n\n})(window.ShadowDOMPolyfill);\n",
+    "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  if (OriginalDataTransferSetDragImage) {\n    OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n      OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n    };\n  }\n\n})(window.ShadowDOMPolyfill);\n",
+    "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n\n  var OriginalFormData = window.FormData;\n\n  function FormData(formElement) {\n    this.impl = new OriginalFormData(formElement && unwrap(formElement));\n  }\n\n  registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n\n  scope.wrappers.FormData = FormData;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n\n  function queryShadow(node, selector) {\n    var m, el = node.firstElementChild;\n    var shadows, sr, i;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for(i = shadows.length - 1; i >= 0; i--) {\n      m = shadows[i].querySelector(selector);\n      if (m) {\n        return m;\n      }\n    }\n    while(el) {\n      m = queryShadow(el, selector);\n      if (m) {\n        return m;\n      }\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function queryAllShadows(node, selector, results) {\n    var el = node.firstElementChild;\n    var temp, sr, shadows, i, j;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for (i = shadows.length - 1; i >= 0; i--) {\n      temp = shadows[i].querySelectorAll(selector);\n      for(j = 0; j < temp.length; j++) {\n        results.push(temp[j]);\n      }\n    }\n    while (el) {\n      queryAllShadows(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  scope.queryAllShadows = function(node, selector, all) {\n    if (all) {\n      return queryAllShadows(node, selector, []);\n    } else {\n      return queryShadow(node, selector);\n    }\n  };\n})(window.Platform);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertCombinators(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    for (var i=0; i < combinatorsRe.length; i++) {\n      cssText = cssText.replace(combinatorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // TODO(sjmiles): KEYFRAMES_RULE in IE11 throws when we query cssText\n          // 'cssText' in rule returns true, but rule.cssText throws anyway\n          // We can test the rule type, e.g.\n          //   else if (rule.type !== CSSRule.KEYFRAMES_RULE && rule.cssText) {\n          // but this will prevent cssText propagation in other browsers which\n          // support it.\n          // KEYFRAMES_RULE has a CSSRuleSet, so the text can probably be reconstructed\n          // from that collection; this would be a proper fix.\n          // For now, I'm trapping the exception so IE11 is unblocked in other areas.\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            // squelch\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    combinatorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertShadowDOMSelectors(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert combinators like ::shadow and pseudo-elements like ::content\n   * by replacing with space.\n  */\n  convertShadowDOMSelectors: function(cssText) {\n    for (var i=0; i < shadowDOMSelectorsRe.length; i++) {\n      cssText = cssText.replace(shadowDOMSelectorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // TODO(sjmiles): KEYFRAMES_RULE in IE11 throws when we query cssText\n          // 'cssText' in rule returns true, but rule.cssText throws anyway\n          // We can test the rule type, e.g.\n          //   else if (rule.type !== CSSRule.KEYFRAMES_RULE && rule.cssText) {\n          // but this will prevent cssText propagation in other browsers which\n          // support it.\n          // KEYFRAMES_RULE has a CSSRuleSet, so the text can probably be reconstructed\n          // from that collection; this would be a proper fix.\n          // For now, I'm trapping the exception so IE11 is unblocked in other areas.\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            // squelch\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*['|\"]([^'\"]*)['|\"][^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*['|\"]([^'\"]*)['|\"][^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*['|\"]([^'\"]*)['|\"][^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    shadowDOMSelectorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g,\n      /::content/g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n",
     "} else {",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n  Platform.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})(window.Platform);\n",
     "}",
@@ -153,8 +155,8 @@
     "/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.cache[redirectedUrl] = resource;\n        $p = $p.concat(this.pending[redirectedUrl]);\n      }\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        //if (!err) {\n          // If url was redirected, use the redirected location so paths are\n          // calculated relative to that.\n          this.onload(redirectedUrl || url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.pending[redirectedUrl] = null;\n      }\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : redirectedUrl;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    elt.import.__importParsed = true;\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      callback && callback();\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :\n      link.__importParsed;\n}\n\n// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded\n// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007\n// and should be removed when this bug is addressed.\nif (useNative) {\n  new MutationObserver(function(mxns) {\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\n      if (m.addedNodes) {\n        handleImports(m.addedNodes);\n      }\n    }\n  }).observe(document.head, {childList: true});\n\n  function handleImports(nodes) {\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n      if (isImport(n)) {\n        handleImport(n);  \n      }\n    }\n  }\n\n  function isImport(element) {\n    return element.localName === 'link' && element.rel === 'import';\n  }\n\n  function handleImport(element) {\n    var loaded = element.import;\n    if (loaded) {\n      markTargetLoaded({target: element});\n    } else {\n      element.addEventListener('load', markTargetLoaded);\n      element.addEventListener('error', markTargetLoaded);\n    }\n  }\n\n  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.whenImportsReady = whenImportsReady;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\n\n})(window.HTMLImports);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    elt.import.__importParsed = true;\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script);\n  var b64 = 'data:text/javascript';\n  // base64 may be smaller, but does not handle unicode characters\n  // attempt base64 first, fall back to escaped text\n  try {\n    b64 += (';base64,' + btoa(scriptContent));\n  } catch(e) {\n    b64 += (';charset=utf-8,' + encodeURIComponent(scriptContent));\n  }\n  return b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      callback && callback();\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :\n      link.__importParsed;\n}\n\n// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded\n// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007\n// and should be removed when this bug is addressed.\nif (useNative) {\n  new MutationObserver(function(mxns) {\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\n      if (m.addedNodes) {\n        handleImports(m.addedNodes);\n      }\n    }\n  }).observe(document.head, {childList: true});\n\n  function handleImports(nodes) {\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n      if (isImport(n)) {\n        handleImport(n);  \n      }\n    }\n  }\n\n  function isImport(element) {\n    return element.localName === 'link' && element.rel === 'import';\n  }\n\n  function handleImport(element) {\n    var loaded = element.import;\n    if (loaded) {\n      markTargetLoaded({target: element});\n    } else {\n      element.addEventListener('load', markTargetLoaded);\n      element.addEventListener('error', markTargetLoaded);\n    }\n  }\n\n  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\nscope.whenReady = whenImportsReady;\n\n// deprecated\nscope.whenImportsReady = whenImportsReady;\n\n})(window.HTMLImports);\n",
     " /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(){\n\n// bootstrap\n\n// IE shim for CustomEvent\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, dictionary) {\n     var e = document.createEvent('HTMLEvents');\n     e.initEvent(inType,\n        dictionary.bubbles === false ? false : true,\n        dictionary.cancelable === false ? false : true,\n        dictionary.detail);\n     return e;\n  };\n}\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nHTMLImports.whenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  doc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};",
diff --git a/pkg/web_components/lib/platform.js b/pkg/web_components/lib/platform.js
index 5d67ba5..1757531 100644
--- a/pkg/web_components/lib/platform.js
+++ b/pkg/web_components/lib/platform.js
@@ -7,11 +7,11 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version: 0.3.3-29065bc
+// @version: 0.3.4-02a0f66
 
-window.Platform=window.Platform||{},window.logFlags=window.logFlags||{},function(a){var b=a.flags||{};location.search.slice(1).split("&").forEach(function(a){a=a.split("="),a[0]&&(b[a[0]]=a[1]||!0)});var c=document.currentScript||document.querySelector('script[src*="platform.js"]');if(c)for(var d,e=c.attributes,f=0;f<e.length;f++)d=e[f],"src"!==d.name&&(b[d.name]=d.value||!0);b.log&&b.log.split(",").forEach(function(a){window.logFlags[a]=!0}),b.shadow=b.shadow||b.shadowdom||b.polyfill,b.shadow="native"===b.shadow?!1:b.shadow||!HTMLElement.prototype.createShadowRoot,b.shadow&&document.querySelectorAll("script").length>1&&console.warn("platform.js is not the first script on the page. See http://www.polymer-project.org/docs/start/platform.html#setup for details."),b.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=b.register),b.imports&&(window.HTMLImports=window.HTMLImports||{flags:{}},window.HTMLImports.flags.imports=b.imports),a.flags=b}(Platform),"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}(),function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function getPathCharType(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function noop(){}function parsePath(a){function b(){if(!(k>=a.length)){var b=a[k+1];return"inSingleQuote"==l&&"'"==b||"inDoubleQuote"==l&&'"'==b?(k++,d=b,m.append(),!0):void 0}}for(var c,d,e,f,g,h,i,j=[],k=-1,l="beforePath",m={push:function(){void 0!==e&&(j.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};l;)if(k++,c=a[k],"\\"!=c||!b(l)){if(f=getPathCharType(c),i=pathStateMachine[l],g=i[f]||i["else"]||"error","error"==g)return;if(l=g[0],h=m[g[1]]||noop,d=void 0===g[2]?c:g[2],h(),"afterPath"===l)return j}}function isIdent(a){return identRegExp.test(a)}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");a.length&&Array.prototype.push.apply(this,a.slice()),hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function getPath(a){if(a instanceof Path)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(isIndex(a.length))return new Path(a,constructorIsPrivate);a=String(a)}var b=pathCache[a];if(b)return b;var c=parsePath(a);if(!c)return invalidPath;var b=new Path(c,constructorIsPrivate);return pathCache[a]=b,b}function formatAccessor(a){return isIndex(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(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 runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=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 newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(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 mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(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 createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__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},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",identRegExp=new RegExp("^"+identStart+"+"+identPart+"*$"),pathStateMachine={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=isIdent(c)?b?"."+c:c:formatAccessor(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=isIdent(c)?"."+c:formatAccessor(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=isIdent(c)?"."+c:formatAccessor(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.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)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,get path(){return this.path_},connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.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(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),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,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(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 EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(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 arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),Platform.flags.shadow?(window.ShadowDOMPolyfill={},function(a){"use strict";function b(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;try{var a=new Function("return true;");return a()}catch(b){return!1}}function c(a){if(!a)throw new Error("Assertion failed")}function d(a,b){for(var c=L(b),d=0;d<c.length;d++){var e=c[d];K(a,e,M(b,e))}return a}function e(a,b){for(var c=L(b),d=0;d<c.length;d++){var e=c[d];switch(e){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}K(a,e,M(b,e))}return a}function f(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function g(a,b,c){N.value=c,K(a,b,N)}function h(a){var b=a.__proto__||Object.getPrototypeOf(a),c=G.get(b);if(c)return c;var d=h(b),e=v(d);return s(b,e,a),e}function i(a,b){q(a,b,!0)}function j(a,b){q(b,a,!1)}function k(a){return/^on[a-z]+$/.test(a)}function l(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function m(a){return J&&l(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function n(a){return J&&l(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function o(a){return J&&l(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function p(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return P}}function q(b,c,d){for(var e=L(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){O&&b.__lookupGetter__(g);var h,i,j=p(b,g);if(d&&"function"==typeof j.value)c[g]=o(g);else{var l=k(g);h=l?a.getEventHandlerGetter(g):m(g),(j.writable||j.set)&&(i=l?a.getEventHandlerSetter(g):n(g)),K(c,g,{get:h,set:i,configurable:j.configurable,enumerable:j.enumerable})}}}}function r(a,b,c){var d=a.prototype;s(d,b,c),e(b,a)}function s(a,b,d){var e=b.prototype;c(void 0===G.get(a)),G.set(a,b),H.set(e,a),i(a,e),d&&j(e,d),g(e,"constructor",b),b.prototype=e}function t(a,b){return G.get(b.prototype)===a}function u(a){var b=Object.getPrototypeOf(a),c=h(b),d=v(c);return s(b,d,a),d}function v(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function w(a){return a instanceof I.EventTarget||a instanceof I.Event||a instanceof I.Range||a instanceof I.DOMImplementation||a instanceof I.CanvasRenderingContext2D||I.WebGLRenderingContext&&a instanceof I.WebGLRenderingContext}function x(a){return R&&a instanceof R||a instanceof T||a instanceof S||a instanceof U||a instanceof V||a instanceof Q||a instanceof W||X&&a instanceof X||Y&&a instanceof Y}function y(a){return null===a?null:(c(x(a)),a.polymerWrapper_||(a.polymerWrapper_=new(h(a))(a)))}function z(a){return null===a?null:(c(w(a)),a.impl)}function A(a){return a&&w(a)?z(a):a}function B(a){return a&&!w(a)?y(a):a}function C(a,b){null!==b&&(c(x(a)),c(void 0===b||w(b)),a.polymerWrapper_=b)}function D(a,b,c){Z.get=c,K(a.prototype,b,Z)}function E(a,b){D(a,b,function(){return y(this.impl[b])})}function F(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=B(this);return a[b].apply(a,arguments)}})})}var G=new WeakMap,H=new WeakMap,I=Object.create(null),J=b(),K=Object.defineProperty,L=Object.getOwnPropertyNames,M=Object.getOwnPropertyDescriptor,N={value:void 0,configurable:!0,enumerable:!1,writable:!0};L(window);var O=/Firefox/.test(navigator.userAgent),P={get:function(){},set:function(){},configurable:!0,enumerable:!0},Q=window.DOMImplementation,R=window.EventTarget,S=window.Event,T=window.Node,U=window.Window,V=window.Range,W=window.CanvasRenderingContext2D,X=window.WebGLRenderingContext,Y=window.SVGElementInstance,Z={get:void 0,configurable:!0,enumerable:!0};a.assert=c,a.constructorTable=G,a.defineGetter=D,a.defineWrapGetter=E,a.forwardMethodsToWrapper=F,a.isWrapper=w,a.isWrapperFor=t,a.mixin=d,a.nativePrototypeTable=H,a.oneOf=f,a.registerObject=u,a.registerWrapper=r,a.rewrap=C,a.unwrap=z,a.unwrapIfNeeded=A,a.wrap=y,a.wrapIfNeeded=B,a.wrappers=I}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){p=!1;do for(var a=o.slice(),b=!1,c=0;c<a.length;c++){var d=a[c],e=d.takeRecords();f(d),e.length&&(d.callback_(e,d),b=!0)}while(b)}function d(a,b){this.type=a,this.target=b,this.addedNodes=new m.NodeList,this.removedNodes=new m.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function e(a,b){for(;a;a=a.parentNode){var c=n.get(a);if(c)for(var d=0;d<c.length;d++){var e=c[d];e.options.subtree&&e.addTransientObserver(b)}}}function f(a){for(var b=0;b<a.nodes_.length;b++){var c=a.nodes_[b],d=n.get(c);if(!d)return;for(var e=0;e<d.length;e++){var f=d[e];f.observer===a&&f.removeTransientObservers()}}}function g(a,c,e){for(var f=Object.create(null),g=Object.create(null),h=a;h;h=h.parentNode){var i=n.get(h);if(i)for(var j=0;j<i.length;j++){var k=i[j],l=k.options;if((h===a||l.subtree)&&!("attributes"===c&&!l.attributes||"attributes"===c&&l.attributeFilter&&(null!==e.namespace||-1===l.attributeFilter.indexOf(e.name))||"characterData"===c&&!l.characterData||"childList"===c&&!l.childList)){var m=k.observer;f[m.uid_]=m,("attributes"===c&&l.attributeOldValue||"characterData"===c&&l.characterDataOldValue)&&(g[m.uid_]=e.oldValue)}}}var o=!1;for(var p in f){var m=f[p],q=new d(c,a);"name"in e&&"namespace"in e&&(q.attributeName=e.name,q.attributeNamespace=e.namespace),e.addedNodes&&(q.addedNodes=e.addedNodes),e.removedNodes&&(q.removedNodes=e.removedNodes),e.previousSibling&&(q.previousSibling=e.previousSibling),e.nextSibling&&(q.nextSibling=e.nextSibling),void 0!==g[p]&&(q.oldValue=g[p]),m.records_.push(q),o=!0}o&&b()}function h(a){if(this.childList=!!a.childList,this.subtree=!!a.subtree,this.attributes="attributes"in a||!("attributeOldValue"in a||"attributeFilter"in a)?!!a.attributes:!0,this.characterData="characterDataOldValue"in a&&!("characterData"in a)?!0:!!a.characterData,!this.attributes&&(a.attributeOldValue||"attributeFilter"in a)||!this.characterData&&a.characterDataOldValue)throw new TypeError;if(this.characterData=!!a.characterData,this.attributeOldValue=!!a.attributeOldValue,this.characterDataOldValue=!!a.characterDataOldValue,"attributeFilter"in a){if(null==a.attributeFilter||"object"!=typeof a.attributeFilter)throw new TypeError;this.attributeFilter=q.call(a.attributeFilter)}else this.attributeFilter=null}function i(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++r,o.push(this)}function j(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var k=a.setEndOfMicrotask,l=a.wrapIfNeeded,m=a.wrappers,n=new WeakMap,o=[],p=!1,q=Array.prototype.slice,r=0;i.prototype={observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){this.root=a,this.parent=b}function c(a,b){if(a.treeScope_!==b){a.treeScope_=b;for(var d=a.shadowRoot;d;d=d.olderShadowRoot)d.treeScope_.parent=b;for(var e=a.firstChild;e;e=e.nextSibling)c(e,b)}}function d(c){if(c instanceof a.wrappers.Window,c.treeScope_)return c.treeScope_;var e,f=c.parentNode;return e=f?d(f):new b(c,null),c.treeScope_=e}b.prototype={get renderer(){return this.root instanceof a.wrappers.ShadowRoot?a.getRendererForHost(this.root.host):null},contains:function(a){for(;a;a=a.parent)if(a===this)return!0;return!1}},a.TreeScope=b,a.getTreeScope=d,a.setTreeScope=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof Q.ShadowRoot}function c(a){return L(a).root}function d(a,d){var h=[],i=a;for(h.push(i);i;){var j=g(i);if(j&&j.length>0){for(var k=0;k<j.length;k++){var m=j[k];if(f(m)){var n=c(m),o=n.olderShadowRoot;o&&h.push(o)}h.push(m)}i=j[j.length-1]}else if(b(i)){if(l(a,i)&&e(d))break;i=i.host,h.push(i)}else i=i.parentNode,i&&h.push(i)}return h}function e(a){if(!a)return!1;switch(a.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function f(a){return a instanceof HTMLShadowElement}function g(b){return a.getDestinationInsertionPoints(b)}function h(a,b){if(0===a.length)return b;b instanceof Q.Window&&(b=b.document);for(var c=L(b),d=a[0],e=L(d),f=j(c,e),g=0;g<a.length;g++){var h=a[g];if(L(h)===f)return h}return a[a.length-1]}function i(a){for(var b=[];a;a=a.parent)b.push(a);return b}function j(a,b){for(var c=i(a),d=i(b),e=null;c.length>0&&d.length>0;){var f=c.pop(),g=d.pop();if(f!==g)break;e=f}return e}function k(a,b,c){b instanceof Q.Window&&(b=b.document);var e,f=L(b),g=L(c),h=d(c,a),e=j(f,g);e||(e=g.root);for(var i=e;i;i=i.parent)for(var k=0;k<h.length;k++){var l=h[k];if(L(l)===i)return l}return null}function l(a,b){return L(a)===L(b)}function m(a){if(!S.get(a)&&(S.set(a,!0),n(P(a),P(a.target)),J)){var b=J;throw J=null,b}}function n(b,c){if(T.get(b))throw new Error("InvalidStateError");T.set(b,!0),a.renderAllPending();var e,f,g,h=b.type;if("load"===h&&!b.bubbles){var i=c;i instanceof Q.Document&&(g=i.defaultView)&&(f=i,e=[])}if(!e)if(c instanceof Q.Window)g=c,e=[];else if(e=d(c,b),"load"!==b.type){var i=e[e.length-1];i instanceof Q.Document&&(g=i.defaultView)}return _.set(b,e),o(b,e,g,f)&&p(b,e,g,f)&&q(b,e,g,f),X.set(b,ab),V.delete(b,null),T.delete(b),b.defaultPrevented
-}function o(a,b,c,d){var e=bb;if(c&&!r(c,a,e,b,d))return!1;for(var f=b.length-1;f>0;f--)if(!r(b[f],a,e,b,d))return!1;return!0}function p(a,b,c,d){var e=cb,f=b[0]||c;return r(f,a,e,b,d)}function q(a,b,c,d){for(var e=db,f=1;f<b.length;f++)if(!r(b[f],a,e,b,d))return;c&&b.length>0&&r(c,a,e,b,d)}function r(a,b,c,d,e){var f=R.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===bb)return!0;c===db&&(c=cb)}else if(c===db&&!b.bubbles)return!0;if("relatedTarget"in b){var i=O(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=P(j),m=k(b,a,l);if(m===g)return!0}else m=null;W.set(b,m)}}X.set(b,c);var n=b.type,o=!1;U.set(b,g),V.set(b,a),f.depth++;for(var p=0,q=f.length;q>p;p++){var r=f[p];if(r.removed)o=!0;else if(!(r.type!==n||!r.capture&&c===bb||r.capture&&c===db))try{if("function"==typeof r.handler?r.handler.call(a,b):r.handler.handleEvent(b),Z.get(b))return!1}catch(s){J||(J=s)}}if(f.depth--,o&&0===f.depth){var t=f.slice();f.length=0;for(var p=0;p<t.length;p++)t[p].removed||f.push(t[p])}return!Y.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){if(!(a instanceof eb))return P(x(eb,"Event",a,b));var c=a;return pb||"beforeunload"!==c.type?void(this.impl=c):new y(c)}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:O(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void(this.impl=b):P(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&M(e.prototype,c),d)try{N(d,e,new d("temp"))}catch(f){N(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=O(arguments[b]);var c=O(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(nb)return new a(c,u(d));var e=O(document.createEvent(b)),f=mb[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=O(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(a){t.call(this,a)}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function B(a){this.impl=a}function C(a){return a instanceof Q.ShadowRoot&&(a=a.host),O(a)}function D(a,b){var c=R.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function E(a,b){for(var c=O(a);c;c=c.parentNode)if(D(P(c),b))return!0;return!1}function F(a){K(a,rb)}function G(b,c,e,f){a.renderAllPending();var g=P(sb.call(c.impl,e,f));if(!g)return null;var i=d(g,null),j=i.lastIndexOf(b);return-1==j?null:(i=i.slice(0,j),h(i,b))}function H(a){return function(){var b=$.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=$.get(this);d||(d=Object.create(null),$.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,K=a.forwardMethodsToWrapper,L=a.getTreeScope,M=a.mixin,N=a.registerWrapper,O=a.unwrap,P=a.wrap,Q=a.wrappers,R=(new WeakMap,new WeakMap),S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=0,bb=1,cb=2,db=3;s.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 eb=window.Event;eb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return U.get(this)},get currentTarget(){return V.get(this)},get eventPhase(){return X.get(this)},get path(){var a=_.get(this);return a?a.slice():[]},stopPropagation:function(){Y.set(this,!0)},stopImmediatePropagation:function(){Y.set(this,!0),Z.set(this,!0)}},N(eb,t,document.createEvent("Event"));var fb=v("UIEvent",t),gb=v("CustomEvent",t),hb={get relatedTarget(){var a=W.get(this);return void 0!==a?a:P(O(this).relatedTarget)}},ib=M({initMouseEvent:w("initMouseEvent",14)},hb),jb=M({initFocusEvent:w("initFocusEvent",5)},hb),kb=v("MouseEvent",fb,ib),lb=v("FocusEvent",fb,jb),mb=Object.create(null),nb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!nb){var ob=function(a,b,c){if(c){var d=mb[c];b=M(M({},d),b)}mb[a]=b};ob("Event",{bubbles:!1,cancelable:!1}),ob("CustomEvent",{detail:null},"Event"),ob("UIEvent",{view:null,detail:0},"Event"),ob("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ob("FocusEvent",{relatedTarget:null},"UIEvent")}var pb=window.BeforeUnloadEvent;y.prototype=Object.create(t.prototype),M(y.prototype,{get returnValue(){return this.impl.returnValue},set returnValue(a){this.impl.returnValue=a}}),pb&&N(pb,y);var qb=window.EventTarget,rb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;rb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),B.prototype={addEventListener:function(a,b,c){if(z(b)&&!A(a)){var d=new s(a,b,c),e=R.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],e.depth=0,R.set(this,e);e.push(d);var g=C(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=R.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=C(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=O(b),d=c.type;S.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return O(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},qb&&N(qb,B);var sb=document.elementFromPoint;a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=gb,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=lb,a.wrappers.MouseEvent=kb,a.wrappers.UIEvent=fb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,o)}function c(a){this.impl=a}function d(){this.length=0,b(this,"length")}function e(a){for(var b=new d,e=0;e<a.length;e++)b[e]=new c(a[e]);return b.length=e,b}function f(a){g.call(this,a)}var g=a.wrappers.UIEvent,h=a.mixin,i=a.registerWrapper,j=a.unwrap,k=a.wrap,l=window.TouchEvent;if(l){var m;try{m=document.createEvent("TouchEvent")}catch(n){return}var o={enumerable:!1};c.prototype={get target(){return k(this.impl.target)}};var p={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(a){p.get=function(){return this.impl[a]},Object.defineProperty(c.prototype,a,p)}),d.prototype={item:function(a){return this[a]}},f.prototype=Object.create(g.prototype),h(f.prototype,{get touches(){return e(j(this).touches)},get targetTouches(){return e(j(this).targetTouches)},get changedTouches(){return e(j(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),i(l,f,m),a.wrappers.Touch=c,a.wrappers.TouchEvent=f,a.wrappers.TouchList=d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,g)}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,g={enumerable:!1};c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);O=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;O=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new y,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a,b){I(a,b),a.nodeIsInserted_()}function k(a,b){for(var c=D(b),d=0;d<a.length;d++)j(a[d],c)}function l(a){I(a,new z(a,null))}function m(a){for(var b=0;b<a.length;b++)l(a[b])}function n(a,b){var c=a.nodeType===w.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(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 p(a,b){o(a,b);var c=b.length;if(1===c)return J(b[0]);for(var d=J(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(J(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=J(b),e=d.parentNode;e&&V.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=J(a),g=f.firstChild;g;)c=g.nextSibling,V.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=L(c?P.call(c,a.impl,!1):Q.call(a.impl,!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof N.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a,b){if(!b||D(a)!==D(b))return!1;for(var c=b;c;c=c.parentNode)if(c===a)return!0;return!1}function w(a){A(a instanceof R),x.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var x=a.wrappers.EventTarget,y=a.wrappers.NodeList,z=a.TreeScope,A=a.assert,B=a.defineWrapGetter,C=a.enqueueMutation,D=a.getTreeScope,E=a.isWrapper,F=a.mixin,G=a.registerTransientObservers,H=a.registerWrapper,I=a.setTreeScope,J=a.unwrap,K=a.unwrapIfNeeded,L=a.wrap,M=a.wrapIfNeeded,N=a.wrappers,O=!1,P=document.importNode,Q=window.Node.prototype.cloneNode,R=window.Node,S=window.DocumentFragment,T=(R.prototype.appendChild,R.prototype.compareDocumentPosition),U=R.prototype.insertBefore,V=R.prototype.removeChild,W=R.prototype.replaceChild,X=/Trident/.test(navigator.userAgent),Y=X?function(a,b){try{V.call(a,b)}catch(c){if(!(a instanceof S))throw c}}:function(a,b){V.call(a,b)};w.prototype=Object.create(x.prototype),F(w.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?E(c)?d=J(c):(d=c,c=L(d)):(c=null,d=null),c&&A(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),U.call(this.impl,J(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var j=d?d.parentNode:this.impl;j?U.call(j,p(this,e),d):o(this,e)}return C(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e,this),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=J(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Y(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),Y(this.impl,f);return O||C(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),G(this,a),a},replaceChild:function(a,d){b(a);var e;if(E(d)?e=J(d):(e=d,d=L(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),W.call(this.impl,J(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&W.call(e.parentNode,p(this,h),e)),C(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h,this),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:L(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:L(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:L(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:L(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:L(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==w.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=w.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=this.impl.ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),this.impl.textContent=a;var d=i(this.childNodes);C(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d,this)},get childNodes(){for(var a=new y,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){return v(this,M(a))},compareDocumentPosition:function(a){return T.call(this.impl,K(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===w.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,t(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(R,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.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){return a.matches(b)}function d(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===l}function e(){return!0}function f(a,b){return a.localName===b}function g(a,b){return a.namespaceURI===b}function h(a,b,c){return a.namespaceURI===b&&a.localName===c}function i(a,b,c,d,e){for(var f=a.firstElementChild;f;)c(f,d,e)&&(b[b.length++]=f),i(f,b,c,d,e),f=f.nextElementSibling;return b}var j=a.wrappers.HTMLCollection,k=a.wrappers.NodeList,l="http://www.w3.org/1999/xhtml",m={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return i(this,new k,c,a)}},n={getElementsByTagName:function(a){var b=new j;return"*"===a?i(this,b,e):i(this,b,d,a,a.toLowerCase())},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new j;if(""===a)a=null;else if("*"===a)return"*"===b?i(this,c,e):i(this,c,f,b);return"*"===b?i(this,c,g,a):i(this,c,h,a,b)}};a.GetElementsByInterface=n,a.SelectorsInterface=m}(window.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},remove:function(){var a=this.parentNode;a&&a.removeChild(this)}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return this.impl.data},set data(a){var b=this.impl.data;e(this,"characterData",{oldValue:b}),this.impl.data=a}}),f(b.prototype,c),g(h,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){a.invalidateRendererBasedOnAttribute(b,"class")}function c(a,b){this.impl=a,this.ownerElement_=b}c.prototype={get length(){return this.impl.length},item:function(a){return this.impl.item(a)},contains:function(a){return this.impl.contains(a)},add:function(){this.impl.add.apply(this.impl,arguments),b(this.ownerElement_)},remove:function(){this.impl.remove.apply(this.impl,arguments),b(this.ownerElement_)},toggle:function(){var a=this.impl.toggle.apply(this.impl,arguments);return b(this.ownerElement_),a},toString:function(){return this.impl.toString()}},a.wrappers.DOMTokenList=c}(window.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,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){g.call(this,a)}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.wrappers.DOMTokenList,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.unwrap,o=a.wrappers,p=window.Element,q=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return p.prototype[a]}),r=q[0],s=p.prototype[r],t=new WeakMap;d.prototype=Object.create(g.prototype),l(d.prototype,{createShadowRoot:function(){var b=new o.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,d){var e=this.impl.getAttribute(a);this.impl.setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=this.impl.getAttribute(a);this.impl.removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return s.call(this.impl,a)},get classList(){var a=t.get(this);return a||t.set(this,a=new h(n(this).classList,this)),a},get className(){return n(this).className},set className(a){this.setAttribute("class",a)},get id(){return n(this).id},set id(a){this.setAttribute("id",a)}}),q.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),p.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),l(d.prototype,e),l(d.prototype,f),l(d.prototype,i),l(d.prototype,j),m(p,d,document.createElementNS(null,"x")),a.invalidateRendererBasedOnAttribute=b,a.matchesNames=q,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"\xa0":return"&nbsp;"}}function c(a){return a.replace(z,b)}function d(a){return a.replace(A,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",B[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&C[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof y.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=w(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(x(f))}function i(a){o.call(this,a)}function j(a,b){var c=w(a.cloneNode(!1));c.innerHTML=b;for(var d,e=w(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return x(e)}function k(b){return function(){return a.renderAllPending(),this.impl[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unwrap,x=a.wrap,y=a.wrappers,z=/[&\u00A0"]/g,A=/[&\u00A0<>]/g,B=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),C=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D=/MSIE/.test(navigator.userAgent),E=window.HTMLElement,F=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(D&&C[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof y.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!F&&this instanceof y.HTMLTemplateElement?h(this.content,a):this.impl.innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(E,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.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}(window.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}(window.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.wrapHTMLCollection,g=a.unwrap,h=(a.wrap,window.HTMLFormElement);b.prototype=Object.create(c.prototype),d(b.prototype,{get elements(){return f(g(this).elements)}}),e(h,b,document.createElement("form")),a.wrappers.HTMLFormElement=b}(window.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"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}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}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=(a.mixin,a.wrappers.NodeList,a.registerWrapper),e=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=k.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);k.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=h(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!l){var b=c(a);j.set(this,i(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unwrap,i=a.wrap,j=new WeakMap,k=new WeakMap,l=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{get content(){return l?i(this.impl.content):j.get(this)}}),l&&g(l,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.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.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){return void 0===a?void c.prototype.remove.call(this):("object"==typeof a&&(a=f(a)),void f(this).remove(a))},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.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.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.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.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.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.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.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,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.wrappers.Element,c=a.wrappers.HTMLElement,d=a.registerObject,e="http://www.w3.org/2000/svg",f=document.createElementNS(e,"title"),g=d(f),h=Object.getPrototypeOf(g.prototype).constructor;if(!("classList"in f)){var i=Object.getOwnPropertyDescriptor(b.prototype,"classList");Object.defineProperty(c.prototype,"classList",i),delete b.prototype.classList
-}a.wrappers.SVGElement=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.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.wrap,g=window.SVGElementInstance;g&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return f(this.impl.correspondingElement)},get correspondingUseElement(){return f(this.impl.correspondingUseElement)},get parentNode(){return f(this.impl.parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return f(this.impl.firstChild)},get lastChild(){return f(this.impl.lastChild)},get previousSibling(){return f(this.impl.previousSibling)},get nextSibling(){return f(this.impl.nextSibling)}}),e(g,b),a.wrappers.SVGElementInstance=b)}(window.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,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.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;if(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)}});var h=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(g,b,h),a.wrappers.WebGLRenderingContext=b}}(window.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))},toString:function(){return this.impl.toString()}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.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.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=k(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;m.set(this,e),this.treeScope_=new d(this,g(e||a)),l.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unwrap,l=new WeakMap,m=new WeakMap,n=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return m.get(this)||null},get host(){return l.get(this)||null},invalidateShadowRenderer:function(){return l.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return n.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.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){I.set(a,[])}function f(a){var b=I.get(a);return b||I.set(a,b=[]),b}function g(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function h(){for(var a=0;a<M.length;a++){var b=M[a],c=b.parentRenderer;c&&c.dirty||b.render()}M=[]}function i(){y=null,h()}function j(a){var b=K.get(a);return b||(b=new n(a),K.set(a,b)),b}function k(a){var b=E(a).root;return b instanceof D?b:null}function l(a){return j(a.host)}function m(a){this.skip=!1,this.node=a,this.childNodes=[]}function n(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function o(a){for(var b=[],c=a.firstChild;c;c=c.nextSibling)v(c)?b.push.apply(b,f(c)):b.push(c);return b}function p(a){if(a instanceof B)return a;if(a instanceof A)return null;for(var b=a.firstChild;b;b=b.nextSibling){var c=p(b);if(c)return c}return null}function q(a,b){f(b).push(a);var c=J.get(a);c?c.push(b):J.set(a,[b])}function r(a){return J.get(a)}function s(a){J.set(a,void 0)}function t(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if(!O.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function u(a,b){var c=r(b);return c&&c[c.length-1]===a}function v(a){return a instanceof A||a instanceof B}function w(a){return a.shadowRoot}function x(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.getTreeScope),F=(a.mixin,a.oneOf),G=a.unwrap,H=a.wrap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),M=[],N=new ArraySplice;N.equals=function(a,b){return G(a.node)===b},m.prototype={append:function(a){var b=new m(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=g(G(b)),h=a||new WeakMap,i=N.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(h);for(var o=n.removed.length,p=0;o>p;p++){var q=H(f[k++]);h.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),h.set(u,!0),t.sync(h)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(h)}}},n.prototype={render:function(a){if(this.dirty){this.invalidateAttributes();var b=this.host;this.distribution(b);var c=a||new m(b);this.buildRenderTree(c,b);var d=!a;d&&c.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){if(this.dirty=!0,M.push(this),y)return;y=window[L](i,0)}},distribution:function(a){this.resetAll(a),this.distributionResolution(a)},resetAll:function(a){v(a)?e(a):s(a);for(var b=a.firstChild;b;b=b.nextSibling)this.resetAll(b);a.shadowRoot&&this.resetAll(a.shadowRoot),a.olderShadowRoot&&this.resetAll(a.olderShadowRoot)},distributionResolution:function(a){if(w(a)){for(var b=a,c=o(b),d=x(b),e=0;e<d.length;e++)this.poolDistribution(d[e],c);for(var e=d.length-1;e>=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i<c.length;i++)q(c[i],g)}this.distributionResolution(f)}}for(var j=a.firstChild;j;j=j.nextSibling)this.distributionResolution(j)},poolDistribution:function(a,b){if(!(a instanceof B))if(a instanceof A){var c=a;this.updateDependentAttributes(c.getAttribute("select"));for(var d=!1,e=0;e<b.length;e++){var a=b[e];a&&t(a,c)&&(q(a,c),b[e]=void 0,d=!0)}if(!d)for(var f=c.firstChild;f;f=f.nextSibling)q(f,c)}else for(var f=a.firstChild;f;f=f.nextSibling)this.poolDistribution(f,b)},buildRenderTree:function(a,b){for(var c=this.compose(b),d=0;d<c.length;d++){var e=c[d],f=a.append(e);this.buildRenderTree(f,e)}if(w(b)){var g=j(b);g.dirty=!1}},compose:function(a){for(var b=[],c=a.shadowRoot||a,d=c.firstChild;d;d=d.nextSibling)if(v(d)){this.associateNode(c);for(var e=f(d),g=0;g<e.length;g++){var h=e[g];u(d,h)&&b.push(h)}}else b.push(d);return b},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]},associateNode:function(a){a.impl.polymerShadowRenderer_=this}};var O=/^[*.#[a-zA-Z_|]/;C.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=B.prototype.getDistributedNodes=function(){return h(),f(this)},z.prototype.getDestinationInsertionPoints=function(){return h(),r(this)||[]},A.prototype.nodeIsInserted_=B.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=k(this);b&&(a=l(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.getRendererForHost=j,a.getShadowTrees=x,a.renderAllPending=h,a.getDestinationInsertionPoints=r,a.visual={insertBefore:c,remove:d}}(window.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","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}{var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap;window.Selection}b.prototype={get anchorNode(){return f(this.impl.anchorNode)},get focusNode(){return f(this.impl.focusNode)},addRange:function(a){this.impl.addRange(d(a))},collapse:function(a,b){this.impl.collapse(e(a),b)},containsNode:function(a,b){return this.impl.containsNode(e(a),b)},extend:function(a,b){this.impl.extend(e(a),b)},getRangeAt:function(a){return f(this.impl.getRangeAt(a))},removeRange:function(a){this.impl.removeRange(d(a))},selectAllChildren:function(a){this.impl.selectAllChildren(e(a))},toString:function(){return this.impl.toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a),this.treeScope_=new p(this,null)}function c(a){var c=document[a];b.prototype[a]=function(){return A(c.apply(this.impl,arguments))}}function d(a,b){D.call(b.impl,z(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&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 A(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.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.TreeScope,q=a.cloneNode,r=a.defineWrapGetter,s=a.elementFromPoint,t=a.forwardMethodsToWrapper,u=a.matchesNames,v=a.mixin,w=a.registerWrapper,x=a.renderAllPending,y=a.rewrap,z=a.unwrap,A=a.wrap,B=a.wrapEventTargetMethods,C=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),r(b,"documentElement"),r(b,"body"),r(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var D=document.adoptNode,E=document.getSelection;if(v(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return s(this,this,a,b)},importNode:function(a,b){return q(a,b,this.impl)},getSelection:function(){return x(),new m(E.call(z(this)))},getElementsByName:function(a){return n.querySelectorAll.call(this,"[name="+JSON.stringify(String(a))+"]")}}),document.registerElement){var F=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void(this.impl=a):f?document.createElement(f,b):document.createElement(b)}var e,f;if(void 0!==c&&(e=c.prototype,f=c.extends),e||(e=Object.create(HTMLElement.prototype)),a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var g,h=Object.getPrototypeOf(e),i=[];h&&!(g=a.nativePrototypeTable.get(h));)i.push(h),h=Object.getPrototypeOf(h);if(!g)throw new Error("NotSupportedError");for(var j=Object.create(g),k=i.length-1;k>=0;k--)j=Object.create(j);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(j[a]=function(){A(this)instanceof d||y(this),b.apply(A(this),arguments)})});var l={prototype:j};f&&(l.extends=f),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(j,d),a.nativePrototypeTable.set(e,j);F.call(z(this),b,l);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getElementsByName","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=C.get(this);return a?a:(a=new g(z(this).implementation),C.set(this,a),a)},get defaultView(){return A(z(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),B([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(m.call(h(this)))},get document(){return j(h(this).document)}}),f(k,b,window),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)}}(window.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}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(a){function b(a,c){var d,e,f,g,h=a.firstElementChild;for(e=[],f=a.shadowRoot;f;)e.push(f),f=f.olderShadowRoot;for(g=e.length-1;g>=0;g--)if(d=e[g].querySelector(c))return d;for(;h;){if(d=b(h,c))return d;h=h.nextElementSibling}return null}function c(a,b,d){var e,f,g,h,i,j=a.firstElementChild;for(g=[],f=a.shadowRoot;f;)g.push(f),f=f.olderShadowRoot;for(h=g.length-1;h>=0;h--)for(e=g[h].querySelectorAll(b),i=0;i<e.length;i++)d.push(e[i]);for(;j;)c(j,b,d),j=j.nextElementSibling;return d}window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var d=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var a=d.call(this);return CustomElements.watchShadow(this),a},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot,a.queryAllShadows=function(a,d,e){return e?c(a,d,[]):b(a,d)}}(window.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(l,"")),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=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=g.sheet.cssRules,b(e)})}else e=d(a),b(e)}}function h(a){a&&j().appendChild(document.createTextNode(a))}function i(a,b){var d=c(a);d.setAttribute(b,""),d.setAttribute(z,""),document.head.appendChild(d)}function j(){return w||(w=document.createElement("style"),w.setAttribute(z,""),w[z]=!0),w}var k={strictStyling:!1,registry:{},shimStyling:function(a,c,d){var e=this.prepareRoot(a,c,d),f=this.isTypeExtension(d),g=this.makeScopeSelector(c,f),h=b(e,!0);h=this.scopeCssText(h,g),a&&(a.shimmedStyle=h),this.addCssToDocument(h,c)},shimStyle:function(a,b){return this.shimCssText(a.textContent,b)},shimCssText:function(a,b){return a=this.insertDirectives(a),this.scopeCssText(a,b)},makeScopeSelector:function(a,b){return a?b?"[is="+a+"]":a:""},isTypeExtension:function(a){return a&&a.indexOf("-")<0},prepareRoot:function(a,b,c){var d=this.registerRoot(a,b,c);return this.replaceTextInStyles(d.rootStyles,this.insertDirectives),this.removeStyles(a,d.rootStyles),this.strictStyling&&this.applyScopeToContent(a,b),d.scopeStyles},removeStyles:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)c.parentNode.removeChild(c)},registerRoot:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=this.findStyles(a);d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},findStyles:function(a){if(!a)return[];var b=a.querySelectorAll("style");return Array.prototype.filter.call(b,function(a){return!a.hasAttribute(A)})},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))},insertDirectives:function(a){return a=this.insertPolyfillDirectivesInCssText(a),this.insertPolyfillRulesInCssText(a)},insertPolyfillDirectivesInCssText:function(a){return a=a.replace(m,function(a,b){return b.slice(0,-2)+"{"}),a.replace(n,function(a,b){return b+" {"})},insertPolyfillRulesInCssText:function(a){return a=a.replace(o,function(a,b){return b.slice(0,-1)}),a.replace(p,function(a,b,c,d){var e=a.replace(b,"").replace(c,"");return d+e})},scopeCssText:function(a,b){var c=this.extractUnscopedRulesFromCssText(a);if(a=this.insertPolyfillHostInCssText(a),a=this.convertColonHost(a),a=this.convertColonHostContext(a),a=this.convertCombinators(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertCombinators:function(a){for(var b=0;b<combinatorsRe.length;b++)a=a.replace(combinatorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){if(a.selectorText&&a.style&&void 0!==a.style.cssText)c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n";else if(a.type===CSSRule.MEDIA_RULE)c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n";else try{a.cssText&&(c+=a.cssText+"\n\n")}catch(d){}},this),c},scopeSelector:function(a,b,c){var d=[],e=a.split(",");return e.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b)&&(a=c&&!a.match(polyfillHostNoCombinator)?this.applyStrictSelectorScope(a,b):this.applySelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){if(Array.isArray(b))return!0;var c=this.makeScopeMatcher(b);return!a.match(c)},makeScopeMatcher:function(a){return a=a.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+a+")"+selectorReSuffix,"m")},applySelectorScope:function(a,b){return Array.isArray(b)?this.applySelectorScopeList(a,b):this.applySimpleSelectorScope(a,b)},applySelectorScopeList:function(a,b){for(var c,d=[],e=0;c=b[e];e++)d.push(this.applySimpleSelectorScope(a,c));return d.join(", ")},applySimpleSelectorScope:function(a,b){return a.match(polyfillHostRe)?(a=a.replace(polyfillHostNoCombinator,b),a.replace(polyfillHostRe,b+" ")):b+" "+a},applyStrictSelectorScope:function(a,b){b=b.replace(/\[is=([^\]]*)\]/g,"$1");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(polyfillHostRe,"");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(colonHostContextRe,t).replace(colonHostRe,s)},propertiesFromRule:function(a){var b=a.style.cssText;a.style.content&&!a.style.content.match(/['"]+|attr/)&&(b=b.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"));var c=a.style;for(var d in c)"initial"===c[d]&&(b+=d+": initial; ");return b},replaceTextInStyles:function(a,b){a&&b&&(a instanceof Array||(a=[a]),Array.prototype.forEach.call(a,function(a){a.textContent=b.call(this,a.textContent)},this))},addCssToDocument:function(a,b){a.match("@import")?i(a,b):h(a)}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/polyfill-next-selector[^}]*content\:[\s]*'([^']*)'[^}]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),combinatorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){var b=a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var c="link[rel=stylesheet]["+y+"]",d="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+c,HTMLImports.importer.importsPreloadSelectors+=","+c,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,c,d].join(",");var e=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var c=a.__importElement||a;if(!c.hasAttribute(y))return void e.call(this,a);a.__resource?(c=a.ownerDocument.createElement("style"),c.textContent=b.resolveCssText(a.__resource,a.href)):b.resolveStyle(c),c.textContent=k.shimStyle(c),c.removeAttribute(y,""),c.setAttribute(z,""),c[z]=!0,c.parentNode!==C&&(a.parentNode===C?C.replaceChild(c,a):C.appendChild(c)),c.__importParsed=!0,this.markParsingComplete(a),this.parseNext()}};var f=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:f.call(this,a)}}})}a.ShadowCSS=k}(window.Platform)):!function(){window.wrap=window.unwrap=function(a){return a},addEventListener("DOMContentLoaded",function(){if(CustomElements.useNative===!1){var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b}}}),Platform.templateContent=function(a){if(window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(a),!a.content&&!a._content){for(var b=document.createDocumentFragment();a.firstChild;)b.appendChild(a.firstChild);a._content=b}return a.content||a._content}}(window.Platform),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query";else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";
-continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x<l.length;x++){var y=l[x];if("	"!=y&&"\n"!=y&&"\r"!=y)if(":"!=y||null!==this._password){var z=e(y);null!==this._password?this._password+=z:this._username+=z}else this._password="";else i("Invalid whitespace in authority.")}l=""}else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){k-=l.length,l="",j="host";continue}l+=u}break;case"file host":if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){2!=l.length||!p.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?j="relative path start":(this._host=d.call(this,l),l="",j="relative path start"):j="relative path";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid whitespace in file host."):l+=u;break;case"host":case"hostname":if(":"!=u||s){if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){if(this._host=d.call(this,l),l="",j="relative path start",g)break a;continue}"	"!=u&&"\n"!=u&&"\r"!=u?("["==u?s=!0:"]"==u&&(s=!1),l+=u):i("Invalid code point in host/hostname: "+u)}else if(this._host=d.call(this,l),l="",j="port","hostname"==g)break a;break;case"port":if(/[0-9]/.test(u))l+=u;else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u||g){if(""!=l){var A=parseInt(l,10);A!=m[this._scheme]&&(this._port=A+""),l=""}if(g)break a;j="relative path start";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid code point in port: "+u):c.call(this)}break;case"relative path start":if("\\"==u&&i("'\\' not allowed in path."),j="relative path","/"!=u&&"\\"!=u)continue;break;case"relative path":if(o!=u&&"/"!=u&&"\\"!=u&&(g||"?"!=u&&"#"!=u))"	"!=u&&"\n"!=u&&"\r"!=u&&(l+=e(u));else{"\\"==u&&i("\\ not allowed in relative path.");var B;(B=n[l.toLowerCase()])&&(l=B),".."==l?(this._path.pop(),"/"!=u&&"\\"!=u&&this._path.push("")):"."==l&&"/"!=u&&"\\"!=u?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&p.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==u?(this._query="?",j="query"):"#"==u&&(this._fragment="#",j="fragment")}break;case"query":g||"#"!=u?o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._query+=f(u)):(this._fragment="#",j="fragment");break;case"fragment":o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._fragment+=u)}k++}}function h(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function i(a,b){void 0===b||b instanceof i||(b=new i(String(b))),this._url=a,h.call(this);var c=a.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");g.call(this,c,null,b)}var j=!1;if(!a.forceJURL)try{var k=new URL("b","http://a");j="http://a/b"===k.href}catch(l){}if(!j){var m=Object.create(null);m.ftp=21,m.file=0,m.gopher=70,m.http=80,m.https=443,m.ws=80,m.wss=443;var n=Object.create(null);n["%2e"]=".",n[".%2e"]="..",n["%2e."]="..",n["%2e%2e"]="..";var o=void 0,p=/[a-zA-Z]/,q=/[a-zA-Z0-9\+\-\.]/;i.prototype={get href(){if(this._isInvalid)return this._url;var a="";return(""!=this._username||null!=this._password)&&(a=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+a+this.host:"")+this.pathname+this._query+this._fragment},set href(a){h.call(this),g.call(this,a)},get protocol(){return this._scheme+":"},set protocol(a){this._isInvalid||g.call(this,a+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"host")},get hostname(){return this._host},set hostname(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"hostname")},get port(){return this._port},set port(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(a){!this._isInvalid&&this._isRelative&&(this._path=[],g.call(this,a,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(a){!this._isInvalid&&this._isRelative&&(this._query="?","?"==a[0]&&(a=a.slice(1)),g.call(this,a,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(a){this._isInvalid||(this._fragment="#","#"==a[0]&&(a=a.slice(1)),g.call(this,a,"fragment"))}},a.URL=i}}(window),function(a){function b(a){for(var b=a||{},d=1;d<arguments.length;d++){var e=arguments[d];try{for(var f in e)c(f,e,b)}catch(g){}}return b}function c(a,b,c){var e=d(b,a);Object.defineProperty(c,a,e)}function d(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||d(Object.getPrototypeOf(a),b)}}Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();return d.push.apply(d,arguments),b.apply(a,d)}}),a.mixin=b}(window.Platform),function(a){"use strict";function b(a,b,c){var d="string"==typeof a?document.createElement(a):a.cloneNode(!0);if(d.innerHTML=b,c)for(var e in c)d.setAttribute(e,c[e]);return d}var c=DOMTokenList.prototype.add,d=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)c.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)d.call(this,arguments[a])},DOMTokenList.prototype.toggle=function(a,b){1==arguments.length&&(b=!this.contains(a)),b?this.add(a):this.remove(a)},DOMTokenList.prototype.switch=function(a,b){a&&this.remove(a),b&&this.add(b)};var e=function(){return Array.prototype.slice.call(this)},f=window.NamedNodeMap||window.MozNamedAttrMap||{};if(NodeList.prototype.array=e,f.prototype.array=e,HTMLCollection.prototype.array=e,!window.performance){var g=Date.now();window.performance={now:function(){return Date.now()-g}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var a=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return a?function(b){return a(function(){b(performance.now())})}:function(a){return window.setTimeout(a,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(a){clearTimeout(a)}}());var h=[],i=function(){h.push(arguments)};window.Polymer=i,a.deliverDeclarations=function(){return a.deliverDeclarations=function(){throw"Possible attempt to load Polymer twice"},h},window.addEventListener("DOMContentLoaded",function(){window.Polymer===i&&(window.Polymer=function(){console.error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})}),a.createDOM=b}(window.Platform),function(a){a.templateContent=a.templateContent||function(a){return a.content}}(window.Platform),function(a){a=a||(window.Inspector={});var b;window.sinspect=function(a,d){b||(b=window.open("","ShadowDOM Inspector",null,!0),b.document.write(c),b.api={shadowize:shadowize}),f(a||wrap(document.body),d)};var c=["<!DOCTYPE html>","<html>","  <head>","    <title>ShadowDOM Inspector</title>","    <style>","      body {","      }","      pre {",'        font: 9pt "Courier New", monospace;',"        line-height: 1.5em;","      }","      tag {","        color: purple;","      }","      ul {","         margin: 0;","         padding: 0;","         list-style: none;","      }","      li {","         display: inline-block;","         background-color: #f1f1f1;","         padding: 4px 6px;","         border-radius: 4px;","         margin-right: 4px;","      }","    </style>","  </head>","  <body>",'    <ul id="crumbs">',"    </ul>",'    <div id="tree"></div>',"  </body>","</html>"].join("\n"),d=[],e=function(){var a=b.document,c=a.querySelector("#crumbs");c.textContent="";for(var e,g=0;e=d[g];g++){var h=a.createElement("a");h.href="#",h.textContent=e.localName,h.idx=g,h.onclick=function(a){for(var b;d.length>this.idx;)b=d.pop();f(b.shadow||b,b),a.preventDefault()},c.appendChild(a.createElement("li")).appendChild(h)}},f=function(a,c){var f=b.document;k=[];var g=c||a;d.push(g),e(),f.body.querySelector("#tree").innerHTML="<pre>"+j(a,a.childNodes)+"</pre>"},g=Array.prototype.forEach.call.bind(Array.prototype.forEach),h={STYLE:1,SCRIPT:1,"#comment":1,TEMPLATE:1},i=function(a){return h[a.nodeName]},j=function(a,b,c){if(i(a))return"";var d=c||"";if(a.localName||11==a.nodeType){var e=a.localName||"shadow-root",f=d+l(a);"content"==e&&(b=a.getDistributedNodes()),f+="<br/>";var h=d+"&nbsp;&nbsp;";g(b,function(a){f+=j(a,a.childNodes,h)}),f+=d,{br:1}[e]||(f+="<tag>&lt;/"+e+"&gt;</tag>",f+="<br/>")}else{var k=a.textContent.trim();f=k?d+'"'+k+'"<br/>':""}return f},k=[],l=function(a){var b="<tag>&lt;",c=a.localName||"shadow-root";return a.webkitShadowRoot||a.shadowRoot?(b+=' <button idx="'+k.length+'" onclick="api.shadowize.call(this)">'+c+"</button>",k.push(a)):b+=c||"shadow-root",a.attributes&&g(a.attributes,function(a){b+=" "+a.name+(a.value?'="'+a.value+'"':"")}),b+="&gt;</tag>"};shadowize=function(){var a=Number(this.attributes.idx.value),b=k[a];b?f(b.webkitShadowRoot||b.shadowRoot,b):(console.log("bad shadowize node"),console.dir(this))},a.output=j}(window.Inspector),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window),function(a){function b(a){f.textContent=d++,e.push(a)}function c(){for(;e.length;)e.shift()()}var d=0,e=[],f=document.createTextNode("");new(window.MutationObserver||JsMutationObserver)(c).observe(f,{characterData:!0}),a.endOfMicrotask=b}(Platform),function(a){function b(a,b,d,e){return a.replace(e,function(a,e,f,g){var h=f.replace(/["']/g,"");return h=c(b,h,d),e+"'"+h+"'"+g})}function c(a,b,c){if(b&&"/"===b[0])return b;var e=new URL(b,a);return c?e.href:d(e.href)}function d(a){var b=new URL(document.baseURI),c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b,c):a}function e(a,b){for(var c=a.pathname,d=b.pathname,e=c.split("/"),f=d.split("/");e.length&&e[0]===f[0];)e.shift(),f.shift();for(var g=0,h=e.length-1;h>g;g++)f.unshift("..");return f.join("/")+b.search+b.hash}var f={resolveDom:function(a,b){b=b||a.ownerDocument.baseURI,this.resolveAttributes(a,b),this.resolveStyles(a,b);var c=a.querySelectorAll("template");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)d.content&&this.resolveDom(d.content,b)},resolveTemplate:function(a){this.resolveDom(a.content,a.ownerDocument.baseURI)},resolveStyles:function(a,b){var c=a.querySelectorAll("style");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveStyle(d,b)},resolveStyle:function(a,b){b=b||a.ownerDocument.baseURI,a.textContent=this.resolveCssText(a.textContent,b)},resolveCssText:function(a,c,d){return a=b(a,c,d,g),b(a,c,d,h)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(j);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,d){d=d||a.ownerDocument.baseURI,i.forEach(function(e){var f,h=a.attributes[e],i=h&&h.value;i&&i.search(k)<0&&(f="style"===e?b(i,d,!1,g):c(d,i),h.value=f)})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action","style","url"],j="["+i.join("],[")+"]",k="{{.*}}";a.urlResolver=f}(Platform),function(a){function b(a){u.push(a),t||(t=!0,q(d))}function c(a){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(a)||a}function d(){t=!1;var a=u;u=[],a.sort(function(a,b){return a.uid_-b.uid_});var b=!1;a.forEach(function(a){var c=a.takeRecords();e(a),c.length&&(a.callback_(c,a),b=!0)}),b&&d()}function e(a){a.nodes_.forEach(function(b){var c=p.get(b);c&&c.forEach(function(b){b.observer===a&&b.removeTransientObservers()})})}function f(a,b){for(var c=a;c;c=c.parentNode){var d=p.get(c);if(d)for(var e=0;e<d.length;e++){var f=d[e],g=f.options;if(c===a||g.subtree){var h=b(g);h&&f.enqueue(h)}}}}function g(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++v}function h(a,b){this.type=a,this.target=b,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function i(a){var b=new h(a.type,a.target);return b.addedNodes=a.addedNodes.slice(),b.removedNodes=a.removedNodes.slice(),b.previousSibling=a.previousSibling,b.nextSibling=a.nextSibling,b.attributeName=a.attributeName,b.attributeNamespace=a.attributeNamespace,b.oldValue=a.oldValue,b}function j(a,b){return w=new h(a,b)}function k(a){return x?x:(x=i(w),x.oldValue=a,x)}function l(){w=x=void 0}function m(a){return a===x||a===w}function n(a,b){return a===b?a:x&&m(a)?x:null}function o(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var p=new WeakMap,q=window.msSetImmediate;if(!q){var r=[],s=String(Math.random());window.addEventListener("message",function(a){if(a.data===s){var b=r;r=[],b.forEach(function(a){a()})}}),q=function(a){r.push(a),window.postMessage(s,"*")}}var t=!1,u=[],v=0;g.prototype={observe:function(a,b){if(a=c(a),!b.childList&&!b.attributes&&!b.characterData||b.attributeOldValue&&!b.attributes||b.attributeFilter&&b.attributeFilter.length&&!b.attributes||b.characterDataOldValue&&!b.characterData)throw new SyntaxError;var d=p.get(a);d||p.set(a,d=[]);for(var e,f=0;f<d.length;f++)if(d[f].observer===this){e=d[f],e.removeListeners(),e.options=b;break}e||(e=new o(this,a,b),d.push(e),this.nodes_.push(a)),e.addListeners()},disconnect:function(){this.nodes_.forEach(function(a){for(var b=p.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){d.removeListeners(),b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}};var w,x;o.prototype={enqueue:function(a){var c=this.observer.records_,d=c.length;if(c.length>0){var e=c[d-1],f=n(e,a);if(f)return void(c[d-1]=f)}else b(this.observer);c[d]=a},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(a){var b=this.options;b.attributes&&a.addEventListener("DOMAttrModified",this,!0),b.characterData&&a.addEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.addEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(a){var b=this.options;b.attributes&&a.removeEventListener("DOMAttrModified",this,!0),b.characterData&&a.removeEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.removeEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(a){if(a!==this.target){this.addListeners_(a),this.transientObservedNodes.push(a);var b=p.get(a);b||p.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[],a.forEach(function(a){this.removeListeners_(a);for(var b=p.get(a),c=0;c<b.length;c++)if(b[c]===this){b.splice(c,1);break}},this)},handleEvent:function(a){switch(a.stopImmediatePropagation(),a.type){case"DOMAttrModified":var b=a.attrName,c=a.relatedNode.namespaceURI,d=a.target,e=new j("attributes",d);e.attributeName=b,e.attributeNamespace=c;var g=a.attrChange===MutationEvent.ADDITION?null:a.prevValue;f(d,function(a){return!a.attributes||a.attributeFilter&&a.attributeFilter.length&&-1===a.attributeFilter.indexOf(b)&&-1===a.attributeFilter.indexOf(c)?void 0:a.attributeOldValue?k(g):e});break;case"DOMCharacterDataModified":var d=a.target,e=j("characterData",d),g=a.prevValue;f(d,function(a){return a.characterData?a.characterDataOldValue?k(g):e:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(a.target);case"DOMNodeInserted":var h,i,d=a.relatedNode,m=a.target;"DOMNodeInserted"===a.type?(h=[m],i=[]):(h=[],i=[m]);var n=m.previousSibling,o=m.nextSibling,e=j("childList",d);e.addedNodes=h,e.removedNodes=i,e.previousSibling=n,e.nextSibling=o,f(d,function(a){return a.childList?e:void 0})}l()}},a.JsMutationObserver=g,a.MutationObserver||(a.MutationObserver=g)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){if(c.load&&console.log("fetch",a,d),a.match(/^data:/)){var e=a.split(","),f=e[0],g=e[1];g=f.indexOf(";base64")>-1?atob(g):decodeURIComponent(g),setTimeout(function(){this.receive(a,d,null,g)}.bind(this),0)}else{var h=function(b,c,e){this.receive(a,d,b,c,e)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d,e){this.cache[a]=d;var f=this.pending[a];e&&e!==a&&(this.cache[e]=d,f=f.concat(this.pending[e]));for(var g,h=0,i=f.length;i>h&&(g=f[h]);h++)this.onload(e||a,g,d),this.tail();this.pending[a]=null,e&&e!==a&&(this.pending[e]=null)},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){if(4===f.readyState){var a=f.getResponseHeader("Location"),c=null;if(a)var c="/"===a.substr(0,1)?location.origin+a:c;d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b,c=d(a);try{b=btoa(c)}catch(e){b=btoa(unescape(encodeURIComponent(c))),console.warn("Script contained non-latin characters that were forced to latin. Some characters may be wrong.",a)}return"data:text/javascript;base64,"+b}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=/Trident/.test(navigator.userAgent),j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a)},invalidateParse:function(a){a&&a.__importLink&&(a.__importParsed=a.__importLink.__importParsed=!1,this.parseSoon())},parseSoon:function(){this._parseSoon&&cancelAnimationFrame(this._parseDelay);var a=this;this._parseSoon=requestAnimationFrame(function(){a.parseNext()})},parseImport:function(a){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.import.__importParsed=!0,this.markParsingComplete(a),a.dispatchEvent(a.__resource?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.parseNext()},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),document.head.appendChild(a)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a),c.parseNext()};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),document.head.appendChild(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0;return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&!a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n,a.isIE=i}(HTMLImports),function(a){function b(a){return c(a,q)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(q)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}function e(a,b){b=b||r,g(function(){h(a,b)},b)}function f(a){return"complete"===a.readyState||a.readyState===y}function g(a,b){if(f(b))a&&a();else{var c=function(){("complete"===b.readyState||b.readyState===y)&&(b.removeEventListener(z,c),g(a,b))};b.addEventListener(z,c)}}function h(a,b){function c(){f==g&&a&&a()}function d(){f++,c()}var e=b.querySelectorAll("link[rel=import]"),f=0,g=e.length;if(g)for(var h,j=0;g>j&&(h=e[j]);j++)i(h)?d.call(h):(h.addEventListener("load",d),h.addEventListener("error",d));else c()}function i(a){return o?a.import&&"loading"!==a.import.readyState||a.__loaded:a.__importParsed}function j(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)k(b)&&l(b)}function k(a){return"link"===a.localName&&"import"===a.rel}function l(a){var b=a.import;b?m({target:a}):(a.addEventListener("load",m),a.addEventListener("error",m))}function m(a){a.target.__loaded=!0}var n="import"in document.createElement("link"),o=n,p=a.flags,q="import",r=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(o)var s={};else var t=(a.xhr,a.Loader),u=a.parser,s={documents:{},documentPreloadSelectors:"link[rel="+q+"]",importsPreloadSelectors:["link[rel="+q+"]"].join(","),loadNode:function(a){v.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);v.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===r?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e){if(p.load&&console.log("loaded",a,c),c.__resource=e,b(c)){var f=this.documents[a];f||(f=d(e,a),f.__importLink=c,this.bootDocument(f),this.documents[a]=f),c.import=f}u.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),u.parseNext()},loadedAll:function(){u.parseNext()}},v=new t(s.loaded.bind(s),s.loadedAll.bind(s));var w={get:function(){return HTMLImports.currentScript||document.currentScript},configurable:!0};if(Object.defineProperty(document,"_currentScript",w),Object.defineProperty(r,"_currentScript",w),!document.baseURI){var x={get:function(){return window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",x),Object.defineProperty(r,"baseURI",x)}var y=HTMLImports.isIE?"complete":"interactive",z="readystatechange";o&&new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&j(b.addedNodes)}).observe(document.head,{childList:!0}),a.hasNative=n,a.useNative=o,a.importer=s,a.whenImportsReady=e,a.IMPORT_LINK_TYPE=q,a.isImportLoaded=i,a.importLoader=v}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e,g=0,h=a.length;h>g&&(e=a[g]);g++)b=b||e.ownerDocument,d(e)&&f.loadNode(e),e.children&&e.children.length&&c(e.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=(a.parser,HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector),h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c});var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.whenImportsReady(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),b.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");
-return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag),d=Object.getPrototypeOf(c);d===a.prototype&&(b=d)}for(var e,f=a.prototype;f&&f!==b;)e=Object.getPrototypeOf(f),f.__proto__=e,f=e;a.native=b}}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),b.removeAttribute("unresolved"),i(b,c),b.__upgraded__=!0,k(b),a.insertedNode(b),a.upgradeSubtree(b),b}function i(a,b){Object.__proto__?a.__proto__=b.prototype:(j(a,b.prototype,b.native),a.__proto__=b.prototype)}function j(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function k(a){a.createdCallback&&a.createdCallback()}function l(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){m.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){m.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function m(a,b,c){a=a.toLowerCase();var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function n(a){return a?z[a.toLowerCase()]:void 0}function o(a,b){z[a]=b}function p(a){return function(){return g(a)}}function q(a,b,c){return a===A?r(b,c):C(a,b)}function r(a,b){var c=n(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=r(a);return d.setAttribute("is",b),d}var d=B(a);return a.indexOf("-")>=0&&i(d,HTMLElement),d}function s(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=n(b||a.localName);if(c){if(b&&c.tag==a.localName)return h(a,c);if(!b&&!c.extends)return h(a,c)}}}function t(b){var c=D.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var u=a.flags,v=Boolean(document.registerElement),w=!u.register&&v&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative);if(w){var x=function(){};a.registry={},a.upgradeElement=x,a.watchShadow=x,a.upgrade=x,a.upgradeAll=x,a.upgradeSubtree=x,a.observeDocument=x,a.upgradeDocument=x,a.upgradeDocumentTree=x,a.takeRecords=x,a.reservedTagList=[]}else{var y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],z={},A="http://www.w3.org/1999/xhtml",B=document.createElement.bind(document),C=document.createElementNS.bind(document),D=Node.prototype.cloneNode;document.registerElement=b,document.createElement=r,document.createElementNS=q,Node.prototype.cloneNode=t,a.registry=z,a.upgrade=s}var E;E=Object.__proto__||w?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=E,a.reservedTagList=y,document.register=document.registerElement,a.hasNative=v,a.useNative=w}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document);var a=window.Platform&&Platform.endOfMicrotask?Platform.endOfMicrotask:setTimeout;a(function(){CustomElements.ready=!0,CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0})),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)})})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a){var b=document.createEvent("HTMLEvents");return b.initEvent(a,!0,!0),b}),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(a){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=a.endOfMicrotask;b.prototype={extractUrls:function(a,b){for(var c,d,e=[];c=this.regex.exec(a);)d=new URL(c[1],b),e.push({matched:c[0],url:d.href});return e},process:function(a,b,c){var d=this.extractUrls(a,b),e=c.bind(null,this.map);this.fetch(d,e)},fetch:function(a,b){var c=a.length;if(!c)return b();for(var d,e,f,g=function(){0===--c&&b()},h=0;c>h;h++)d=a[h],f=d.url,e=this.cache[f],e||(e=this.xhr(f),e.match=d,this.cache[f]=e),e.wait(g)},handleXhr:function(a){var b=a.match,c=b.url,d=a.response||a.responseText||"";this.map[c]=d,this.fetch(this.extractUrls(d,c),a.resolve)},xhr:function(a){this.requests++;var b=new XMLHttpRequest;return b.open("GET",a,!0),b.send(),b.onerror=b.onload=this.handleXhr.bind(this,b),b.pending=[],b.resolve=function(){for(var a=b.pending,c=0;c<a.length;c++)a[c]();b.pending=null},b.wait=function(a){b.pending?b.pending.push(a):c(a)},b}},a.Loader=b}(window.Platform),function(a){function b(){this.loader=new d(this.regex)}var c=a.urlResolver,d=a.Loader;b.prototype={regex:/@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,resolve:function(a,b,c){var d=function(d){c(this.flatten(a,b,d))}.bind(this);this.loader.process(a,b,d)},resolveNode:function(a,b,c){var d=a.textContent,e=function(b){a.textContent=b,c(a)};this.resolve(d,b,e)},flatten:function(a,b,d){for(var e,f,g,h=this.loader.extractUrls(a,b),i=0;i<h.length;i++)e=h[i],f=e.url,g=c.resolveCssText(d[f],f,!0),g=this.flatten(g,b,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b,c){function d(){f++,f===g&&c&&c()}for(var e,f=0,g=a.length,h=0;g>h&&(e=a[h]);h++)this.resolveNode(e,b,d)}};var e=new b;a.styleResolver=e}(window.Platform),function(){"use strict";function a(a){for(;a.parentNode;)a=a.parentNode;return"function"==typeof a.getElementById?a:null}function b(a,b,c){var d=a.bindings_;return d||(d=a.bindings_={}),d[b]&&c[b].close(),d[b]=c}function c(a,b,c){return c}function d(a){return null==a?"":a}function e(a,b){a.data=d(b)}function f(a){return function(b){return e(a,b)}}function g(a,b,c,e){return c?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,d(e))}function h(a,b,c){return function(d){g(a,b,c,d)}}function i(a){switch(a.type){case"checkbox":return u;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function j(a,b,c,e){a[b]=(e||d)(c)}function k(a,b,c){return function(d){return j(a,b,d,c)}}function l(){}function m(a,b,c,d){function e(){c.setValue(a[b]),c.discardChanges(),(d||l)(a),Platform.performMicrotaskCheckpoint()}var f=i(a);return a.addEventListener(f,e),{close:function(){a.removeEventListener(f,e),c.close()},observable_:c}}function n(a){return Boolean(a)}function o(b){if(b.form)return s(b.form.elements,function(a){return a!=b&&"INPUT"==a.tagName&&"radio"==a.type&&a.name==b.name});var c=a(b);if(!c)return[];var d=c.querySelectorAll('input[type="radio"][name="'+b.name+'"]');return s(d,function(a){return a!=b&&!a.form})}function p(a){"INPUT"===a.tagName&&"radio"===a.type&&o(a).forEach(function(a){var b=a.bindings_.checked;b&&b.observable_.setValue(!1)})}function q(a,b){var c,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings_&&g.bindings_.value&&(c=g,e=c.bindings_.value,f=c.value),a.value=d(b),c&&c.value!=f&&(e.observable_.setValue(c.value),e.observable_.discardChanges(),Platform.performMicrotaskCheckpoint())}function r(a){return function(b){q(a,b)}}var s=Array.prototype.filter.call.bind(Array.prototype.filter);Node.prototype.bind=function(a,b){console.error("Unhandled binding to Node: ",this,a,b)},Node.prototype.bindFinished=function(){};var t=c;Object.defineProperty(Platform,"enableBindingsReflection",{get:function(){return t===b},set:function(a){return t=a?b:c,a},configurable:!0}),Text.prototype.bind=function(a,b,c){if("textContent"!==a)return Node.prototype.bind.call(this,a,b,c);if(c)return e(this,b);var d=b;return e(this,d.open(f(this))),t(this,a,d)},Element.prototype.bind=function(a,b,c){var d="?"==a[a.length-1];if(d&&(this.removeAttribute(a),a=a.slice(0,-1)),c)return g(this,a,d,b);var e=b;return g(this,a,d,e.open(h(this,a,d))),t(this,a,e)};var u;!function(){var a=document.createElement("div"),b=a.appendChild(document.createElement("input"));b.setAttribute("type","checkbox");var c,d=0;b.addEventListener("click",function(){d++,c=c||"click"}),b.addEventListener("change",function(){d++,c=c||"change"});var e=document.createEvent("MouseEvent");e.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),b.dispatchEvent(e),u=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,c,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,c,e);this.removeAttribute(a);var f="checked"==a?n:d,g="checked"==a?p:l;if(e)return j(this,a,c,f);var h=c,i=m(this,a,h,g);return j(this,a,h.open(k(this,a,f)),f),b(this,a,i)},HTMLTextAreaElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return j(this,"value",b);var e=b,f=m(this,"value",e);return j(this,"value",e.open(k(this,"value",d))),t(this,a,f)},HTMLOptionElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return q(this,b);var d=b,e=m(this,"value",d);return q(this,d.open(r(this))),t(this,a,e)},HTMLSelectElement.prototype.bind=function(a,c,d){if("selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a)return HTMLElement.prototype.bind.call(this,a,c,d);if(this.removeAttribute(a),d)return j(this,a,c);var e=c,f=m(this,a,e);return j(this,a,e.open(k(this,a))),b(this,a,f)}}(this),function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a){for(var b;b=a.parentNode;)a=b;return a}function d(a,b){if(b){for(var d,e="#"+b;!d&&(a=c(a),a.protoContent_?d=a.protoContent_.querySelector(e):a.getElementById&&(d=a.getElementById(b)),!d&&a.templateCreator_);)a=a.templateCreator_;return d}}function e(a){return"template"==a.tagName&&"http://www.w3.org/2000/svg"==a.namespaceURI}function f(a){return"TEMPLATE"==a.tagName&&"http://www.w3.org/1999/xhtml"==a.namespaceURI}function g(a){return Boolean(L[a.tagName]&&a.hasAttribute("template"))}function h(a){return void 0===a.isTemplate_&&(a.isTemplate_="TEMPLATE"==a.tagName||g(a)),a.isTemplate_}function i(a,b){var c=a.querySelectorAll(N);h(a)&&b(a),G(c,b)}function j(a){function b(a){HTMLTemplateElement.decorate(a)||j(a.content)}i(a,b)}function k(a,b){Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))})}function l(a){var b=a.ownerDocument;if(!b.defaultView)return b;var c=b.templateContentsOwner_;if(!c){for(c=b.implementation.createHTMLDocument("");c.lastChild;)c.removeChild(c.lastChild);b.templateContentsOwner_=c}return c}function m(a){if(!a.stagingDocument_){var b=a.ownerDocument;if(!b.stagingDocument_){b.stagingDocument_=b.implementation.createHTMLDocument(""),b.stagingDocument_.isStagingDocument=!0;var c=b.stagingDocument_.createElement("base");c.href=document.baseURI,b.stagingDocument_.head.appendChild(c),b.stagingDocument_.stagingDocument_=b.stagingDocument_}a.stagingDocument_=b.stagingDocument_}return a.stagingDocument_}function n(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];K[e.name]&&("template"!==e.name&&b.setAttribute(e.name,e.value),a.removeAttribute(e.name))}return b}function o(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];b.setAttribute(e.name,e.value),a.removeAttribute(e.name)}return a.parentNode.removeChild(a),b}function p(a,b,c){var d=a.content;if(c)return void d.appendChild(b);for(var e;e=b.firstChild;)d.appendChild(e)}function q(a){P?a.__proto__=HTMLTemplateElement.prototype:k(a,HTMLTemplateElement.prototype)}function r(a){a.setModelFn_||(a.setModelFn_=function(){a.setModelFnScheduled_=!1;var b=z(a,a.delegate_&&a.delegate_.prepareBinding);w(a,b,a.model_)}),a.setModelFnScheduled_||(a.setModelFnScheduled_=!0,Observer.runEOM_(a.setModelFn_))}function s(a,b,c,d){if(a&&a.length){for(var e,f=a.length,g=0,h=0,i=0,j=!0;f>h;){var g=a.indexOf("{{",h),k=a.indexOf("[[",h),l=!1,m="}}";if(k>=0&&(0>g||g>k)&&(g=k,l=!0,m="]]"),i=0>g?-1:a.indexOf(m,g+2),0>i){if(!e)return;e.push(a.slice(h));break}e=e||[],e.push(a.slice(h,g));var n=a.slice(g+2,i).trim();e.push(l),j=j&&l;var o=d&&d(n,b,c);e.push(null==o?Path.get(n):null),e.push(o),h=i+2}return h===f&&e.push(""),e.hasOnePath=5===e.length,e.isSimplePath=e.hasOnePath&&""==e[0]&&""==e[4],e.onlyOneTime=j,e.combinator=function(a){for(var b=e[0],c=1;c<e.length;c+=4){var d=e.hasOnePath?a:a[(c-1)/4];void 0!==d&&(b+=d),b+=e[c+3]}return b},e}}function t(a,b,c,d){if(b.hasOnePath){var e=b[3],f=e?e(d,c,!0):b[2].getValueFrom(d);return b.isSimplePath?f:b.combinator(f)}for(var g=[],h=1;h<b.length;h+=4){var e=b[h+2];g[(h-1)/4]=e?e(d,c):b[h+1].getValueFrom(d)}return b.combinator(g)}function u(a,b,c,d){var e=b[3],f=e?e(d,c,!1):new PathObserver(d,b[2]);return b.isSimplePath?f:new ObserverTransform(f,b.combinator)}function v(a,b,c,d){if(b.onlyOneTime)return t(a,b,c,d);if(b.hasOnePath)return u(a,b,c,d);for(var e=new CompoundObserver,f=1;f<b.length;f+=4){var g=b[f],h=b[f+2];if(h){var i=h(d,c,g);g?e.addPath(i):e.addObserver(i)}else{var j=b[f+1];g?e.addPath(j.getValueFrom(d)):e.addPath(d,j)}}return new ObserverTransform(e,b.combinator)}function w(a,b,c,d){for(var e=0;e<b.length;e+=2){var f=b[e],g=b[e+1],h=v(f,g,a,c),i=a.bind(f,h,g.onlyOneTime);i&&d&&d.push(i)}if(a.bindFinished(),b.isTemplate){a.model_=c;var j=a.processBindingDirectives_(b);d&&j&&d.push(j)}}function x(a,b,c){var d=a.getAttribute(b);return s(""==d?"{{}}":d,b,a,c)}function y(a,c){b(a);for(var d=[],e=0;e<a.attributes.length;e++){for(var f=a.attributes[e],g=f.name,i=f.value;"_"===g[0];)g=g.substring(1);if(!h(a)||g!==J&&g!==H&&g!==I){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,J,c),d.bind=x(a,H,c),d.repeat=x(a,I,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",H,a,c))),d}function z(a,b){if(a.nodeType===Node.ELEMENT_NODE)return y(a,b);if(a.nodeType===Node.TEXT_NODE){var c=s(a.data,"textContent",a,b);if(c)return["textContent",c]}return[]}function A(a,b,c,d,e,f,g){for(var h=b.appendChild(c.importNode(a,!1)),i=0,j=a.firstChild;j;j=j.nextSibling)A(j,h,c,d.children[i++],e,f,g);return d.isTemplate&&(HTMLTemplateElement.decorate(h,a),f&&h.setDelegate_(f)),w(h,d,e,g),h}function B(a,b){var c=z(a,b);c.children={};for(var d=0,e=a.firstChild;e;e=e.nextSibling)c.children[d++]=B(e,b);return c}function C(a){var b=a.id_;return b||(b=a.id_=S++),b}function D(a,b){var c=C(a);if(b){var d=b.bindingMaps[c];return d||(d=b.bindingMaps[c]=B(a,b.prepareBinding)||[]),d}var d=a.bindingMap_;return d||(d=a.bindingMap_=B(a,void 0)||[]),d}function E(a){this.closed=!1,this.templateElement_=a,this.instances=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var F,G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?F=a.Map:(F=function(){this.keys=[],this.values=[]},F.prototype={set:function(a,b){var c=this.keys.indexOf(a);0>c?(this.keys.push(a),this.values.push(b)):this.values[c]=b},get:function(a){var b=this.keys.indexOf(a);if(!(0>b))return this.values[b]},"delete":function(a){var b=this.keys.indexOf(a);return 0>b?!1:(this.keys.splice(b,1),this.values.splice(b,1),!0)},forEach:function(a,b){for(var c=0;c<this.keys.length;c++)a.call(b||this,this.values[c],this.keys[c],this)}});"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)});var H="bind",I="repeat",J="if",K={template:!0,repeat:!0,bind:!0,ref:!0},L={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},M="undefined"!=typeof HTMLTemplateElement;M&&!function(){var a=document.createElement("template"),b=a.content.ownerDocument,c=b.appendChild(b.createElement("html")),d=c.appendChild(b.createElement("head")),e=b.createElement("base");e.href=document.baseURI,d.appendChild(e)}();var N="template, "+Object.keys(L).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),M||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var O,P="__proto__"in{};"function"==typeof MutationObserver&&(O=new MutationObserver(function(a){for(var b=0;b<a.length;b++)a[b].target.refChanged_()})),HTMLTemplateElement.decorate=function(a,c){if(a.templateIsDecorated_)return!1;var d=a;d.templateIsDecorated_=!0;var h=f(d)&&M,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=M,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=M)),!h){q(d);var r=l(d);d.content_=r.createDocumentFragment()}return c?d.instanceRef_=c:k?p(d,a,m):i&&j(d.content),!0},HTMLTemplateElement.bootstrap=j;var Q=a.HTMLUnknownElement||HTMLElement,R={get:function(){return this.content_},enumerable:!0,configurable:!0};M||(HTMLTemplateElement.prototype=Object.create(Q.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",R)),k(HTMLTemplateElement.prototype,{bind:function(a,b,c){if("ref"!=a)return Element.prototype.bind.call(this,a,b,c);var d=this,e=c?b:b.open(function(a){d.setAttribute("ref",a),d.refChanged_()});return this.setAttribute("ref",e),this.refChanged_(),c?void 0:(this.bindings_?this.bindings_.ref=b:this.bindings_={ref:b},b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a.if||a.bind||a.repeat?(this.iterator_||(this.iterator_=new E(this)),this.iterator_.updateDependencies(a,this.model_),O&&O.observe(this,{attributes:!0,attributeFilter:["ref"]}),this.iterator_):void(this.iterator_&&(this.iterator_.close(),this.iterator_=void 0))},createInstance:function(a,b,c){b?c=this.newDelegate_(b):c||(c=this.delegate_),this.refContent_||(this.refContent_=this.ref_.content);var d=this.refContent_;if(null===d.firstChild)return T;var e=D(d,c),f=m(this),g=f.createDocumentFragment();g.templateCreator_=this,g.protoContent_=d,g.bindings_=[],g.terminator_=null;for(var h=g.templateInstance_={firstNode:null,lastNode:null,model:a},i=0,j=!1,k=d.firstChild;k;k=k.nextSibling){null===k.nextSibling&&(j=!0);var l=A(k,g,f,e.children[i++],a,c,g.bindings_);l.templateInstance_=h,j&&(g.terminator_=l)}return h.firstNode=g.firstChild,h.lastNode=g.lastChild,g.templateCreator_=void 0,g.protoContent_=void 0,g},get model(){return this.model_},set model(a){this.model_=a,r(this)},get bindingDelegate(){return this.delegate_&&this.delegate_.raw},refChanged_:function(){this.iterator_&&this.refContent_!==this.ref_.content&&(this.refContent_=void 0,this.iterator_.valueChanged(),this.iterator_.updateIteratedValue())},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_&&this.bindings_.ref&&this.bindings_.ref.close(),this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}if(a)return{bindingMaps:{},raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}});var S=1;Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var T=document.createDocumentFragment();T.bindings_=[],T.terminator_=null,E.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),c.ifOneTime&&!c.ifValue)return void this.updateIteratedValue();c.ifOneTime||c.ifValue.open(this.updateIteratedValue,this)}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(I,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(H,a.bind,d,b)),c.oneTime||c.value.open(this.updateIteratedValue,this),this.updateIteratedValue()},updateIteratedValue:function(){if(this.deps.hasIf){var a=this.deps.ifValue;if(this.deps.ifOneTime||(a=a.discardChanges()),!a)return void this.valueChanged()}var b=this.deps.value;this.deps.oneTime||(b=b.discardChanges()),this.deps.repeat||(b=[b]);var c=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(b);this.valueChanged(b,c)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getLastInstanceNode:function(a){if(-1==a)return this.templateElement_;var b=this.instances[a],c=b.terminator_;if(!c)return this.getLastInstanceNode(a-1);if(c.nodeType!==Node.ELEMENT_NODE||this.templateElement_===c)return c;var d=c.iterator_;return d?d.getLastTemplateNode():c},getLastTemplateNode:function(){return this.getLastInstanceNode(this.instances.length-1)},insertInstanceAt:function(a,b){var c=this.getLastInstanceNode(a-1),d=this.templateElement_.parentNode;this.instances.splice(a,0,b),d.insertBefore(b,c.nextSibling)},extractInstanceAt:function(a){for(var b=this.getLastInstanceNode(a-1),c=this.getLastInstanceNode(a),d=this.templateElement_.parentNode,e=this.instances.splice(a,1)[0];c!==b;){var f=b.nextSibling;f==c&&(c=b),e.appendChild(d.removeChild(f))}return e},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));for(var d=new F,e=0,f=0;f<a.length;f++){for(var g=a[f],h=g.removed,i=0;i<h.length;i++){var j=h[i],k=this.extractInstanceAt(g.index+e);k!==T&&d.set(j,k)}e-=g.addedCount}for(var f=0;f<a.length;f++)for(var g=a[f],l=g.index;l<g.index+g.addedCount;l++){var j=this.iteratedValue[l],k=d.get(j);k?d.delete(j):(this.instanceModelFn_&&(j=this.instanceModelFn_(j)),k=void 0===j?T:b.createInstance(j,void 0,c)),this.insertInstanceAt(l,k)}d.forEach(function(a){this.closeInstanceBindings(a)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.instances[a];b!==T&&this.instancePositionChangedFn_(b.templateInstance_,a)},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.instances.length;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=a.bindings_,c=0;c<b.length;c++)b[c].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=0;a<this.instances.length;a++)this.closeInstanceBindings(this.instances[a]);this.instances.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){function b(){e||(e=!0,a.endOfMicrotask(function(){e=!1,logFlags.data&&console.group("Platform.flush()"),a.performMicrotaskCheckpoint(),logFlags.data&&console.groupEnd()}))}var c=document.createElement("style");c.textContent="template {display: none !important;} /* injected by platform.js */";var d=document.querySelector("head");d.insertBefore(c,d.firstChild);var e;if(Observer.hasObjectObserve)b=function(){};else{var f=125;window.addEventListener("WebComponentsReady",function(){b(),a.flushPoll=setInterval(b,f)})}if(window.CustomElements&&!CustomElements.useNative){var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=g.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b}(window.Platform);
+window.Platform=window.Platform||{},window.logFlags=window.logFlags||{},function(a){var b=a.flags||{};location.search.slice(1).split("&").forEach(function(a){a=a.split("="),a[0]&&(b[a[0]]=a[1]||!0)});var c=document.currentScript||document.querySelector('script[src*="platform.js"]');if(c)for(var d,e=c.attributes,f=0;f<e.length;f++)d=e[f],"src"!==d.name&&(b[d.name]=d.value||!0);b.log&&b.log.split(",").forEach(function(a){window.logFlags[a]=!0}),b.shadow=b.shadow||b.shadowdom||b.polyfill,b.shadow="native"===b.shadow?!1:b.shadow||!HTMLElement.prototype.createShadowRoot,b.shadow&&document.querySelectorAll("script").length>1&&console.warn("platform.js is not the first script on the page. See http://www.polymer-project.org/docs/start/platform.html#setup for details."),b.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=b.register),b.imports&&(window.HTMLImports=window.HTMLImports||{flags:{}},window.HTMLImports.flags.imports=b.imports),a.flags=b}(Platform),"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}(),function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function getPathCharType(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function noop(){}function parsePath(a){function b(){if(!(k>=a.length)){var b=a[k+1];return"inSingleQuote"==l&&"'"==b||"inDoubleQuote"==l&&'"'==b?(k++,d=b,m.append(),!0):void 0}}for(var c,d,e,f,g,h,i,j=[],k=-1,l="beforePath",m={push:function(){void 0!==e&&(j.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};l;)if(k++,c=a[k],"\\"!=c||!b(l)){if(f=getPathCharType(c),i=pathStateMachine[l],g=i[f]||i["else"]||"error","error"==g)return;if(l=g[0],h=m[g[1]]||noop,d=void 0===g[2]?c:g[2],h(),"afterPath"===l)return j}}function isIdent(a){return identRegExp.test(a)}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");for(var c=0;c<a.length;c++)this.push(String(a[c]));hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function getPath(a){if(a instanceof Path)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(isIndex(a.length))return new Path(a,constructorIsPrivate);a=String(a)}var b=pathCache[a];if(b)return b;var c=parsePath(a);if(!c)return invalidPath;var b=new Path(c,constructorIsPrivate);return pathCache[a]=b,b}function formatAccessor(a){return isIndex(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(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 runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=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 newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(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 mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(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 createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__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},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",identRegExp=new RegExp("^"+identStart+"+"+identPart+"*$"),pathStateMachine={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=isIdent(c)?b?"."+c:c:formatAccessor(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=isIdent(c)?"."+c:formatAccessor(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=isIdent(c)?"."+c:formatAccessor(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&hasEval&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.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)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,get path(){return this.path_},connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.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(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),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,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(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 EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(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 arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),Platform.flags.shadow?(window.ShadowDOMPolyfill={},function(a){"use strict";function b(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;try{var a=new Function("return true;");return a()}catch(b){return!1}}function c(a){if(!a)throw new Error("Assertion failed")}function d(a,b){for(var c=L(b),d=0;d<c.length;d++){var e=c[d];K(a,e,M(b,e))}return a}function e(a,b){for(var c=L(b),d=0;d<c.length;d++){var e=c[d];switch(e){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}K(a,e,M(b,e))}return a}function f(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function g(a,b,c){N.value=c,K(a,b,N)}function h(a){var b=a.__proto__||Object.getPrototypeOf(a),c=G.get(b);if(c)return c;var d=h(b),e=v(d);return s(b,e,a),e}function i(a,b){q(a,b,!0)}function j(a,b){q(b,a,!1)}function k(a){return/^on[a-z]+$/.test(a)}function l(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function m(a){return J&&l(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function n(a){return J&&l(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function o(a){return J&&l(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function p(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return P}}function q(b,c,d){for(var e=L(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){O&&b.__lookupGetter__(g);var h,i,j=p(b,g);if(d&&"function"==typeof j.value)c[g]=o(g);else{var l=k(g);h=l?a.getEventHandlerGetter(g):m(g),(j.writable||j.set)&&(i=l?a.getEventHandlerSetter(g):n(g)),K(c,g,{get:h,set:i,configurable:j.configurable,enumerable:j.enumerable})}}}}function r(a,b,c){var d=a.prototype;s(d,b,c),e(b,a)}function s(a,b,d){var e=b.prototype;c(void 0===G.get(a)),G.set(a,b),H.set(e,a),i(a,e),d&&j(e,d),g(e,"constructor",b),b.prototype=e}function t(a,b){return G.get(b.prototype)===a}function u(a){var b=Object.getPrototypeOf(a),c=h(b),d=v(c);return s(b,d,a),d}function v(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function w(a){return a instanceof I.EventTarget||a instanceof I.Event||a instanceof I.Range||a instanceof I.DOMImplementation||a instanceof I.CanvasRenderingContext2D||I.WebGLRenderingContext&&a instanceof I.WebGLRenderingContext}function x(a){return R&&a instanceof R||a instanceof T||a instanceof S||a instanceof U||a instanceof V||a instanceof Q||a instanceof W||X&&a instanceof X||Y&&a instanceof Y}function y(a){return null===a?null:(c(x(a)),a.polymerWrapper_||(a.polymerWrapper_=new(h(a))(a)))}function z(a){return null===a?null:(c(w(a)),a.impl)}function A(a){return a&&w(a)?z(a):a}function B(a){return a&&!w(a)?y(a):a}function C(a,b){null!==b&&(c(x(a)),c(void 0===b||w(b)),a.polymerWrapper_=b)}function D(a,b,c){Z.get=c,K(a.prototype,b,Z)}function E(a,b){D(a,b,function(){return y(this.impl[b])})}function F(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=B(this);return a[b].apply(a,arguments)}})})}var G=new WeakMap,H=new WeakMap,I=Object.create(null),J=b(),K=Object.defineProperty,L=Object.getOwnPropertyNames,M=Object.getOwnPropertyDescriptor,N={value:void 0,configurable:!0,enumerable:!1,writable:!0};L(window);var O=/Firefox/.test(navigator.userAgent),P={get:function(){},set:function(){},configurable:!0,enumerable:!0},Q=window.DOMImplementation,R=window.EventTarget,S=window.Event,T=window.Node,U=window.Window,V=window.Range,W=window.CanvasRenderingContext2D,X=window.WebGLRenderingContext,Y=window.SVGElementInstance,Z={get:void 0,configurable:!0,enumerable:!0};a.assert=c,a.constructorTable=G,a.defineGetter=D,a.defineWrapGetter=E,a.forwardMethodsToWrapper=F,a.isWrapper=w,a.isWrapperFor=t,a.mixin=d,a.nativePrototypeTable=H,a.oneOf=f,a.registerObject=u,a.registerWrapper=r,a.rewrap=C,a.unwrap=z,a.unwrapIfNeeded=A,a.wrap=y,a.wrapIfNeeded=B,a.wrappers=I}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){p=!1;do for(var a=o.slice(),b=!1,c=0;c<a.length;c++){var d=a[c],e=d.takeRecords();f(d),e.length&&(d.callback_(e,d),b=!0)}while(b)}function d(a,b){this.type=a,this.target=b,this.addedNodes=new m.NodeList,this.removedNodes=new m.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function e(a,b){for(;a;a=a.parentNode){var c=n.get(a);if(c)for(var d=0;d<c.length;d++){var e=c[d];e.options.subtree&&e.addTransientObserver(b)}}}function f(a){for(var b=0;b<a.nodes_.length;b++){var c=a.nodes_[b],d=n.get(c);if(!d)return;for(var e=0;e<d.length;e++){var f=d[e];f.observer===a&&f.removeTransientObservers()}}}function g(a,c,e){for(var f=Object.create(null),g=Object.create(null),h=a;h;h=h.parentNode){var i=n.get(h);if(i)for(var j=0;j<i.length;j++){var k=i[j],l=k.options;if((h===a||l.subtree)&&!("attributes"===c&&!l.attributes||"attributes"===c&&l.attributeFilter&&(null!==e.namespace||-1===l.attributeFilter.indexOf(e.name))||"characterData"===c&&!l.characterData||"childList"===c&&!l.childList)){var m=k.observer;f[m.uid_]=m,("attributes"===c&&l.attributeOldValue||"characterData"===c&&l.characterDataOldValue)&&(g[m.uid_]=e.oldValue)}}}var o=!1;for(var p in f){var m=f[p],q=new d(c,a);"name"in e&&"namespace"in e&&(q.attributeName=e.name,q.attributeNamespace=e.namespace),e.addedNodes&&(q.addedNodes=e.addedNodes),e.removedNodes&&(q.removedNodes=e.removedNodes),e.previousSibling&&(q.previousSibling=e.previousSibling),e.nextSibling&&(q.nextSibling=e.nextSibling),void 0!==g[p]&&(q.oldValue=g[p]),m.records_.push(q),o=!0}o&&b()}function h(a){if(this.childList=!!a.childList,this.subtree=!!a.subtree,this.attributes="attributes"in a||!("attributeOldValue"in a||"attributeFilter"in a)?!!a.attributes:!0,this.characterData="characterDataOldValue"in a&&!("characterData"in a)?!0:!!a.characterData,!this.attributes&&(a.attributeOldValue||"attributeFilter"in a)||!this.characterData&&a.characterDataOldValue)throw new TypeError;if(this.characterData=!!a.characterData,this.attributeOldValue=!!a.attributeOldValue,this.characterDataOldValue=!!a.characterDataOldValue,"attributeFilter"in a){if(null==a.attributeFilter||"object"!=typeof a.attributeFilter)throw new TypeError;this.attributeFilter=q.call(a.attributeFilter)}else this.attributeFilter=null}function i(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++r,o.push(this)}function j(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var k=a.setEndOfMicrotask,l=a.wrapIfNeeded,m=a.wrappers,n=new WeakMap,o=[],p=!1,q=Array.prototype.slice,r=0;i.prototype={observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){this.root=a,this.parent=b}function c(a,b){if(a.treeScope_!==b){a.treeScope_=b;for(var d=a.shadowRoot;d;d=d.olderShadowRoot)d.treeScope_.parent=b;for(var e=a.firstChild;e;e=e.nextSibling)c(e,b)}}function d(c){if(c instanceof a.wrappers.Window,c.treeScope_)return c.treeScope_;var e,f=c.parentNode;return e=f?d(f):new b(c,null),c.treeScope_=e}b.prototype={get renderer(){return this.root instanceof a.wrappers.ShadowRoot?a.getRendererForHost(this.root.host):null},contains:function(a){for(;a;a=a.parent)if(a===this)return!0;return!1}},a.TreeScope=b,a.getTreeScope=d,a.setTreeScope=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof Q.ShadowRoot}function c(a){return L(a).root}function d(a,d){var h=[],i=a;for(h.push(i);i;){var j=g(i);if(j&&j.length>0){for(var k=0;k<j.length;k++){var m=j[k];if(f(m)){var n=c(m),o=n.olderShadowRoot;o&&h.push(o)}h.push(m)}i=j[j.length-1]}else if(b(i)){if(l(a,i)&&e(d))break;i=i.host,h.push(i)}else i=i.parentNode,i&&h.push(i)}return h}function e(a){if(!a)return!1;switch(a.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function f(a){return a instanceof HTMLShadowElement}function g(b){return a.getDestinationInsertionPoints(b)}function h(a,b){if(0===a.length)return b;b instanceof Q.Window&&(b=b.document);for(var c=L(b),d=a[0],e=L(d),f=j(c,e),g=0;g<a.length;g++){var h=a[g];if(L(h)===f)return h}return a[a.length-1]}function i(a){for(var b=[];a;a=a.parent)b.push(a);return b}function j(a,b){for(var c=i(a),d=i(b),e=null;c.length>0&&d.length>0;){var f=c.pop(),g=d.pop();if(f!==g)break;e=f}return e}function k(a,b,c){b instanceof Q.Window&&(b=b.document);var e,f=L(b),g=L(c),h=d(c,a),e=j(f,g);e||(e=g.root);for(var i=e;i;i=i.parent)for(var k=0;k<h.length;k++){var l=h[k];if(L(l)===i)return l}return null}function l(a,b){return L(a)===L(b)}function m(a){if(!S.get(a)&&(S.set(a,!0),n(P(a),P(a.target)),J)){var b=J;throw J=null,b}}function n(b,c){if(T.get(b))throw new Error("InvalidStateError");T.set(b,!0),a.renderAllPending();var e,f,g,h=b.type;if("load"===h&&!b.bubbles){var i=c;i instanceof Q.Document&&(g=i.defaultView)&&(f=i,e=[])}if(!e)if(c instanceof Q.Window)g=c,e=[];else if(e=d(c,b),"load"!==b.type){var i=e[e.length-1];i instanceof Q.Document&&(g=i.defaultView)}return _.set(b,e),o(b,e,g,f)&&p(b,e,g,f)&&q(b,e,g,f),X.set(b,ab),V.delete(b,null),T.delete(b),b.defaultPrevented
+}function o(a,b,c,d){var e=bb;if(c&&!r(c,a,e,b,d))return!1;for(var f=b.length-1;f>0;f--)if(!r(b[f],a,e,b,d))return!1;return!0}function p(a,b,c,d){var e=cb,f=b[0]||c;return r(f,a,e,b,d)}function q(a,b,c,d){for(var e=db,f=1;f<b.length;f++)if(!r(b[f],a,e,b,d))return;c&&b.length>0&&r(c,a,e,b,d)}function r(a,b,c,d,e){var f=R.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===bb)return!0;c===db&&(c=cb)}else if(c===db&&!b.bubbles)return!0;if("relatedTarget"in b){var i=O(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=P(j),m=k(b,a,l);if(m===g)return!0}else m=null;W.set(b,m)}}X.set(b,c);var n=b.type,o=!1;U.set(b,g),V.set(b,a),f.depth++;for(var p=0,q=f.length;q>p;p++){var r=f[p];if(r.removed)o=!0;else if(!(r.type!==n||!r.capture&&c===bb||r.capture&&c===db))try{if("function"==typeof r.handler?r.handler.call(a,b):r.handler.handleEvent(b),Z.get(b))return!1}catch(s){J||(J=s)}}if(f.depth--,o&&0===f.depth){var t=f.slice();f.length=0;for(var p=0;p<t.length;p++)t[p].removed||f.push(t[p])}return!Y.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){if(!(a instanceof eb))return P(x(eb,"Event",a,b));var c=a;return pb||"beforeunload"!==c.type?void(this.impl=c):new y(c)}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:O(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void(this.impl=b):P(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&M(e.prototype,c),d)try{N(d,e,new d("temp"))}catch(f){N(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=O(arguments[b]);var c=O(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(nb)return new a(c,u(d));var e=O(document.createEvent(b)),f=mb[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=O(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(a){t.call(this,a)}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function B(a){this.impl=a}function C(a){return a instanceof Q.ShadowRoot&&(a=a.host),O(a)}function D(a,b){var c=R.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function E(a,b){for(var c=O(a);c;c=c.parentNode)if(D(P(c),b))return!0;return!1}function F(a){K(a,rb)}function G(b,c,e,f){a.renderAllPending();var g=P(sb.call(c.impl,e,f));if(!g)return null;var i=d(g,null),j=i.lastIndexOf(b);return-1==j?null:(i=i.slice(0,j),h(i,b))}function H(a){return function(){var b=$.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=$.get(this);d||(d=Object.create(null),$.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,K=a.forwardMethodsToWrapper,L=a.getTreeScope,M=a.mixin,N=a.registerWrapper,O=a.unwrap,P=a.wrap,Q=a.wrappers,R=(new WeakMap,new WeakMap),S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=0,bb=1,cb=2,db=3;s.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 eb=window.Event;eb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return U.get(this)},get currentTarget(){return V.get(this)},get eventPhase(){return X.get(this)},get path(){var a=_.get(this);return a?a.slice():[]},stopPropagation:function(){Y.set(this,!0)},stopImmediatePropagation:function(){Y.set(this,!0),Z.set(this,!0)}},N(eb,t,document.createEvent("Event"));var fb=v("UIEvent",t),gb=v("CustomEvent",t),hb={get relatedTarget(){var a=W.get(this);return void 0!==a?a:P(O(this).relatedTarget)}},ib=M({initMouseEvent:w("initMouseEvent",14)},hb),jb=M({initFocusEvent:w("initFocusEvent",5)},hb),kb=v("MouseEvent",fb,ib),lb=v("FocusEvent",fb,jb),mb=Object.create(null),nb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!nb){var ob=function(a,b,c){if(c){var d=mb[c];b=M(M({},d),b)}mb[a]=b};ob("Event",{bubbles:!1,cancelable:!1}),ob("CustomEvent",{detail:null},"Event"),ob("UIEvent",{view:null,detail:0},"Event"),ob("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ob("FocusEvent",{relatedTarget:null},"UIEvent")}var pb=window.BeforeUnloadEvent;y.prototype=Object.create(t.prototype),M(y.prototype,{get returnValue(){return this.impl.returnValue},set returnValue(a){this.impl.returnValue=a}}),pb&&N(pb,y);var qb=window.EventTarget,rb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;rb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),B.prototype={addEventListener:function(a,b,c){if(z(b)&&!A(a)){var d=new s(a,b,c),e=R.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],e.depth=0,R.set(this,e);e.push(d);var g=C(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=R.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=C(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=O(b),d=c.type;S.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return O(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},qb&&N(qb,B);var sb=document.elementFromPoint;a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=gb,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=lb,a.wrappers.MouseEvent=kb,a.wrappers.UIEvent=fb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,o)}function c(a){this.impl=a}function d(){this.length=0,b(this,"length")}function e(a){for(var b=new d,e=0;e<a.length;e++)b[e]=new c(a[e]);return b.length=e,b}function f(a){g.call(this,a)}var g=a.wrappers.UIEvent,h=a.mixin,i=a.registerWrapper,j=a.unwrap,k=a.wrap,l=window.TouchEvent;if(l){var m;try{m=document.createEvent("TouchEvent")}catch(n){return}var o={enumerable:!1};c.prototype={get target(){return k(this.impl.target)}};var p={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(a){p.get=function(){return this.impl[a]},Object.defineProperty(c.prototype,a,p)}),d.prototype={item:function(a){return this[a]}},f.prototype=Object.create(g.prototype),h(f.prototype,{get touches(){return e(j(this).touches)},get targetTouches(){return e(j(this).targetTouches)},get changedTouches(){return e(j(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),i(l,f,m),a.wrappers.Touch=c,a.wrappers.TouchEvent=f,a.wrappers.TouchList=d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,g)}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,g={enumerable:!1};c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);O=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;O=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new y,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a,b){I(a,b),a.nodeIsInserted_()}function k(a,b){for(var c=D(b),d=0;d<a.length;d++)j(a[d],c)}function l(a){I(a,new z(a,null))}function m(a){for(var b=0;b<a.length;b++)l(a[b])}function n(a,b){var c=a.nodeType===w.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(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 p(a,b){o(a,b);var c=b.length;if(1===c)return J(b[0]);for(var d=J(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(J(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=J(b),e=d.parentNode;e&&V.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=J(a),g=f.firstChild;g;)c=g.nextSibling,V.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=L(c?P.call(c,a.impl,!1):Q.call(a.impl,!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof N.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a,b){if(!b||D(a)!==D(b))return!1;for(var c=b;c;c=c.parentNode)if(c===a)return!0;return!1}function w(a){A(a instanceof R),x.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var x=a.wrappers.EventTarget,y=a.wrappers.NodeList,z=a.TreeScope,A=a.assert,B=a.defineWrapGetter,C=a.enqueueMutation,D=a.getTreeScope,E=a.isWrapper,F=a.mixin,G=a.registerTransientObservers,H=a.registerWrapper,I=a.setTreeScope,J=a.unwrap,K=a.unwrapIfNeeded,L=a.wrap,M=a.wrapIfNeeded,N=a.wrappers,O=!1,P=document.importNode,Q=window.Node.prototype.cloneNode,R=window.Node,S=window.DocumentFragment,T=(R.prototype.appendChild,R.prototype.compareDocumentPosition),U=R.prototype.insertBefore,V=R.prototype.removeChild,W=R.prototype.replaceChild,X=/Trident/.test(navigator.userAgent),Y=X?function(a,b){try{V.call(a,b)}catch(c){if(!(a instanceof S))throw c}}:function(a,b){V.call(a,b)};w.prototype=Object.create(x.prototype),F(w.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?E(c)?d=J(c):(d=c,c=L(d)):(c=null,d=null),c&&A(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),U.call(this.impl,J(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var j=d?d.parentNode:this.impl;j?U.call(j,p(this,e),d):o(this,e)}return C(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e,this),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=J(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Y(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),Y(this.impl,f);return O||C(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),G(this,a),a},replaceChild:function(a,d){b(a);var e;if(E(d)?e=J(d):(e=d,d=L(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),W.call(this.impl,J(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&W.call(e.parentNode,p(this,h),e)),C(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h,this),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:L(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:L(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:L(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:L(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:L(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==w.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=w.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=this.impl.ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),this.impl.textContent=a;var d=i(this.childNodes);C(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d,this)},get childNodes(){for(var a=new y,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){return v(this,M(a))},compareDocumentPosition:function(a){return T.call(this.impl,K(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===w.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,t(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(R,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.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){return a.matches(b)}function d(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===l}function e(){return!0}function f(a,b){return a.localName===b}function g(a,b){return a.namespaceURI===b}function h(a,b,c){return a.namespaceURI===b&&a.localName===c}function i(a,b,c,d,e){for(var f=a.firstElementChild;f;)c(f,d,e)&&(b[b.length++]=f),i(f,b,c,d,e),f=f.nextElementSibling;return b}var j=a.wrappers.HTMLCollection,k=a.wrappers.NodeList,l="http://www.w3.org/1999/xhtml",m={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return i(this,new k,c,a)}},n={getElementsByTagName:function(a){var b=new j;return"*"===a?i(this,b,e):i(this,b,d,a,a.toLowerCase())},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new j;if(""===a)a=null;else if("*"===a)return"*"===b?i(this,c,e):i(this,c,f,b);return"*"===b?i(this,c,g,a):i(this,c,h,a,b)}};a.GetElementsByInterface=n,a.SelectorsInterface=m}(window.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},remove:function(){var a=this.parentNode;a&&a.removeChild(this)}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return this.impl.data},set data(a){var b=this.impl.data;e(this,"characterData",{oldValue:b}),this.impl.data=a}}),f(b.prototype,c),g(h,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){a.invalidateRendererBasedOnAttribute(b,"class")}function c(a,b){this.impl=a,this.ownerElement_=b}c.prototype={get length(){return this.impl.length},item:function(a){return this.impl.item(a)},contains:function(a){return this.impl.contains(a)},add:function(){this.impl.add.apply(this.impl,arguments),b(this.ownerElement_)},remove:function(){this.impl.remove.apply(this.impl,arguments),b(this.ownerElement_)},toggle:function(){var a=this.impl.toggle.apply(this.impl,arguments);return b(this.ownerElement_),a},toString:function(){return this.impl.toString()}},a.wrappers.DOMTokenList=c}(window.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,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){g.call(this,a)}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.wrappers.DOMTokenList,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.unwrap,o=a.wrappers,p=window.Element,q=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return p.prototype[a]}),r=q[0],s=p.prototype[r],t=new WeakMap;d.prototype=Object.create(g.prototype),l(d.prototype,{createShadowRoot:function(){var b=new o.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,d){var e=this.impl.getAttribute(a);this.impl.setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=this.impl.getAttribute(a);this.impl.removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return s.call(this.impl,a)},get classList(){var a=t.get(this);return a||t.set(this,a=new h(n(this).classList,this)),a},get className(){return n(this).className},set className(a){this.setAttribute("class",a)},get id(){return n(this).id},set id(a){this.setAttribute("id",a)}}),q.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),p.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),l(d.prototype,e),l(d.prototype,f),l(d.prototype,i),l(d.prototype,j),m(p,d,document.createElementNS(null,"x")),a.invalidateRendererBasedOnAttribute=b,a.matchesNames=q,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"\xa0":return"&nbsp;"}}function c(a){return a.replace(z,b)}function d(a){return a.replace(A,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",B[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&C[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof y.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=w(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(x(f))}function i(a){o.call(this,a)}function j(a,b){var c=w(a.cloneNode(!1));c.innerHTML=b;for(var d,e=w(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return x(e)}function k(b){return function(){return a.renderAllPending(),this.impl[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unwrap,x=a.wrap,y=a.wrappers,z=/[&\u00A0"]/g,A=/[&\u00A0<>]/g,B=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),C=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D=/MSIE/.test(navigator.userAgent),E=window.HTMLElement,F=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(D&&C[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof y.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!F&&this instanceof y.HTMLTemplateElement?h(this.content,a):this.impl.innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(E,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.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}(window.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}(window.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.wrapHTMLCollection,g=a.unwrap,h=window.HTMLFormElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get elements(){return f(g(this).elements)}}),e(h,b,document.createElement("form")),a.wrappers.HTMLFormElement=b}(window.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"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}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}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=(a.mixin,a.wrappers.NodeList,a.registerWrapper),e=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=k.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);k.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=h(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!l){var b=c(a);j.set(this,i(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unwrap,i=a.wrap,j=new WeakMap,k=new WeakMap,l=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{get content(){return l?i(this.impl.content):j.get(this)}}),l&&g(l,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.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.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){return void 0===a?void c.prototype.remove.call(this):("object"==typeof a&&(a=f(a)),void f(this).remove(a))},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.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.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.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.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.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.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.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,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.wrappers.Element,c=a.wrappers.HTMLElement,d=a.registerObject,e="http://www.w3.org/2000/svg",f=document.createElementNS(e,"title"),g=d(f),h=Object.getPrototypeOf(g.prototype).constructor;if(!("classList"in f)){var i=Object.getOwnPropertyDescriptor(b.prototype,"classList");Object.defineProperty(c.prototype,"classList",i),delete b.prototype.classList
+}a.wrappers.SVGElement=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.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.wrap,g=window.SVGElementInstance;g&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return f(this.impl.correspondingElement)},get correspondingUseElement(){return f(this.impl.correspondingUseElement)},get parentNode(){return f(this.impl.parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return f(this.impl.firstChild)},get lastChild(){return f(this.impl.lastChild)},get previousSibling(){return f(this.impl.previousSibling)},get nextSibling(){return f(this.impl.nextSibling)}}),e(g,b),a.wrappers.SVGElementInstance=b)}(window.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,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.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;if(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)}});var h=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(g,b,h),a.wrappers.WebGLRenderingContext=b}}(window.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))},toString:function(){return this.impl.toString()}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.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.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=k(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;m.set(this,e),this.treeScope_=new d(this,g(e||a)),l.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unwrap,l=new WeakMap,m=new WeakMap,n=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return m.get(this)||null},get host(){return l.get(this)||null},invalidateShadowRenderer:function(){return l.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return n.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.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){I.set(a,[])}function f(a){var b=I.get(a);return b||I.set(a,b=[]),b}function g(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function h(){for(var a=0;a<M.length;a++){var b=M[a],c=b.parentRenderer;c&&c.dirty||b.render()}M=[]}function i(){y=null,h()}function j(a){var b=K.get(a);return b||(b=new n(a),K.set(a,b)),b}function k(a){var b=E(a).root;return b instanceof D?b:null}function l(a){return j(a.host)}function m(a){this.skip=!1,this.node=a,this.childNodes=[]}function n(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function o(a){for(var b=[],c=a.firstChild;c;c=c.nextSibling)v(c)?b.push.apply(b,f(c)):b.push(c);return b}function p(a){if(a instanceof B)return a;if(a instanceof A)return null;for(var b=a.firstChild;b;b=b.nextSibling){var c=p(b);if(c)return c}return null}function q(a,b){f(b).push(a);var c=J.get(a);c?c.push(b):J.set(a,[b])}function r(a){return J.get(a)}function s(a){J.set(a,void 0)}function t(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if(!O.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function u(a,b){var c=r(b);return c&&c[c.length-1]===a}function v(a){return a instanceof A||a instanceof B}function w(a){return a.shadowRoot}function x(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.getTreeScope),F=(a.mixin,a.oneOf),G=a.unwrap,H=a.wrap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),M=[],N=new ArraySplice;N.equals=function(a,b){return G(a.node)===b},m.prototype={append:function(a){var b=new m(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=g(G(b)),h=a||new WeakMap,i=N.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(h);for(var o=n.removed.length,p=0;o>p;p++){var q=H(f[k++]);h.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),h.set(u,!0),t.sync(h)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(h)}}},n.prototype={render:function(a){if(this.dirty){this.invalidateAttributes();var b=this.host;this.distribution(b);var c=a||new m(b);this.buildRenderTree(c,b);var d=!a;d&&c.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var a=this.parentRenderer;if(a&&a.invalidate(),M.push(this),y)return;y=window[L](i,0)}},distribution:function(a){this.resetAll(a),this.distributionResolution(a)},resetAll:function(a){v(a)?e(a):s(a);for(var b=a.firstChild;b;b=b.nextSibling)this.resetAll(b);a.shadowRoot&&this.resetAll(a.shadowRoot),a.olderShadowRoot&&this.resetAll(a.olderShadowRoot)},distributionResolution:function(a){if(w(a)){for(var b=a,c=o(b),d=x(b),e=0;e<d.length;e++)this.poolDistribution(d[e],c);for(var e=d.length-1;e>=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i<c.length;i++)q(c[i],g)}this.distributionResolution(f)}}for(var j=a.firstChild;j;j=j.nextSibling)this.distributionResolution(j)},poolDistribution:function(a,b){if(!(a instanceof B))if(a instanceof A){var c=a;this.updateDependentAttributes(c.getAttribute("select"));for(var d=!1,e=0;e<b.length;e++){var a=b[e];a&&t(a,c)&&(q(a,c),b[e]=void 0,d=!0)}if(!d)for(var f=c.firstChild;f;f=f.nextSibling)q(f,c)}else for(var f=a.firstChild;f;f=f.nextSibling)this.poolDistribution(f,b)},buildRenderTree:function(a,b){for(var c=this.compose(b),d=0;d<c.length;d++){var e=c[d],f=a.append(e);this.buildRenderTree(f,e)}if(w(b)){var g=j(b);g.dirty=!1}},compose:function(a){for(var b=[],c=a.shadowRoot||a,d=c.firstChild;d;d=d.nextSibling)if(v(d)){this.associateNode(c);for(var e=f(d),g=0;g<e.length;g++){var h=e[g];u(d,h)&&b.push(h)}}else b.push(d);return b},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]},associateNode:function(a){a.impl.polymerShadowRenderer_=this}};var O=/^[*.#[a-zA-Z_|]/;C.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=B.prototype.getDistributedNodes=function(){return h(),f(this)},z.prototype.getDestinationInsertionPoints=function(){return h(),r(this)||[]},A.prototype.nodeIsInserted_=B.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=k(this);b&&(a=l(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.getRendererForHost=j,a.getShadowTrees=x,a.renderAllPending=h,a.getDestinationInsertionPoints=r,a.visual={insertBefore:c,remove:d}}(window.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","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}{var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap;window.Selection}b.prototype={get anchorNode(){return f(this.impl.anchorNode)},get focusNode(){return f(this.impl.focusNode)},addRange:function(a){this.impl.addRange(d(a))},collapse:function(a,b){this.impl.collapse(e(a),b)},containsNode:function(a,b){return this.impl.containsNode(e(a),b)},extend:function(a,b){this.impl.extend(e(a),b)},getRangeAt:function(a){return f(this.impl.getRangeAt(a))},removeRange:function(a){this.impl.removeRange(d(a))},selectAllChildren:function(a){this.impl.selectAllChildren(e(a))},toString:function(){return this.impl.toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a),this.treeScope_=new p(this,null)}function c(a){var c=document[a];b.prototype[a]=function(){return A(c.apply(this.impl,arguments))}}function d(a,b){D.call(b.impl,z(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&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 A(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.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.TreeScope,q=a.cloneNode,r=a.defineWrapGetter,s=a.elementFromPoint,t=a.forwardMethodsToWrapper,u=a.matchesNames,v=a.mixin,w=a.registerWrapper,x=a.renderAllPending,y=a.rewrap,z=a.unwrap,A=a.wrap,B=a.wrapEventTargetMethods,C=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),r(b,"documentElement"),r(b,"body"),r(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var D=document.adoptNode,E=document.getSelection;if(v(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return s(this,this,a,b)},importNode:function(a,b){return q(a,b,this.impl)},getSelection:function(){return x(),new m(E.call(z(this)))},getElementsByName:function(a){return n.querySelectorAll.call(this,"[name="+JSON.stringify(String(a))+"]")}}),document.registerElement){var F=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void(this.impl=a):f?document.createElement(f,b):document.createElement(b)}var e,f;if(void 0!==c&&(e=c.prototype,f=c.extends),e||(e=Object.create(HTMLElement.prototype)),a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var g,h=Object.getPrototypeOf(e),i=[];h&&!(g=a.nativePrototypeTable.get(h));)i.push(h),h=Object.getPrototypeOf(h);if(!g)throw new Error("NotSupportedError");for(var j=Object.create(g),k=i.length-1;k>=0;k--)j=Object.create(j);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(j[a]=function(){A(this)instanceof d||y(this),b.apply(A(this),arguments)})});var l={prototype:j};f&&(l.extends=f),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(j,d),a.nativePrototypeTable.set(e,j);F.call(z(this),b,l);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getElementsByName","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=C.get(this);return a?a:(a=new g(z(this).implementation),C.set(this,a),a)},get defaultView(){return A(z(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),B([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(m.call(h(this)))},get document(){return j(h(this).document)}}),f(k,b,window),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;d&&(c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)})}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=new e(a&&d(a))}var c=a.registerWrapper,d=a.unwrap,e=window.FormData;c(e,b,new e),a.wrappers.FormData=b}(window.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}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(a){function b(a,c){var d,e,f,g,h=a.firstElementChild;for(e=[],f=a.shadowRoot;f;)e.push(f),f=f.olderShadowRoot;for(g=e.length-1;g>=0;g--)if(d=e[g].querySelector(c))return d;for(;h;){if(d=b(h,c))return d;h=h.nextElementSibling}return null}function c(a,b,d){var e,f,g,h,i,j=a.firstElementChild;for(g=[],f=a.shadowRoot;f;)g.push(f),f=f.olderShadowRoot;for(h=g.length-1;h>=0;h--)for(e=g[h].querySelectorAll(b),i=0;i<e.length;i++)d.push(e[i]);for(;j;)c(j,b,d),j=j.nextElementSibling;return d}window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var d=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var a=d.call(this);return CustomElements.watchShadow(this),a},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot,a.queryAllShadows=function(a,d,e){return e?c(a,d,[]):b(a,d)}}(window.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(l,"")),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=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=g.sheet.cssRules,b(e)})}else e=d(a),b(e)}}function h(a){a&&j().appendChild(document.createTextNode(a))}function i(a,b){var d=c(a);d.setAttribute(b,""),d.setAttribute(z,""),document.head.appendChild(d)}function j(){return w||(w=document.createElement("style"),w.setAttribute(z,""),w[z]=!0),w}var k={strictStyling:!1,registry:{},shimStyling:function(a,c,d){var e=this.prepareRoot(a,c,d),f=this.isTypeExtension(d),g=this.makeScopeSelector(c,f),h=b(e,!0);h=this.scopeCssText(h,g),a&&(a.shimmedStyle=h),this.addCssToDocument(h,c)},shimStyle:function(a,b){return this.shimCssText(a.textContent,b)},shimCssText:function(a,b){return a=this.insertDirectives(a),this.scopeCssText(a,b)},makeScopeSelector:function(a,b){return a?b?"[is="+a+"]":a:""},isTypeExtension:function(a){return a&&a.indexOf("-")<0},prepareRoot:function(a,b,c){var d=this.registerRoot(a,b,c);return this.replaceTextInStyles(d.rootStyles,this.insertDirectives),this.removeStyles(a,d.rootStyles),this.strictStyling&&this.applyScopeToContent(a,b),d.scopeStyles},removeStyles:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)c.parentNode.removeChild(c)},registerRoot:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=this.findStyles(a);d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},findStyles:function(a){if(!a)return[];var b=a.querySelectorAll("style");return Array.prototype.filter.call(b,function(a){return!a.hasAttribute(A)})},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))},insertDirectives:function(a){return a=this.insertPolyfillDirectivesInCssText(a),this.insertPolyfillRulesInCssText(a)},insertPolyfillDirectivesInCssText:function(a){return a=a.replace(m,function(a,b){return b.slice(0,-2)+"{"}),a.replace(n,function(a,b){return b+" {"})},insertPolyfillRulesInCssText:function(a){return a=a.replace(o,function(a,b){return b.slice(0,-1)}),a.replace(p,function(a,b,c,d){var e=a.replace(b,"").replace(c,"");return d+e})},scopeCssText:function(a,b){var c=this.extractUnscopedRulesFromCssText(a);if(a=this.insertPolyfillHostInCssText(a),a=this.convertColonHost(a),a=this.convertColonHostContext(a),a=this.convertShadowDOMSelectors(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertShadowDOMSelectors:function(a){for(var b=0;b<shadowDOMSelectorsRe.length;b++)a=a.replace(shadowDOMSelectorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){if(a.selectorText&&a.style&&void 0!==a.style.cssText)c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n";else if(a.type===CSSRule.MEDIA_RULE)c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n";else try{a.cssText&&(c+=a.cssText+"\n\n")}catch(d){}},this),c},scopeSelector:function(a,b,c){var d=[],e=a.split(",");return e.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b)&&(a=c&&!a.match(polyfillHostNoCombinator)?this.applyStrictSelectorScope(a,b):this.applySelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){if(Array.isArray(b))return!0;var c=this.makeScopeMatcher(b);return!a.match(c)},makeScopeMatcher:function(a){return a=a.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+a+")"+selectorReSuffix,"m")},applySelectorScope:function(a,b){return Array.isArray(b)?this.applySelectorScopeList(a,b):this.applySimpleSelectorScope(a,b)},applySelectorScopeList:function(a,b){for(var c,d=[],e=0;c=b[e];e++)d.push(this.applySimpleSelectorScope(a,c));return d.join(", ")},applySimpleSelectorScope:function(a,b){return a.match(polyfillHostRe)?(a=a.replace(polyfillHostNoCombinator,b),a.replace(polyfillHostRe,b+" ")):b+" "+a},applyStrictSelectorScope:function(a,b){b=b.replace(/\[is=([^\]]*)\]/g,"$1");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(polyfillHostRe,"");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(colonHostContextRe,t).replace(colonHostRe,s)},propertiesFromRule:function(a){var b=a.style.cssText;a.style.content&&!a.style.content.match(/['"]+|attr/)&&(b=b.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"));var c=a.style;for(var d in c)"initial"===c[d]&&(b+=d+": initial; ");return b},replaceTextInStyles:function(a,b){a&&b&&(a instanceof Array||(a=[a]),Array.prototype.forEach.call(a,function(a){a.textContent=b.call(this,a.textContent)},this))},addCssToDocument:function(a,b){a.match("@import")?i(a,b):h(a)}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/polyfill-next-selector[^}]*content\:[\s]*['|"]([^'"]*)['|"][^}]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*['|"]([^'"]*)['|"][^;]*;)[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['|"]([^'"]*)['|"][^;]*;)[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),shadowDOMSelectorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g,/::content/g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){var b=a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var c="link[rel=stylesheet]["+y+"]",d="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+c,HTMLImports.importer.importsPreloadSelectors+=","+c,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,c,d].join(",");var e=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var c=a.__importElement||a;if(!c.hasAttribute(y))return void e.call(this,a);a.__resource?(c=a.ownerDocument.createElement("style"),c.textContent=b.resolveCssText(a.__resource,a.href)):b.resolveStyle(c),c.textContent=k.shimStyle(c),c.removeAttribute(y,""),c.setAttribute(z,""),c[z]=!0,c.parentNode!==C&&(a.parentNode===C?C.replaceChild(c,a):C.appendChild(c)),c.__importParsed=!0,this.markParsingComplete(a),this.parseNext()}};var f=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:f.call(this,a)}}})}a.ShadowCSS=k}(window.Platform)):!function(){window.wrap=window.unwrap=function(a){return a},addEventListener("DOMContentLoaded",function(){if(CustomElements.useNative===!1){var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b}}}),Platform.templateContent=function(a){if(window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(a),!a.content&&!a._content){for(var b=document.createDocumentFragment();a.firstChild;)b.appendChild(a.firstChild);a._content=b}return a.content||a._content}}(window.Platform),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;
+break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query";else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x<l.length;x++){var y=l[x];if("	"!=y&&"\n"!=y&&"\r"!=y)if(":"!=y||null!==this._password){var z=e(y);null!==this._password?this._password+=z:this._username+=z}else this._password="";else i("Invalid whitespace in authority.")}l=""}else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){k-=l.length,l="",j="host";continue}l+=u}break;case"file host":if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){2!=l.length||!p.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?j="relative path start":(this._host=d.call(this,l),l="",j="relative path start"):j="relative path";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid whitespace in file host."):l+=u;break;case"host":case"hostname":if(":"!=u||s){if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){if(this._host=d.call(this,l),l="",j="relative path start",g)break a;continue}"	"!=u&&"\n"!=u&&"\r"!=u?("["==u?s=!0:"]"==u&&(s=!1),l+=u):i("Invalid code point in host/hostname: "+u)}else if(this._host=d.call(this,l),l="",j="port","hostname"==g)break a;break;case"port":if(/[0-9]/.test(u))l+=u;else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u||g){if(""!=l){var A=parseInt(l,10);A!=m[this._scheme]&&(this._port=A+""),l=""}if(g)break a;j="relative path start";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid code point in port: "+u):c.call(this)}break;case"relative path start":if("\\"==u&&i("'\\' not allowed in path."),j="relative path","/"!=u&&"\\"!=u)continue;break;case"relative path":if(o!=u&&"/"!=u&&"\\"!=u&&(g||"?"!=u&&"#"!=u))"	"!=u&&"\n"!=u&&"\r"!=u&&(l+=e(u));else{"\\"==u&&i("\\ not allowed in relative path.");var B;(B=n[l.toLowerCase()])&&(l=B),".."==l?(this._path.pop(),"/"!=u&&"\\"!=u&&this._path.push("")):"."==l&&"/"!=u&&"\\"!=u?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&p.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==u?(this._query="?",j="query"):"#"==u&&(this._fragment="#",j="fragment")}break;case"query":g||"#"!=u?o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._query+=f(u)):(this._fragment="#",j="fragment");break;case"fragment":o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._fragment+=u)}k++}}function h(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function i(a,b){void 0===b||b instanceof i||(b=new i(String(b))),this._url=a,h.call(this);var c=a.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");g.call(this,c,null,b)}var j=!1;if(!a.forceJURL)try{var k=new URL("b","http://a");j="http://a/b"===k.href}catch(l){}if(!j){var m=Object.create(null);m.ftp=21,m.file=0,m.gopher=70,m.http=80,m.https=443,m.ws=80,m.wss=443;var n=Object.create(null);n["%2e"]=".",n[".%2e"]="..",n["%2e."]="..",n["%2e%2e"]="..";var o=void 0,p=/[a-zA-Z]/,q=/[a-zA-Z0-9\+\-\.]/;i.prototype={get href(){if(this._isInvalid)return this._url;var a="";return(""!=this._username||null!=this._password)&&(a=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+a+this.host:"")+this.pathname+this._query+this._fragment},set href(a){h.call(this),g.call(this,a)},get protocol(){return this._scheme+":"},set protocol(a){this._isInvalid||g.call(this,a+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"host")},get hostname(){return this._host},set hostname(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"hostname")},get port(){return this._port},set port(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(a){!this._isInvalid&&this._isRelative&&(this._path=[],g.call(this,a,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(a){!this._isInvalid&&this._isRelative&&(this._query="?","?"==a[0]&&(a=a.slice(1)),g.call(this,a,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(a){this._isInvalid||(this._fragment="#","#"==a[0]&&(a=a.slice(1)),g.call(this,a,"fragment"))}},a.URL=i}}(window),function(a){function b(a){for(var b=a||{},d=1;d<arguments.length;d++){var e=arguments[d];try{for(var f in e)c(f,e,b)}catch(g){}}return b}function c(a,b,c){var e=d(b,a);Object.defineProperty(c,a,e)}function d(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||d(Object.getPrototypeOf(a),b)}}Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();return d.push.apply(d,arguments),b.apply(a,d)}}),a.mixin=b}(window.Platform),function(a){"use strict";function b(a,b,c){var d="string"==typeof a?document.createElement(a):a.cloneNode(!0);if(d.innerHTML=b,c)for(var e in c)d.setAttribute(e,c[e]);return d}var c=DOMTokenList.prototype.add,d=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)c.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)d.call(this,arguments[a])},DOMTokenList.prototype.toggle=function(a,b){1==arguments.length&&(b=!this.contains(a)),b?this.add(a):this.remove(a)},DOMTokenList.prototype.switch=function(a,b){a&&this.remove(a),b&&this.add(b)};var e=function(){return Array.prototype.slice.call(this)},f=window.NamedNodeMap||window.MozNamedAttrMap||{};if(NodeList.prototype.array=e,f.prototype.array=e,HTMLCollection.prototype.array=e,!window.performance){var g=Date.now();window.performance={now:function(){return Date.now()-g}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var a=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return a?function(b){return a(function(){b(performance.now())})}:function(a){return window.setTimeout(a,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(a){clearTimeout(a)}}());var h=[],i=function(){h.push(arguments)};window.Polymer=i,a.deliverDeclarations=function(){return a.deliverDeclarations=function(){throw"Possible attempt to load Polymer twice"},h},window.addEventListener("DOMContentLoaded",function(){window.Polymer===i&&(window.Polymer=function(){console.error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})}),a.createDOM=b}(window.Platform),function(a){a.templateContent=a.templateContent||function(a){return a.content}}(window.Platform),function(a){a=a||(window.Inspector={});var b;window.sinspect=function(a,d){b||(b=window.open("","ShadowDOM Inspector",null,!0),b.document.write(c),b.api={shadowize:shadowize}),f(a||wrap(document.body),d)};var c=["<!DOCTYPE html>","<html>","  <head>","    <title>ShadowDOM Inspector</title>","    <style>","      body {","      }","      pre {",'        font: 9pt "Courier New", monospace;',"        line-height: 1.5em;","      }","      tag {","        color: purple;","      }","      ul {","         margin: 0;","         padding: 0;","         list-style: none;","      }","      li {","         display: inline-block;","         background-color: #f1f1f1;","         padding: 4px 6px;","         border-radius: 4px;","         margin-right: 4px;","      }","    </style>","  </head>","  <body>",'    <ul id="crumbs">',"    </ul>",'    <div id="tree"></div>',"  </body>","</html>"].join("\n"),d=[],e=function(){var a=b.document,c=a.querySelector("#crumbs");c.textContent="";for(var e,g=0;e=d[g];g++){var h=a.createElement("a");h.href="#",h.textContent=e.localName,h.idx=g,h.onclick=function(a){for(var b;d.length>this.idx;)b=d.pop();f(b.shadow||b,b),a.preventDefault()},c.appendChild(a.createElement("li")).appendChild(h)}},f=function(a,c){var f=b.document;k=[];var g=c||a;d.push(g),e(),f.body.querySelector("#tree").innerHTML="<pre>"+j(a,a.childNodes)+"</pre>"},g=Array.prototype.forEach.call.bind(Array.prototype.forEach),h={STYLE:1,SCRIPT:1,"#comment":1,TEMPLATE:1},i=function(a){return h[a.nodeName]},j=function(a,b,c){if(i(a))return"";var d=c||"";if(a.localName||11==a.nodeType){var e=a.localName||"shadow-root",f=d+l(a);"content"==e&&(b=a.getDistributedNodes()),f+="<br/>";var h=d+"&nbsp;&nbsp;";g(b,function(a){f+=j(a,a.childNodes,h)}),f+=d,{br:1}[e]||(f+="<tag>&lt;/"+e+"&gt;</tag>",f+="<br/>")}else{var k=a.textContent.trim();f=k?d+'"'+k+'"<br/>':""}return f},k=[],l=function(a){var b="<tag>&lt;",c=a.localName||"shadow-root";return a.webkitShadowRoot||a.shadowRoot?(b+=' <button idx="'+k.length+'" onclick="api.shadowize.call(this)">'+c+"</button>",k.push(a)):b+=c||"shadow-root",a.attributes&&g(a.attributes,function(a){b+=" "+a.name+(a.value?'="'+a.value+'"':"")}),b+="&gt;</tag>"};shadowize=function(){var a=Number(this.attributes.idx.value),b=k[a];b?f(b.webkitShadowRoot||b.shadowRoot,b):(console.log("bad shadowize node"),console.dir(this))},a.output=j}(window.Inspector),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window),function(a){function b(a){f.textContent=d++,e.push(a)}function c(){for(;e.length;)e.shift()()}var d=0,e=[],f=document.createTextNode("");new(window.MutationObserver||JsMutationObserver)(c).observe(f,{characterData:!0}),a.endOfMicrotask=b}(Platform),function(a){function b(a,b,d,e){return a.replace(e,function(a,e,f,g){var h=f.replace(/["']/g,"");return h=c(b,h,d),e+"'"+h+"'"+g})}function c(a,b,c){if(b&&"/"===b[0])return b;var e=new URL(b,a);return c?e.href:d(e.href)}function d(a){var b=new URL(document.baseURI),c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b,c):a}function e(a,b){for(var c=a.pathname,d=b.pathname,e=c.split("/"),f=d.split("/");e.length&&e[0]===f[0];)e.shift(),f.shift();for(var g=0,h=e.length-1;h>g;g++)f.unshift("..");return f.join("/")+b.search+b.hash}var f={resolveDom:function(a,b){b=b||a.ownerDocument.baseURI,this.resolveAttributes(a,b),this.resolveStyles(a,b);var c=a.querySelectorAll("template");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)d.content&&this.resolveDom(d.content,b)},resolveTemplate:function(a){this.resolveDom(a.content,a.ownerDocument.baseURI)},resolveStyles:function(a,b){var c=a.querySelectorAll("style");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveStyle(d,b)},resolveStyle:function(a,b){b=b||a.ownerDocument.baseURI,a.textContent=this.resolveCssText(a.textContent,b)},resolveCssText:function(a,c,d){return a=b(a,c,d,g),b(a,c,d,h)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(j);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,d){d=d||a.ownerDocument.baseURI,i.forEach(function(e){var f,h=a.attributes[e],i=h&&h.value;i&&i.search(k)<0&&(f="style"===e?b(i,d,!1,g):c(d,i),h.value=f)})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action","style","url"],j="["+i.join("],[")+"]",k="{{.*}}";a.urlResolver=f}(Platform),function(a){function b(a){u.push(a),t||(t=!0,q(d))}function c(a){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(a)||a}function d(){t=!1;var a=u;u=[],a.sort(function(a,b){return a.uid_-b.uid_});var b=!1;a.forEach(function(a){var c=a.takeRecords();e(a),c.length&&(a.callback_(c,a),b=!0)}),b&&d()}function e(a){a.nodes_.forEach(function(b){var c=p.get(b);c&&c.forEach(function(b){b.observer===a&&b.removeTransientObservers()})})}function f(a,b){for(var c=a;c;c=c.parentNode){var d=p.get(c);if(d)for(var e=0;e<d.length;e++){var f=d[e],g=f.options;if(c===a||g.subtree){var h=b(g);h&&f.enqueue(h)}}}}function g(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++v}function h(a,b){this.type=a,this.target=b,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function i(a){var b=new h(a.type,a.target);return b.addedNodes=a.addedNodes.slice(),b.removedNodes=a.removedNodes.slice(),b.previousSibling=a.previousSibling,b.nextSibling=a.nextSibling,b.attributeName=a.attributeName,b.attributeNamespace=a.attributeNamespace,b.oldValue=a.oldValue,b}function j(a,b){return w=new h(a,b)}function k(a){return x?x:(x=i(w),x.oldValue=a,x)}function l(){w=x=void 0}function m(a){return a===x||a===w}function n(a,b){return a===b?a:x&&m(a)?x:null}function o(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var p=new WeakMap,q=window.msSetImmediate;if(!q){var r=[],s=String(Math.random());window.addEventListener("message",function(a){if(a.data===s){var b=r;r=[],b.forEach(function(a){a()})}}),q=function(a){r.push(a),window.postMessage(s,"*")}}var t=!1,u=[],v=0;g.prototype={observe:function(a,b){if(a=c(a),!b.childList&&!b.attributes&&!b.characterData||b.attributeOldValue&&!b.attributes||b.attributeFilter&&b.attributeFilter.length&&!b.attributes||b.characterDataOldValue&&!b.characterData)throw new SyntaxError;var d=p.get(a);d||p.set(a,d=[]);for(var e,f=0;f<d.length;f++)if(d[f].observer===this){e=d[f],e.removeListeners(),e.options=b;break}e||(e=new o(this,a,b),d.push(e),this.nodes_.push(a)),e.addListeners()},disconnect:function(){this.nodes_.forEach(function(a){for(var b=p.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){d.removeListeners(),b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}};var w,x;o.prototype={enqueue:function(a){var c=this.observer.records_,d=c.length;if(c.length>0){var e=c[d-1],f=n(e,a);if(f)return void(c[d-1]=f)}else b(this.observer);c[d]=a},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(a){var b=this.options;b.attributes&&a.addEventListener("DOMAttrModified",this,!0),b.characterData&&a.addEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.addEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(a){var b=this.options;b.attributes&&a.removeEventListener("DOMAttrModified",this,!0),b.characterData&&a.removeEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.removeEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(a){if(a!==this.target){this.addListeners_(a),this.transientObservedNodes.push(a);var b=p.get(a);b||p.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[],a.forEach(function(a){this.removeListeners_(a);for(var b=p.get(a),c=0;c<b.length;c++)if(b[c]===this){b.splice(c,1);break}},this)},handleEvent:function(a){switch(a.stopImmediatePropagation(),a.type){case"DOMAttrModified":var b=a.attrName,c=a.relatedNode.namespaceURI,d=a.target,e=new j("attributes",d);e.attributeName=b,e.attributeNamespace=c;var g=a.attrChange===MutationEvent.ADDITION?null:a.prevValue;f(d,function(a){return!a.attributes||a.attributeFilter&&a.attributeFilter.length&&-1===a.attributeFilter.indexOf(b)&&-1===a.attributeFilter.indexOf(c)?void 0:a.attributeOldValue?k(g):e});break;case"DOMCharacterDataModified":var d=a.target,e=j("characterData",d),g=a.prevValue;f(d,function(a){return a.characterData?a.characterDataOldValue?k(g):e:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(a.target);case"DOMNodeInserted":var h,i,d=a.relatedNode,m=a.target;"DOMNodeInserted"===a.type?(h=[m],i=[]):(h=[],i=[m]);var n=m.previousSibling,o=m.nextSibling,e=j("childList",d);e.addedNodes=h,e.removedNodes=i,e.previousSibling=n,e.nextSibling=o,f(d,function(a){return a.childList?e:void 0})}l()}},a.JsMutationObserver=g,a.MutationObserver||(a.MutationObserver=g)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){if(c.load&&console.log("fetch",a,d),a.match(/^data:/)){var e=a.split(","),f=e[0],g=e[1];g=f.indexOf(";base64")>-1?atob(g):decodeURIComponent(g),setTimeout(function(){this.receive(a,d,null,g)}.bind(this),0)}else{var h=function(b,c,e){this.receive(a,d,b,c,e)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d,e){this.cache[a]=d;var f=this.pending[a];e&&e!==a&&(this.cache[e]=d,f=f.concat(this.pending[e]));for(var g,h=0,i=f.length;i>h&&(g=f[h]);h++)this.onload(e||a,g,d),this.tail();this.pending[a]=null,e&&e!==a&&(this.pending[e]=null)},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){if(4===f.readyState){var a=f.getResponseHeader("Location"),c=null;if(a)var c="/"===a.substr(0,1)?location.origin+a:c;d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b=d(a),c="data:text/javascript";try{c+=";base64,"+btoa(b)}catch(e){c+=";charset=utf-8,"+encodeURIComponent(b)}return c}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=/Trident/.test(navigator.userAgent),j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a)},invalidateParse:function(a){a&&a.__importLink&&(a.__importParsed=a.__importLink.__importParsed=!1,this.parseSoon())},parseSoon:function(){this._parseSoon&&cancelAnimationFrame(this._parseDelay);var a=this;this._parseSoon=requestAnimationFrame(function(){a.parseNext()})},parseImport:function(a){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.import.__importParsed=!0,this.markParsingComplete(a),a.dispatchEvent(a.__resource?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.parseNext()},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),document.head.appendChild(a)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a),c.parseNext()};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),document.head.appendChild(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0;return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&!a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n,a.isIE=i}(HTMLImports),function(a){function b(a){return c(a,q)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(q)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}function e(a,b){b=b||r,g(function(){h(a,b)},b)}function f(a){return"complete"===a.readyState||a.readyState===y}function g(a,b){if(f(b))a&&a();else{var c=function(){("complete"===b.readyState||b.readyState===y)&&(b.removeEventListener(z,c),g(a,b))};b.addEventListener(z,c)}}function h(a,b){function c(){f==g&&a&&a()}function d(){f++,c()}var e=b.querySelectorAll("link[rel=import]"),f=0,g=e.length;if(g)for(var h,j=0;g>j&&(h=e[j]);j++)i(h)?d.call(h):(h.addEventListener("load",d),h.addEventListener("error",d));else c()}function i(a){return o?a.import&&"loading"!==a.import.readyState||a.__loaded:a.__importParsed}function j(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)k(b)&&l(b)}function k(a){return"link"===a.localName&&"import"===a.rel}function l(a){var b=a.import;b?m({target:a}):(a.addEventListener("load",m),a.addEventListener("error",m))}function m(a){a.target.__loaded=!0}var n="import"in document.createElement("link"),o=n,p=a.flags,q="import",r=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(o)var s={};else var t=(a.xhr,a.Loader),u=a.parser,s={documents:{},documentPreloadSelectors:"link[rel="+q+"]",importsPreloadSelectors:["link[rel="+q+"]"].join(","),loadNode:function(a){v.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);v.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===r?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e){if(p.load&&console.log("loaded",a,c),c.__resource=e,b(c)){var f=this.documents[a];f||(f=d(e,a),f.__importLink=c,this.bootDocument(f),this.documents[a]=f),c.import=f}u.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),u.parseNext()},loadedAll:function(){u.parseNext()}},v=new t(s.loaded.bind(s),s.loadedAll.bind(s));var w={get:function(){return HTMLImports.currentScript||document.currentScript},configurable:!0};if(Object.defineProperty(document,"_currentScript",w),Object.defineProperty(r,"_currentScript",w),!document.baseURI){var x={get:function(){return window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",x),Object.defineProperty(r,"baseURI",x)}var y=HTMLImports.isIE?"complete":"interactive",z="readystatechange";o&&new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&j(b.addedNodes)}).observe(document.head,{childList:!0}),a.hasNative=n,a.useNative=o,a.importer=s,a.IMPORT_LINK_TYPE=q,a.isImportLoaded=i,a.importLoader=v,a.whenReady=e,a.whenImportsReady=e}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e,g=0,h=a.length;h>g&&(e=a[g]);g++)b=b||e.ownerDocument,d(e)&&f.loadNode(e),e.children&&e.children.length&&c(e.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=(a.parser,HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector),h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c});var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.whenImportsReady(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),b.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");
+if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag),d=Object.getPrototypeOf(c);d===a.prototype&&(b=d)}for(var e,f=a.prototype;f&&f!==b;)e=Object.getPrototypeOf(f),f.__proto__=e,f=e;a.native=b}}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),b.removeAttribute("unresolved"),i(b,c),b.__upgraded__=!0,k(b),a.insertedNode(b),a.upgradeSubtree(b),b}function i(a,b){Object.__proto__?a.__proto__=b.prototype:(j(a,b.prototype,b.native),a.__proto__=b.prototype)}function j(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function k(a){a.createdCallback&&a.createdCallback()}function l(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){m.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){m.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function m(a,b,c){a=a.toLowerCase();var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function n(a){return a?z[a.toLowerCase()]:void 0}function o(a,b){z[a]=b}function p(a){return function(){return g(a)}}function q(a,b,c){return a===A?r(b,c):C(a,b)}function r(a,b){var c=n(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=r(a);return d.setAttribute("is",b),d}var d=B(a);return a.indexOf("-")>=0&&i(d,HTMLElement),d}function s(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=n(b||a.localName);if(c){if(b&&c.tag==a.localName)return h(a,c);if(!b&&!c.extends)return h(a,c)}}}function t(b){var c=D.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var u=a.flags,v=Boolean(document.registerElement),w=!u.register&&v&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative);if(w){var x=function(){};a.registry={},a.upgradeElement=x,a.watchShadow=x,a.upgrade=x,a.upgradeAll=x,a.upgradeSubtree=x,a.observeDocument=x,a.upgradeDocument=x,a.upgradeDocumentTree=x,a.takeRecords=x,a.reservedTagList=[]}else{var y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],z={},A="http://www.w3.org/1999/xhtml",B=document.createElement.bind(document),C=document.createElementNS.bind(document),D=Node.prototype.cloneNode;document.registerElement=b,document.createElement=r,document.createElementNS=q,Node.prototype.cloneNode=t,a.registry=z,a.upgrade=s}var E;E=Object.__proto__||w?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=E,a.reservedTagList=y,document.register=document.registerElement,a.hasNative=v,a.useNative=w}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document);var a=window.Platform&&Platform.endOfMicrotask?Platform.endOfMicrotask:setTimeout;a(function(){CustomElements.ready=!0,CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0})),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)})})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a){var b=document.createEvent("HTMLEvents");return b.initEvent(a,!0,!0),b}),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(a){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=a.endOfMicrotask;b.prototype={extractUrls:function(a,b){for(var c,d,e=[];c=this.regex.exec(a);)d=new URL(c[1],b),e.push({matched:c[0],url:d.href});return e},process:function(a,b,c){var d=this.extractUrls(a,b),e=c.bind(null,this.map);this.fetch(d,e)},fetch:function(a,b){var c=a.length;if(!c)return b();for(var d,e,f,g=function(){0===--c&&b()},h=0;c>h;h++)d=a[h],f=d.url,e=this.cache[f],e||(e=this.xhr(f),e.match=d,this.cache[f]=e),e.wait(g)},handleXhr:function(a){var b=a.match,c=b.url,d=a.response||a.responseText||"";this.map[c]=d,this.fetch(this.extractUrls(d,c),a.resolve)},xhr:function(a){this.requests++;var b=new XMLHttpRequest;return b.open("GET",a,!0),b.send(),b.onerror=b.onload=this.handleXhr.bind(this,b),b.pending=[],b.resolve=function(){for(var a=b.pending,c=0;c<a.length;c++)a[c]();b.pending=null},b.wait=function(a){b.pending?b.pending.push(a):c(a)},b}},a.Loader=b}(window.Platform),function(a){function b(){this.loader=new d(this.regex)}var c=a.urlResolver,d=a.Loader;b.prototype={regex:/@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,resolve:function(a,b,c){var d=function(d){c(this.flatten(a,b,d))}.bind(this);this.loader.process(a,b,d)},resolveNode:function(a,b,c){var d=a.textContent,e=function(b){a.textContent=b,c(a)};this.resolve(d,b,e)},flatten:function(a,b,d){for(var e,f,g,h=this.loader.extractUrls(a,b),i=0;i<h.length;i++)e=h[i],f=e.url,g=c.resolveCssText(d[f],f,!0),g=this.flatten(g,b,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b,c){function d(){f++,f===g&&c&&c()}for(var e,f=0,g=a.length,h=0;g>h&&(e=a[h]);h++)this.resolveNode(e,b,d)}};var e=new b;a.styleResolver=e}(window.Platform),function(){"use strict";function a(a){for(;a.parentNode;)a=a.parentNode;return"function"==typeof a.getElementById?a:null}function b(a,b,c){var d=a.bindings_;return d||(d=a.bindings_={}),d[b]&&c[b].close(),d[b]=c}function c(a,b,c){return c}function d(a){return null==a?"":a}function e(a,b){a.data=d(b)}function f(a){return function(b){return e(a,b)}}function g(a,b,c,e){return c?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,d(e))}function h(a,b,c){return function(d){g(a,b,c,d)}}function i(a){switch(a.type){case"checkbox":return u;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function j(a,b,c,e){a[b]=(e||d)(c)}function k(a,b,c){return function(d){return j(a,b,d,c)}}function l(){}function m(a,b,c,d){function e(){c.setValue(a[b]),c.discardChanges(),(d||l)(a),Platform.performMicrotaskCheckpoint()}var f=i(a);return a.addEventListener(f,e),{close:function(){a.removeEventListener(f,e),c.close()},observable_:c}}function n(a){return Boolean(a)}function o(b){if(b.form)return s(b.form.elements,function(a){return a!=b&&"INPUT"==a.tagName&&"radio"==a.type&&a.name==b.name});var c=a(b);if(!c)return[];var d=c.querySelectorAll('input[type="radio"][name="'+b.name+'"]');return s(d,function(a){return a!=b&&!a.form})}function p(a){"INPUT"===a.tagName&&"radio"===a.type&&o(a).forEach(function(a){var b=a.bindings_.checked;b&&b.observable_.setValue(!1)})}function q(a,b){var c,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings_&&g.bindings_.value&&(c=g,e=c.bindings_.value,f=c.value),a.value=d(b),c&&c.value!=f&&(e.observable_.setValue(c.value),e.observable_.discardChanges(),Platform.performMicrotaskCheckpoint())}function r(a){return function(b){q(a,b)}}var s=Array.prototype.filter.call.bind(Array.prototype.filter);Node.prototype.bind=function(a,b){console.error("Unhandled binding to Node: ",this,a,b)},Node.prototype.bindFinished=function(){};var t=c;Object.defineProperty(Platform,"enableBindingsReflection",{get:function(){return t===b},set:function(a){return t=a?b:c,a},configurable:!0}),Text.prototype.bind=function(a,b,c){if("textContent"!==a)return Node.prototype.bind.call(this,a,b,c);if(c)return e(this,b);var d=b;return e(this,d.open(f(this))),t(this,a,d)},Element.prototype.bind=function(a,b,c){var d="?"==a[a.length-1];if(d&&(this.removeAttribute(a),a=a.slice(0,-1)),c)return g(this,a,d,b);var e=b;return g(this,a,d,e.open(h(this,a,d))),t(this,a,e)};var u;!function(){var a=document.createElement("div"),b=a.appendChild(document.createElement("input"));b.setAttribute("type","checkbox");var c,d=0;b.addEventListener("click",function(){d++,c=c||"click"}),b.addEventListener("change",function(){d++,c=c||"change"});var e=document.createEvent("MouseEvent");e.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),b.dispatchEvent(e),u=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,c,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,c,e);this.removeAttribute(a);var f="checked"==a?n:d,g="checked"==a?p:l;if(e)return j(this,a,c,f);var h=c,i=m(this,a,h,g);return j(this,a,h.open(k(this,a,f)),f),b(this,a,i)},HTMLTextAreaElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return j(this,"value",b);var e=b,f=m(this,"value",e);return j(this,"value",e.open(k(this,"value",d))),t(this,a,f)},HTMLOptionElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return q(this,b);var d=b,e=m(this,"value",d);return q(this,d.open(r(this))),t(this,a,e)},HTMLSelectElement.prototype.bind=function(a,c,d){if("selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a)return HTMLElement.prototype.bind.call(this,a,c,d);if(this.removeAttribute(a),d)return j(this,a,c);var e=c,f=m(this,a,e);return j(this,a,e.open(k(this,a))),b(this,a,f)}}(this),function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a){for(var b;b=a.parentNode;)a=b;return a}function d(a,b){if(b){for(var d,e="#"+b;!d&&(a=c(a),a.protoContent_?d=a.protoContent_.querySelector(e):a.getElementById&&(d=a.getElementById(b)),!d&&a.templateCreator_);)a=a.templateCreator_;return d}}function e(a){return"template"==a.tagName&&"http://www.w3.org/2000/svg"==a.namespaceURI}function f(a){return"TEMPLATE"==a.tagName&&"http://www.w3.org/1999/xhtml"==a.namespaceURI}function g(a){return Boolean(L[a.tagName]&&a.hasAttribute("template"))}function h(a){return void 0===a.isTemplate_&&(a.isTemplate_="TEMPLATE"==a.tagName||g(a)),a.isTemplate_}function i(a,b){var c=a.querySelectorAll(N);h(a)&&b(a),G(c,b)}function j(a){function b(a){HTMLTemplateElement.decorate(a)||j(a.content)}i(a,b)}function k(a,b){Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))})}function l(a){var b=a.ownerDocument;if(!b.defaultView)return b;var c=b.templateContentsOwner_;if(!c){for(c=b.implementation.createHTMLDocument("");c.lastChild;)c.removeChild(c.lastChild);b.templateContentsOwner_=c}return c}function m(a){if(!a.stagingDocument_){var b=a.ownerDocument;if(!b.stagingDocument_){b.stagingDocument_=b.implementation.createHTMLDocument(""),b.stagingDocument_.isStagingDocument=!0;var c=b.stagingDocument_.createElement("base");c.href=document.baseURI,b.stagingDocument_.head.appendChild(c),b.stagingDocument_.stagingDocument_=b.stagingDocument_}a.stagingDocument_=b.stagingDocument_}return a.stagingDocument_}function n(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];K[e.name]&&("template"!==e.name&&b.setAttribute(e.name,e.value),a.removeAttribute(e.name))}return b}function o(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];b.setAttribute(e.name,e.value),a.removeAttribute(e.name)}return a.parentNode.removeChild(a),b}function p(a,b,c){var d=a.content;if(c)return void d.appendChild(b);for(var e;e=b.firstChild;)d.appendChild(e)}function q(a){P?a.__proto__=HTMLTemplateElement.prototype:k(a,HTMLTemplateElement.prototype)}function r(a){a.setModelFn_||(a.setModelFn_=function(){a.setModelFnScheduled_=!1;var b=z(a,a.delegate_&&a.delegate_.prepareBinding);w(a,b,a.model_)}),a.setModelFnScheduled_||(a.setModelFnScheduled_=!0,Observer.runEOM_(a.setModelFn_))}function s(a,b,c,d){if(a&&a.length){for(var e,f=a.length,g=0,h=0,i=0,j=!0;f>h;){var g=a.indexOf("{{",h),k=a.indexOf("[[",h),l=!1,m="}}";if(k>=0&&(0>g||g>k)&&(g=k,l=!0,m="]]"),i=0>g?-1:a.indexOf(m,g+2),0>i){if(!e)return;e.push(a.slice(h));break}e=e||[],e.push(a.slice(h,g));var n=a.slice(g+2,i).trim();e.push(l),j=j&&l;var o=d&&d(n,b,c);e.push(null==o?Path.get(n):null),e.push(o),h=i+2}return h===f&&e.push(""),e.hasOnePath=5===e.length,e.isSimplePath=e.hasOnePath&&""==e[0]&&""==e[4],e.onlyOneTime=j,e.combinator=function(a){for(var b=e[0],c=1;c<e.length;c+=4){var d=e.hasOnePath?a:a[(c-1)/4];void 0!==d&&(b+=d),b+=e[c+3]}return b},e}}function t(a,b,c,d){if(b.hasOnePath){var e=b[3],f=e?e(d,c,!0):b[2].getValueFrom(d);return b.isSimplePath?f:b.combinator(f)}for(var g=[],h=1;h<b.length;h+=4){var e=b[h+2];g[(h-1)/4]=e?e(d,c):b[h+1].getValueFrom(d)}return b.combinator(g)}function u(a,b,c,d){var e=b[3],f=e?e(d,c,!1):new PathObserver(d,b[2]);return b.isSimplePath?f:new ObserverTransform(f,b.combinator)}function v(a,b,c,d){if(b.onlyOneTime)return t(a,b,c,d);if(b.hasOnePath)return u(a,b,c,d);for(var e=new CompoundObserver,f=1;f<b.length;f+=4){var g=b[f],h=b[f+2];if(h){var i=h(d,c,g);g?e.addPath(i):e.addObserver(i)}else{var j=b[f+1];g?e.addPath(j.getValueFrom(d)):e.addPath(d,j)}}return new ObserverTransform(e,b.combinator)}function w(a,b,c,d){for(var e=0;e<b.length;e+=2){var f=b[e],g=b[e+1],h=v(f,g,a,c),i=a.bind(f,h,g.onlyOneTime);i&&d&&d.push(i)}if(a.bindFinished(),b.isTemplate){a.model_=c;var j=a.processBindingDirectives_(b);d&&j&&d.push(j)}}function x(a,b,c){var d=a.getAttribute(b);return s(""==d?"{{}}":d,b,a,c)}function y(a,c){b(a);for(var d=[],e=0;e<a.attributes.length;e++){for(var f=a.attributes[e],g=f.name,i=f.value;"_"===g[0];)g=g.substring(1);if(!h(a)||g!==J&&g!==H&&g!==I){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,J,c),d.bind=x(a,H,c),d.repeat=x(a,I,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",H,a,c))),d}function z(a,b){if(a.nodeType===Node.ELEMENT_NODE)return y(a,b);if(a.nodeType===Node.TEXT_NODE){var c=s(a.data,"textContent",a,b);if(c)return["textContent",c]}return[]}function A(a,b,c,d,e,f,g){for(var h=b.appendChild(c.importNode(a,!1)),i=0,j=a.firstChild;j;j=j.nextSibling)A(j,h,c,d.children[i++],e,f,g);return d.isTemplate&&(HTMLTemplateElement.decorate(h,a),f&&h.setDelegate_(f)),w(h,d,e,g),h}function B(a,b){var c=z(a,b);c.children={};for(var d=0,e=a.firstChild;e;e=e.nextSibling)c.children[d++]=B(e,b);return c}function C(a){var b=a.id_;return b||(b=a.id_=S++),b}function D(a,b){var c=C(a);if(b){var d=b.bindingMaps[c];return d||(d=b.bindingMaps[c]=B(a,b.prepareBinding)||[]),d}var d=a.bindingMap_;return d||(d=a.bindingMap_=B(a,void 0)||[]),d}function E(a){this.closed=!1,this.templateElement_=a,this.instances=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var F,G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?F=a.Map:(F=function(){this.keys=[],this.values=[]},F.prototype={set:function(a,b){var c=this.keys.indexOf(a);0>c?(this.keys.push(a),this.values.push(b)):this.values[c]=b},get:function(a){var b=this.keys.indexOf(a);if(!(0>b))return this.values[b]},"delete":function(a){var b=this.keys.indexOf(a);return 0>b?!1:(this.keys.splice(b,1),this.values.splice(b,1),!0)},forEach:function(a,b){for(var c=0;c<this.keys.length;c++)a.call(b||this,this.values[c],this.keys[c],this)}});"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)});var H="bind",I="repeat",J="if",K={template:!0,repeat:!0,bind:!0,ref:!0},L={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},M="undefined"!=typeof HTMLTemplateElement;M&&!function(){var a=document.createElement("template"),b=a.content.ownerDocument,c=b.appendChild(b.createElement("html")),d=c.appendChild(b.createElement("head")),e=b.createElement("base");e.href=document.baseURI,d.appendChild(e)}();var N="template, "+Object.keys(L).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),M||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var O,P="__proto__"in{};"function"==typeof MutationObserver&&(O=new MutationObserver(function(a){for(var b=0;b<a.length;b++)a[b].target.refChanged_()})),HTMLTemplateElement.decorate=function(a,c){if(a.templateIsDecorated_)return!1;var d=a;d.templateIsDecorated_=!0;var h=f(d)&&M,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=M,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=M)),!h){q(d);var r=l(d);d.content_=r.createDocumentFragment()}return c?d.instanceRef_=c:k?p(d,a,m):i&&j(d.content),!0},HTMLTemplateElement.bootstrap=j;var Q=a.HTMLUnknownElement||HTMLElement,R={get:function(){return this.content_},enumerable:!0,configurable:!0};M||(HTMLTemplateElement.prototype=Object.create(Q.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",R)),k(HTMLTemplateElement.prototype,{bind:function(a,b,c){if("ref"!=a)return Element.prototype.bind.call(this,a,b,c);var d=this,e=c?b:b.open(function(a){d.setAttribute("ref",a),d.refChanged_()});return this.setAttribute("ref",e),this.refChanged_(),c?void 0:(this.bindings_?this.bindings_.ref=b:this.bindings_={ref:b},b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a.if||a.bind||a.repeat?(this.iterator_||(this.iterator_=new E(this)),this.iterator_.updateDependencies(a,this.model_),O&&O.observe(this,{attributes:!0,attributeFilter:["ref"]}),this.iterator_):void(this.iterator_&&(this.iterator_.close(),this.iterator_=void 0))},createInstance:function(a,b,c){b?c=this.newDelegate_(b):c||(c=this.delegate_),this.refContent_||(this.refContent_=this.ref_.content);var d=this.refContent_;if(null===d.firstChild)return T;var e=D(d,c),f=m(this),g=f.createDocumentFragment();g.templateCreator_=this,g.protoContent_=d,g.bindings_=[],g.terminator_=null;for(var h=g.templateInstance_={firstNode:null,lastNode:null,model:a},i=0,j=!1,k=d.firstChild;k;k=k.nextSibling){null===k.nextSibling&&(j=!0);var l=A(k,g,f,e.children[i++],a,c,g.bindings_);l.templateInstance_=h,j&&(g.terminator_=l)}return h.firstNode=g.firstChild,h.lastNode=g.lastChild,g.templateCreator_=void 0,g.protoContent_=void 0,g},get model(){return this.model_},set model(a){this.model_=a,r(this)},get bindingDelegate(){return this.delegate_&&this.delegate_.raw},refChanged_:function(){this.iterator_&&this.refContent_!==this.ref_.content&&(this.refContent_=void 0,this.iterator_.valueChanged(),this.iterator_.updateIteratedValue())},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_&&this.bindings_.ref&&this.bindings_.ref.close(),this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}if(a)return{bindingMaps:{},raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}});var S=1;Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var T=document.createDocumentFragment();T.bindings_=[],T.terminator_=null,E.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),c.ifOneTime&&!c.ifValue)return void this.updateIteratedValue();c.ifOneTime||c.ifValue.open(this.updateIteratedValue,this)}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(I,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(H,a.bind,d,b)),c.oneTime||c.value.open(this.updateIteratedValue,this),this.updateIteratedValue()},updateIteratedValue:function(){if(this.deps.hasIf){var a=this.deps.ifValue;if(this.deps.ifOneTime||(a=a.discardChanges()),!a)return void this.valueChanged()}var b=this.deps.value;this.deps.oneTime||(b=b.discardChanges()),this.deps.repeat||(b=[b]);var c=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(b);this.valueChanged(b,c)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getLastInstanceNode:function(a){if(-1==a)return this.templateElement_;var b=this.instances[a],c=b.terminator_;if(!c)return this.getLastInstanceNode(a-1);if(c.nodeType!==Node.ELEMENT_NODE||this.templateElement_===c)return c;var d=c.iterator_;return d?d.getLastTemplateNode():c},getLastTemplateNode:function(){return this.getLastInstanceNode(this.instances.length-1)},insertInstanceAt:function(a,b){var c=this.getLastInstanceNode(a-1),d=this.templateElement_.parentNode;this.instances.splice(a,0,b),d.insertBefore(b,c.nextSibling)},extractInstanceAt:function(a){for(var b=this.getLastInstanceNode(a-1),c=this.getLastInstanceNode(a),d=this.templateElement_.parentNode,e=this.instances.splice(a,1)[0];c!==b;){var f=b.nextSibling;f==c&&(c=b),e.appendChild(d.removeChild(f))}return e},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));for(var d=new F,e=0,f=0;f<a.length;f++){for(var g=a[f],h=g.removed,i=0;i<h.length;i++){var j=h[i],k=this.extractInstanceAt(g.index+e);k!==T&&d.set(j,k)}e-=g.addedCount}for(var f=0;f<a.length;f++)for(var g=a[f],l=g.index;l<g.index+g.addedCount;l++){var j=this.iteratedValue[l],k=d.get(j);k?d.delete(j):(this.instanceModelFn_&&(j=this.instanceModelFn_(j)),k=void 0===j?T:b.createInstance(j,void 0,c)),this.insertInstanceAt(l,k)}d.forEach(function(a){this.closeInstanceBindings(a)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.instances[a];b!==T&&this.instancePositionChangedFn_(b.templateInstance_,a)},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.instances.length;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=a.bindings_,c=0;c<b.length;c++)b[c].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=0;a<this.instances.length;a++)this.closeInstanceBindings(this.instances[a]);this.instances.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){function b(){e||(e=!0,a.endOfMicrotask(function(){e=!1,logFlags.data&&console.group("Platform.flush()"),a.performMicrotaskCheckpoint(),logFlags.data&&console.groupEnd()}))}var c=document.createElement("style");c.textContent="template {display: none !important;} /* injected by platform.js */";var d=document.querySelector("head");d.insertBefore(c,d.firstChild);var e;if(Observer.hasObjectObserve)b=function(){};else{var f=125;window.addEventListener("WebComponentsReady",function(){b(),a.flushPoll=setInterval(b,f)})}if(window.CustomElements&&!CustomElements.useNative){var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=g.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b}(window.Platform);
 //# sourceMappingURL=platform.js.map
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.js.map b/pkg/web_components/lib/platform.js.map
index 9740272..b4dd299 100644
--- a/pkg/web_components/lib/platform.js.map
+++ b/pkg/web_components/lib/platform.js.map
@@ -1 +1 @@
-{"version":3,"file":"platform.js","sources":["build/boot.js","../WeakMap/weakmap.js","../observe-js/src/observe.js","../ShadowDOM/src/wrappers.js","build/if-poly.js","../ShadowDOM/src/microtask.js","../ShadowDOM/src/MutationObserver.js","../ShadowDOM/src/TreeScope.js","../ShadowDOM/src/wrappers/events.js","../ShadowDOM/src/wrappers/TouchEvent.js","../ShadowDOM/src/wrappers/NodeList.js","../ShadowDOM/src/wrappers/HTMLCollection.js","../ShadowDOM/src/wrappers/Node.js","../ShadowDOM/src/querySelector.js","../ShadowDOM/src/wrappers/node-interfaces.js","../ShadowDOM/src/wrappers/CharacterData.js","../ShadowDOM/src/wrappers/Text.js","../ShadowDOM/src/wrappers/DOMTokenList.js","../ShadowDOM/src/wrappers/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.js","../ShadowDOM/src/wrappers/HTMLFormElement.js","../ShadowDOM/src/wrappers/HTMLImageElement.js","../ShadowDOM/src/wrappers/HTMLShadowElement.js","../ShadowDOM/src/wrappers/HTMLTemplateElement.js","../ShadowDOM/src/wrappers/HTMLMediaElement.js","../ShadowDOM/src/wrappers/HTMLAudioElement.js","../ShadowDOM/src/wrappers/HTMLOptionElement.js","../ShadowDOM/src/wrappers/HTMLSelectElement.js","../ShadowDOM/src/wrappers/HTMLTableElement.js","../ShadowDOM/src/wrappers/HTMLTableSectionElement.js","../ShadowDOM/src/wrappers/HTMLTableRowElement.js","../ShadowDOM/src/wrappers/HTMLUnknownElement.js","../ShadowDOM/src/wrappers/SVGElement.js","../ShadowDOM/src/wrappers/SVGUseElement.js","../ShadowDOM/src/wrappers/SVGElementInstance.js","../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js","../ShadowDOM/src/wrappers/WebGLRenderingContext.js","../ShadowDOM/src/wrappers/Range.js","../ShadowDOM/src/wrappers/ShadowRoot.js","../ShadowDOM/src/ShadowRenderer.js","../ShadowDOM/src/wrappers/generic.js","../ShadowDOM/src/wrappers/elements-with-form-property.js","../ShadowDOM/src/wrappers/Selection.js","../ShadowDOM/src/wrappers/Document.js","../ShadowDOM/src/wrappers/Window.js","../ShadowDOM/src/wrappers/DataTransfer.js","../ShadowDOM/src/wrappers/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","build/else.js","src/patches-shadowdom-native.js","../URL/url.js","src/lang.js","src/dom.js","src/url.js","../MutationObservers/MutationObserver.js","src/template.js","src/inspector.js","src/unresolved.js","src/module.js","src/microtask.js","../HTMLImports/src/Loader.js","../HTMLImports/src/scope.js","../HTMLImports/src/Parser.js","../HTMLImports/src/HTMLImports.js","../HTMLImports/src/Observer.js","../HTMLImports/src/boot.js","../CustomElements/src/Observer.js","../CustomElements/src/CustomElements.js","../CustomElements/src/Parser.js","../CustomElements/src/boot.js","src/patches-custom-elements.js","src/loader.js","../NodeBind/src/NodeBind.js","src/styleloader.js","../TemplateBinding/src/TemplateBinding.js","src/patches-mdv.js"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (parts.length)\n      Array.prototype.push.apply(this, parts.slice());\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.polymerWrapper_ ||\n        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.impl;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.polymerWrapper_ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.impl[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n","// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(observer) {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')\n        return new BeforeUnloadEvent(impl);\n      this.impl = impl;\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        this.impl = type;\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    this.impl = impl;\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element = wrap(originalElementFromPoint.call(document.impl, x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    this.impl = impl;\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(this.impl.target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return this.impl[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(this.impl[name].apply(this.impl, arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : this.impl;\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(this.impl, childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(this.impl,\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalName(el, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[result.length++] = el;\n      findElements(el, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return result;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      return findOne(this, selector);\n    },\n    querySelectorAll: function(selector) {\n      return findElements(this, new NodeList(), matchesSelector, selector);\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      if (localName === '*')\n        return findElements(this, result, matchesEveryThing);\n\n      return findElements(this, result,\n          matchesTagName,\n          localName,\n          localName.toLowerCase());\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n\n      if (ns === '') {\n        ns = null;\n      } else if (ns === '*') {\n        if (localName === '*')\n          return findElements(this, result, matchesEveryThing);\n        return findElements(this, result, matchesLocalName, localName);\n      }\n\n      if (localName === '*')\n        return findElements(this, result, matchesNameSpace, ns);\n\n      return findElements(this, result, matchesLocalNameNS, ns, localName);\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    remove: function() {\n      var p = this.parentNode;\n      if (p)\n        p.removeChild(this);\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return this.impl.data;\n    },\n    set data(value) {\n      var oldValue = this.impl.data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      this.impl.data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, 'class');\n  }\n\n  function DOMTokenList(impl, ownerElement) {\n    this.impl = impl;\n    this.ownerElement_ = ownerElement;\n  }\n\n  DOMTokenList.prototype = {\n    get length() {\n      return this.impl.length;\n    },\n    item: function(index) {\n      return this.impl.item(index);\n    },\n    contains: function(token) {\n      return this.impl.contains(token);\n    },\n    add: function() {\n      this.impl.add.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    remove: function() {\n      this.impl.remove.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    toggle: function(token) {\n      var rv = this.impl.toggle.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n      return rv;\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  scope.wrappers.DOMTokenList = DOMTokenList;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var DOMTokenList = scope.wrappers.DOMTokenList;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  var classListTable = new WeakMap();\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\n    },\n\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this,\n            list = new DOMTokenList(unwrap(this).classList, this));\n      }\n      return list;\n    },\n\n    get className() {\n      return unwrap(this).className;\n    },\n\n    set className(v) {\n      this.setAttribute('class', v);\n    },\n\n    get id() {\n      return unwrap(this).id;\n    },\n\n    set id(v) {\n      this.setAttribute('id', v);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        this.impl.innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return this.impl[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        this.impl[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return this.impl[name].apply(this.impl, arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = this.impl.getContext.apply(this.impl, arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLFormElement = window.HTMLFormElement;\n\n  function HTMLFormElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLFormElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLFormElement.prototype, {\n    get elements() {\n      // Note: technically this should be an HTMLFormControlsCollection, but\n      // that inherits from HTMLCollection, so should be good enough. Spec:\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection\n      return wrapHTMLCollection(unwrap(this).elements);\n    }\n  });\n\n  registerWrapper(OriginalHTMLFormElement, HTMLFormElement,\n                  document.createElement('form'));\n\n  scope.wrappers.HTMLFormElement = HTMLFormElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n\n  // getDistributedNodes is added in ShadowRenderer\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(this.impl.content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n\n  function trimText(s) {\n    return s.replace(/\\s+/g, ' ').trim();\n  }\n\n  function HTMLOptionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLOptionElement.prototype, {\n    get text() {\n      return trimText(this.textContent);\n    },\n    set text(value) {\n      this.textContent = trimText(String(value));\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,\n                  document.createElement('option'));\n\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('option'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (text !== undefined)\n      node.text = text;\n    if (value !== undefined)\n      node.setAttribute('value', value);\n    if (defaultSelected === true)\n      node.setAttribute('selected', '');\n    node.selected = selected === true;\n  }\n\n  Option.prototype = HTMLOptionElement.prototype;\n\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLSelectElement = window.HTMLSelectElement;\n\n  function HTMLSelectElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLSelectElement.prototype, {\n    add: function(element, before) {\n      if (typeof before === 'object')  // also includes null\n        before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n\n    remove: function(indexOrNode) {\n      // Spec only allows index but implementations allow index or node.\n      // remove() is also allowed which is same as remove(undefined)\n      if (indexOrNode === undefined) {\n        HTMLElement.prototype.remove.call(this);\n        return;\n      }\n\n      if (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\n\n      unwrap(this).remove(indexOrNode);\n    },\n\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,\n                  document.createElement('select'));\n\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n\n  var OriginalHTMLTableElement = window.HTMLTableElement;\n\n  function HTMLTableElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableElement.prototype, {\n    get caption() {\n      return wrap(unwrap(this).caption);\n    },\n    createCaption: function() {\n      return wrap(unwrap(this).createCaption());\n    },\n\n    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\n    },\n\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,\n                  document.createElement('table'));\n\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  // IE11 does not have classList for SVG elements. The spec says that classList\n  // is an accessor on Element, but IE11 puts classList on HTMLElement, leaving\n  // SVGElement without a classList property. We therefore move the accessor for\n  // IE11.\n  if (!('classList' in svgTitleElement)) {\n    var descr = Object.getOwnPropertyDescriptor(Element.prototype, 'classList');\n    Object.defineProperty(HTMLElement.prototype, 'classList', descr);\n    delete Element.prototype.classList;\n  }\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(this.impl.correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(this.impl.correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(this.impl.parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(this.impl.firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(this.impl.lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(this.impl.previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(this.impl.nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    this.impl = impl;\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      this.impl.drawImage.apply(this.impl, arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return this.impl.createPattern.apply(this.impl, arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    this.impl = impl;\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      this.impl.texImage2D.apply(this.impl, arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      this.impl.texSubImage2D.apply(this.impl, arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    this.impl = impl;\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(this.impl.startContainer);\n    },\n    get endContainer() {\n      return wrap(this.impl.endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(this.impl.commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      this.impl.setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      this.impl.setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      this.impl.setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      this.impl.setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      this.impl.setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      this.impl.setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      this.impl.selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      this.impl.selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(this.impl.extractContents());\n    },\n    cloneContents: function() {\n      return wrap(this.impl.cloneContents());\n    },\n    insertNode: function(node) {\n      this.impl.insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      this.impl.surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(this.impl.cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return this.impl.comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return this.impl.intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(this.impl.createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    this.treeScope_ =\n        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  var selectorStartCharRe = /^[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = this.impl.polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    this.impl.polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(doc.impl, unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    getElementsByName: function(name) {\n      return SelectorsInterface.querySelectorAll.call(this,\n          '[name=' + JSON.stringify(String(name)) + ']');\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        this.impl = node;\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getElementsByName',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n\n  function queryShadow(node, selector) {\n    var m, el = node.firstElementChild;\n    var shadows, sr, i;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for(i = shadows.length - 1; i >= 0; i--) {\n      m = shadows[i].querySelector(selector);\n      if (m) {\n        return m;\n      }\n    }\n    while(el) {\n      m = queryShadow(el, selector);\n      if (m) {\n        return m;\n      }\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function queryAllShadows(node, selector, results) {\n    var el = node.firstElementChild;\n    var temp, sr, shadows, i, j;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for (i = shadows.length - 1; i >= 0; i--) {\n      temp = shadows[i].querySelectorAll(selector);\n      for(j = 0; j < temp.length; j++) {\n        results.push(temp[j]);\n      }\n    }\n    while (el) {\n      queryAllShadows(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  scope.queryAllShadows = function(node, selector, all) {\n    if (all) {\n      return queryAllShadows(node, selector, []);\n    } else {\n      return queryShadow(node, selector);\n    }\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertCombinators(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    for (var i=0; i < combinatorsRe.length; i++) {\n      cssText = cssText.replace(combinatorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // TODO(sjmiles): KEYFRAMES_RULE in IE11 throws when we query cssText\n          // 'cssText' in rule returns true, but rule.cssText throws anyway\n          // We can test the rule type, e.g.\n          //   else if (rule.type !== CSSRule.KEYFRAMES_RULE && rule.cssText) {\n          // but this will prevent cssText propagation in other browsers which\n          // support it.\n          // KEYFRAMES_RULE has a CSSRuleSet, so the text can probably be reconstructed\n          // from that collection; this would be a proper fix.\n          // For now, I'm trapping the exception so IE11 is unblocked in other areas.\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            // squelch\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    combinatorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n","} else {","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n  Platform.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})(window.Platform);\n","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  scope.URL = jURL;\n\n})(window);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n// mixin\n\n// copy all properties from inProps (et al) to inObj\nfunction mixin(inObj/*, inProps, inMoreProps, ...*/) {\n  var obj = inObj || {};\n  for (var i = 1; i < arguments.length; i++) {\n    var p = arguments[i];\n    try {\n      for (var n in p) {\n        copyProperty(n, p, obj);\n      }\n    } catch(x) {\n    }\n  }\n  return obj;\n}\n\n// copy property inName from inSource object to inTarget object\nfunction copyProperty(inName, inSource, inTarget) {\n  var pd = getPropertyDescriptor(inSource, inName);\n  Object.defineProperty(inTarget, inName, pd);\n}\n\n// get property descriptor for inName on inObject, even if\n// inName exists on some link in inObject's prototype chain\nfunction getPropertyDescriptor(inObject, inName) {\n  if (inObject) {\n    var pd = Object.getOwnPropertyDescriptor(inObject, inName);\n    return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);\n  }\n}\n\n// export\n\nscope.mixin = mixin;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill DOMTokenList\n  // * add/remove: allow these methods to take multiple classNames\n  // * toggle: add a 2nd argument which forces the given state rather\n  //  than toggling.\n\n  var add = DOMTokenList.prototype.add;\n  var remove = DOMTokenList.prototype.remove;\n  DOMTokenList.prototype.add = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      add.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.remove = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      remove.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.toggle = function(name, bool) {\n    if (arguments.length == 1) {\n      bool = !this.contains(name);\n    }\n    bool ? this.add(name) : this.remove(name);\n  };\n  DOMTokenList.prototype.switch = function(oldName, newName) {\n    oldName && this.remove(oldName);\n    newName && this.add(newName);\n  };\n\n  // add array() to NodeList, NamedNodeMap, HTMLCollection\n\n  var ArraySlice = function() {\n    return Array.prototype.slice.call(this);\n  };\n\n  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});\n\n  NodeList.prototype.array = ArraySlice;\n  namedNodeMap.prototype.array = ArraySlice;\n  HTMLCollection.prototype.array = ArraySlice;\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // utility\n\n  function createDOM(inTagOrNode, inHTML, inAttrs) {\n    var dom = typeof inTagOrNode == 'string' ?\n        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);\n    dom.innerHTML = inHTML;\n    if (inAttrs) {\n      for (var n in inAttrs) {\n        dom.setAttribute(n, inAttrs[n]);\n      }\n    }\n    return dom;\n  }\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    elementDeclarations.push(arguments);\n  }\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.deliverDeclarations = function() {\n    scope.deliverDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    return elementDeclarations;\n  }\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n  // exports\n  scope.createDOM = createDOM;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl, keepAbsolute) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      var value = attr && attr.value;\n      var replacement;\n      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {\n        if (v === 'style') {\n          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);\n        } else {\n          replacement = resolveRelativeUrl(url, value);\n        }\n        attr.value = replacement;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url, keepAbsolute) {\n  // do not resolve '/' absolute urls\n  if (url && url[0] === '/') {\n    return url;\n  }\n  var u = new URL(url, baseUrl);\n  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = new URL(document.baseURI);\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root, u);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(sourceUrl, targetUrl) {\n  var source = sourceUrl.pathname;\n  var target = targetUrl.pathname;\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/') + targetUrl.search + targetUrl.hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// poor man's adapter for template.content on various platform scenarios\n(function(scope) {\n  scope.templateContent = scope.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  scope = scope || (window.Inspector = {});\n  \n  var inspector;\n\n  window.sinspect = function(inNode, inProxy) {\n    if (!inspector) {\n      inspector = window.open('', 'ShadowDOM Inspector', null, true);\n      inspector.document.write(inspectorHTML);\n      //inspector.document.close();\n      inspector.api = {\n        shadowize: shadowize\n      };\n    }\n    inspect(inNode || wrap(document.body), inProxy);\n  };\n\n  var inspectorHTML = [\n    '<!DOCTYPE html>',\n    '<html>',\n    '  <head>',\n    '    <title>ShadowDOM Inspector</title>',\n    '    <style>',\n    '      body {',\n    '      }',\n    '      pre {',\n    '        font: 9pt \"Courier New\", monospace;',\n    '        line-height: 1.5em;',\n    '      }',\n    '      tag {',\n    '        color: purple;',\n    '      }',\n    '      ul {',\n    '         margin: 0;',\n    '         padding: 0;',\n    '         list-style: none;',\n    '      }',\n    '      li {',\n    '         display: inline-block;',\n    '         background-color: #f1f1f1;',\n    '         padding: 4px 6px;',\n    '         border-radius: 4px;',\n    '         margin-right: 4px;',\n    '      }',\n    '    </style>',\n    '  </head>',\n    '  <body>',\n    '    <ul id=\"crumbs\">',\n    '    </ul>',\n    '    <div id=\"tree\"></div>',\n    '  </body>',\n    '</html>'\n  ].join('\\n');\n  \n  var crumbs = [];\n\n  var displayCrumbs = function() {\n    // alias our document\n    var d = inspector.document;\n    // get crumbbar\n    var cb = d.querySelector('#crumbs');\n    // clear crumbs\n    cb.textContent = '';\n    // build new crumbs\n    for (var i=0, c; c=crumbs[i]; i++) {\n      var a = d.createElement('a');\n      a.href = '#';\n      a.textContent = c.localName;\n      a.idx = i;\n      a.onclick = function(event) {\n        var c;\n        while (crumbs.length > this.idx) {\n          c = crumbs.pop();\n        }\n        inspect(c.shadow || c, c);\n        event.preventDefault();\n      };\n      cb.appendChild(d.createElement('li')).appendChild(a);\n    }\n  };\n\n  var inspect = function(inNode, inProxy) {\n    // alias our document\n    var d = inspector.document;\n    // reset list of drillable nodes\n    drillable = [];\n    // memoize our crumb proxy\n    var proxy = inProxy || inNode;\n    crumbs.push(proxy);\n    // update crumbs\n    displayCrumbs();\n    // reflect local tree\n    d.body.querySelector('#tree').innerHTML =\n        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';\n  };\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  var blacklisted = {STYLE:1, SCRIPT:1, \"#comment\": 1, TEMPLATE: 1};\n  var blacklist = function(inNode) {\n    return blacklisted[inNode.nodeName];\n  };\n\n  var output = function(inNode, inChildNodes, inIndent) {\n    if (blacklist(inNode)) {\n      return '';\n    }\n    var indent = inIndent || '';\n    if (inNode.localName || inNode.nodeType == 11) {\n      var name = inNode.localName || 'shadow-root';\n      //inChildNodes = ShadowDOM.localNodes(inNode);\n      var info = indent + describe(inNode);\n      // if only textNodes\n      // TODO(sjmiles): make correct for ShadowDOM\n      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {\n        info += catTextContent(inChildNodes);\n      } else*/ {\n        // TODO(sjmiles): native <shadow> has no reference to its projection\n        if (name == 'content' /*|| name == 'shadow'*/) {\n          inChildNodes = inNode.getDistributedNodes();\n        }\n        info += '<br/>';\n        var ind = indent + '&nbsp;&nbsp;';\n        forEach(inChildNodes, function(n) {\n          info += output(n, n.childNodes, ind);\n        });\n        info += indent;\n      }\n      if (!({br:1}[name])) {\n        info += '<tag>&lt;/' + name + '&gt;</tag>';\n        info += '<br/>';\n      }\n    } else {\n      var text = inNode.textContent.trim();\n      info = text ? indent + '\"' + text + '\"' + '<br/>' : '';\n    }\n    return info;\n  };\n\n  var catTextContent = function(inChildNodes) {\n    var info = '';\n    forEach(inChildNodes, function(n) {\n      info += n.textContent.trim();\n    });\n    return info;\n  };\n\n  var drillable = [];\n\n  var describe = function(inNode) {\n    var tag = '<tag>' + '&lt;';\n    var name = inNode.localName || 'shadow-root';\n    if (inNode.webkitShadowRoot || inNode.shadowRoot) {\n      tag += ' <button idx=\"' + drillable.length +\n        '\" onclick=\"api.shadowize.call(this)\">' + name + '</button>';\n      drillable.push(inNode);\n    } else {\n      tag += name || 'shadow-root';\n    }\n    if (inNode.attributes) {\n      forEach(inNode.attributes, function(a) {\n        tag += ' ' + a.name + (a.value ? '=\"' + a.value + '\"' : '');\n      });\n    }\n    tag += '&gt;'+ '</tag>';\n    return tag;\n  };\n\n  // remote api\n\n  shadowize = function() {\n    var idx = Number(this.attributes.idx.value);\n    //alert(idx);\n    var node = drillable[idx];\n    if (node) {\n      inspect(node.webkitShadowRoot || node.shadowRoot, node)\n    } else {\n      console.log(\"bad shadowize node\");\n      console.dir(this);\n    }\n  };\n  \n  // export\n  \n  scope.output = output;\n  \n})(window.Inspector);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.cache[redirectedUrl] = resource;\n        $p = $p.concat(this.pending[redirectedUrl]);\n      }\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        //if (!err) {\n          // If url was redirected, use the redirected location so paths are\n          // calculated relative to that.\n          this.onload(redirectedUrl || url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.pending[redirectedUrl] = null;\n      }\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : redirectedUrl;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    elt.import.__importParsed = true;\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      callback && callback();\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :\n      link.__importParsed;\n}\n\n// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded\n// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007\n// and should be removed when this bug is addressed.\nif (useNative) {\n  new MutationObserver(function(mxns) {\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\n      if (m.addedNodes) {\n        handleImports(m.addedNodes);\n      }\n    }\n  }).observe(document.head, {childList: true});\n\n  function handleImports(nodes) {\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n      if (isImport(n)) {\n        handleImport(n);  \n      }\n    }\n  }\n\n  function isImport(element) {\n    return element.localName === 'link' && element.rel === 'import';\n  }\n\n  function handleImport(element) {\n    var loaded = element.import;\n    if (loaded) {\n      markTargetLoaded({target: element});\n    } else {\n      element.addEventListener('load', markTargetLoaded);\n      element.addEventListener('error', markTargetLoaded);\n    }\n  }\n\n  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.whenImportsReady = whenImportsReady;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\n\n})(window.HTMLImports);\n"," /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(){\n\n// bootstrap\n\n// IE shim for CustomEvent\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, dictionary) {\n     var e = document.createEvent('HTMLEvents');\n     e.initEvent(inType,\n        dictionary.bubbles === false ? false : true,\n        dictionary.cancelable === false ? false : true,\n        dictionary.detail);\n     return e;\n  };\n}\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nHTMLImports.whenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  doc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n"," /*\r\nCopyright 2013 The Polymer Authors. All rights reserved.\r\nUse of this source code is governed by a BSD-style\r\nlicense that can be found in the LICENSE file.\r\n*/\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Implements `document.register`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// For consistent timing, use native custom elements only when not polyfilling\n// other key related web components features.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    name = name.toLowerCase();\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // choose async\n  var async = window.Platform && Platform.endOfMicrotask ? \n    Platform.endOfMicrotask :\n    setTimeout;\n  async(function() {\n    // set internal 'ready' flag, now document.registerElement will trigger \n    // synchronous upgrades\n    CustomElements.ready = true;\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n\n    // install upgrade hook if HTMLImports are available\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        CustomElements.parser.parse(elt.import);\n      }\n    }\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(inType, true, true);\n    return e;\n  };\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.cache = Object.create(null);\n    this.map = Object.create(null);\n    this.requests = 0;\n    this.regex = regex;\n  }\n  Loader.prototype = {\n\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n\n      // every call to process returns all the text this loader has ever received\n      var done = callback.bind(null, this.map);\n      this.fetch(matches, done);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback();\n      }\n\n      // wait for all subrequests to return\n      var done = function() {\n        if (--inflight === 0) {\n          callback();\n        }\n      };\n\n      // start fetching all subrequests\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        req = this.cache[url];\n        // if this url has already been requested, skip requesting it again\n        if (!req) {\n          req = this.xhr(url);\n          req.match = m;\n          this.cache[url] = req;\n        }\n        // wait for the request to process its subrequests\n        req.wait(done);\n      }\n    },\n    handleXhr: function(request) {\n      var match = request.match;\n      var url = match.url;\n\n      // handle errors with an empty string\n      var response = request.response || request.responseText || '';\n      this.map[url] = response;\n      this.fetch(this.extractUrls(response, url), request.resolve);\n    },\n    xhr: function(url) {\n      this.requests++;\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onerror = request.onload = this.handleXhr.bind(this, request);\n\n      // queue of tasks to run after XHR returns\n      request.pending = [];\n      request.resolve = function() {\n        var pending = request.pending;\n        for(var i = 0; i < pending.length; i++) {\n          pending[i]();\n        }\n        request.pending = null;\n      };\n\n      // if we have already resolved, pending is null, async call the callback\n      request.wait = function(fn) {\n        if (request.pending) {\n          request.pending.push(fn);\n        } else {\n          endOfMicrotask(fn);\n        }\n      };\n\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  Node.prototype.bindFinished = function() {};\n\n  function updateBindings(node, name, binding) {\n    var bindings = node.bindings_;\n    if (!bindings)\n      bindings = node.bindings_ = {};\n\n    if (bindings[name])\n      binding[name].close();\n\n    return bindings[name] = binding;\n  }\n\n  function returnBinding(node, name, binding) {\n    return binding;\n  }\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  var maybeUpdateBindings = returnBinding;\n\n  Object.defineProperty(Platform, 'enableBindingsReflection', {\n    get: function() {\n      return maybeUpdateBindings === updateBindings;\n    },\n    set: function(enable) {\n      maybeUpdateBindings = enable ? updateBindings : returnBinding;\n      return enable;\n    },\n    configurable: true\n  });\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    var observable = value;\n    updateText(this, observable.open(textBinding(this)));\n    return maybeUpdateBindings(this, name, observable);\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n\n    var observable = value;\n    updateAttribute(this, name, conditional,\n        observable.open(attributeBinding(this, name, conditional)));\n\n    return maybeUpdateBindings(this, name, observable);\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    return {\n      close: function() {\n        input.removeEventListener(eventType, eventHandler);\n        observable.close();\n      },\n\n      observable_: observable\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings_.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.observable_.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable, postEventFn);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    // Checkboxes may need to update bindings of other checkboxes.\n    return updateBindings(this, name, binding);\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateInput(this, 'value',\n                observable.open(inputBinding(this, 'value', sanitizeValue)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings_ &&\n        parentNode.bindings_.value) {\n      select = parentNode;\n      selectBinding = select.bindings_.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.observable_.setValue(select.value);\n      selectBinding.observable_.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateOption(this, observable.open(optionBinding(this)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name)));\n\n    // Option update events may need to access select bindings.\n    return updateBindings(this, name, binding);\n  }\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, url, callback) {\n    var text = style.textContent;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer, keep absolute url\n      intermediate = urlResolver.resolveCssText(map[url], url, true);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, base, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, base, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, base, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue();\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n"]}
\ No newline at end of file
+{"version":3,"file":"platform.js","sources":["build/boot.js","../WeakMap/weakmap.js","../observe-js/src/observe.js","build/if-poly.js","../ShadowDOM/src/wrappers.js","../ShadowDOM/src/microtask.js","../ShadowDOM/src/MutationObserver.js","../ShadowDOM/src/TreeScope.js","../ShadowDOM/src/wrappers/events.js","../ShadowDOM/src/wrappers/TouchEvent.js","../ShadowDOM/src/wrappers/NodeList.js","../ShadowDOM/src/wrappers/HTMLCollection.js","../ShadowDOM/src/wrappers/Node.js","../ShadowDOM/src/querySelector.js","../ShadowDOM/src/wrappers/node-interfaces.js","../ShadowDOM/src/wrappers/CharacterData.js","../ShadowDOM/src/wrappers/Text.js","../ShadowDOM/src/wrappers/DOMTokenList.js","../ShadowDOM/src/wrappers/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.js","../ShadowDOM/src/wrappers/HTMLFormElement.js","../ShadowDOM/src/wrappers/HTMLImageElement.js","../ShadowDOM/src/wrappers/HTMLShadowElement.js","../ShadowDOM/src/wrappers/HTMLTemplateElement.js","../ShadowDOM/src/wrappers/HTMLMediaElement.js","../ShadowDOM/src/wrappers/HTMLAudioElement.js","../ShadowDOM/src/wrappers/HTMLOptionElement.js","../ShadowDOM/src/wrappers/HTMLSelectElement.js","../ShadowDOM/src/wrappers/HTMLTableElement.js","../ShadowDOM/src/wrappers/HTMLTableSectionElement.js","../ShadowDOM/src/wrappers/HTMLTableRowElement.js","../ShadowDOM/src/wrappers/HTMLUnknownElement.js","../ShadowDOM/src/wrappers/SVGElement.js","../ShadowDOM/src/wrappers/SVGUseElement.js","../ShadowDOM/src/wrappers/SVGElementInstance.js","../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js","../ShadowDOM/src/wrappers/WebGLRenderingContext.js","../ShadowDOM/src/wrappers/Range.js","../ShadowDOM/src/wrappers/generic.js","../ShadowDOM/src/wrappers/ShadowRoot.js","../ShadowDOM/src/ShadowRenderer.js","../ShadowDOM/src/wrappers/elements-with-form-property.js","../ShadowDOM/src/wrappers/Selection.js","../ShadowDOM/src/wrappers/Document.js","../ShadowDOM/src/wrappers/Window.js","../ShadowDOM/src/wrappers/DataTransfer.js","../ShadowDOM/src/wrappers/FormData.js","../ShadowDOM/src/wrappers/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","src/patches-shadowdom-native.js","../URL/url.js","src/lang.js","src/dom.js","src/template.js","src/inspector.js","src/unresolved.js","src/module.js","src/microtask.js","src/url.js","../MutationObservers/MutationObserver.js","../HTMLImports/src/scope.js","../HTMLImports/src/Loader.js","../HTMLImports/src/Parser.js","../HTMLImports/src/HTMLImports.js","../HTMLImports/src/Observer.js","../HTMLImports/src/boot.js","../CustomElements/src/scope.js","../CustomElements/src/Observer.js","../CustomElements/src/CustomElements.js","../CustomElements/src/Parser.js","../CustomElements/src/boot.js","src/patches-custom-elements.js","src/loader.js","src/styleloader.js","../NodeBind/src/NodeBind.js","../TemplateBinding/src/TemplateBinding.js","src/patches-mdv.js"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n","// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.polymerWrapper_ ||\n        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.impl;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.polymerWrapper_ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.impl[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(observer) {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')\n        return new BeforeUnloadEvent(impl);\n      this.impl = impl;\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        this.impl = type;\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    this.impl = impl;\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element = wrap(originalElementFromPoint.call(document.impl, x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    this.impl = impl;\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(this.impl.target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return this.impl[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(this.impl[name].apply(this.impl, arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : this.impl;\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(this.impl, childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(this.impl,\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalName(el, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[result.length++] = el;\n      findElements(el, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return result;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      return findOne(this, selector);\n    },\n    querySelectorAll: function(selector) {\n      return findElements(this, new NodeList(), matchesSelector, selector);\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      if (localName === '*')\n        return findElements(this, result, matchesEveryThing);\n\n      return findElements(this, result,\n          matchesTagName,\n          localName,\n          localName.toLowerCase());\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n\n      if (ns === '') {\n        ns = null;\n      } else if (ns === '*') {\n        if (localName === '*')\n          return findElements(this, result, matchesEveryThing);\n        return findElements(this, result, matchesLocalName, localName);\n      }\n\n      if (localName === '*')\n        return findElements(this, result, matchesNameSpace, ns);\n\n      return findElements(this, result, matchesLocalNameNS, ns, localName);\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    remove: function() {\n      var p = this.parentNode;\n      if (p)\n        p.removeChild(this);\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return this.impl.data;\n    },\n    set data(value) {\n      var oldValue = this.impl.data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      this.impl.data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, 'class');\n  }\n\n  function DOMTokenList(impl, ownerElement) {\n    this.impl = impl;\n    this.ownerElement_ = ownerElement;\n  }\n\n  DOMTokenList.prototype = {\n    get length() {\n      return this.impl.length;\n    },\n    item: function(index) {\n      return this.impl.item(index);\n    },\n    contains: function(token) {\n      return this.impl.contains(token);\n    },\n    add: function() {\n      this.impl.add.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    remove: function() {\n      this.impl.remove.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    toggle: function(token) {\n      var rv = this.impl.toggle.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n      return rv;\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  scope.wrappers.DOMTokenList = DOMTokenList;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var DOMTokenList = scope.wrappers.DOMTokenList;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  var classListTable = new WeakMap();\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\n    },\n\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this,\n            list = new DOMTokenList(unwrap(this).classList, this));\n      }\n      return list;\n    },\n\n    get className() {\n      return unwrap(this).className;\n    },\n\n    set className(v) {\n      this.setAttribute('class', v);\n    },\n\n    get id() {\n      return unwrap(this).id;\n    },\n\n    set id(v) {\n      this.setAttribute('id', v);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        this.impl.innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return this.impl[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        this.impl[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return this.impl[name].apply(this.impl, arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = this.impl.getContext.apply(this.impl, arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n\n  var OriginalHTMLFormElement = window.HTMLFormElement;\n\n  function HTMLFormElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLFormElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLFormElement.prototype, {\n    get elements() {\n      // Note: technically this should be an HTMLFormControlsCollection, but\n      // that inherits from HTMLCollection, so should be good enough. Spec:\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection\n      return wrapHTMLCollection(unwrap(this).elements);\n    }\n  });\n\n  registerWrapper(OriginalHTMLFormElement, HTMLFormElement,\n                  document.createElement('form'));\n\n  scope.wrappers.HTMLFormElement = HTMLFormElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n\n  // getDistributedNodes is added in ShadowRenderer\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(this.impl.content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n\n  function trimText(s) {\n    return s.replace(/\\s+/g, ' ').trim();\n  }\n\n  function HTMLOptionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLOptionElement.prototype, {\n    get text() {\n      return trimText(this.textContent);\n    },\n    set text(value) {\n      this.textContent = trimText(String(value));\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,\n                  document.createElement('option'));\n\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('option'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (text !== undefined)\n      node.text = text;\n    if (value !== undefined)\n      node.setAttribute('value', value);\n    if (defaultSelected === true)\n      node.setAttribute('selected', '');\n    node.selected = selected === true;\n  }\n\n  Option.prototype = HTMLOptionElement.prototype;\n\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLSelectElement = window.HTMLSelectElement;\n\n  function HTMLSelectElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLSelectElement.prototype, {\n    add: function(element, before) {\n      if (typeof before === 'object')  // also includes null\n        before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n\n    remove: function(indexOrNode) {\n      // Spec only allows index but implementations allow index or node.\n      // remove() is also allowed which is same as remove(undefined)\n      if (indexOrNode === undefined) {\n        HTMLElement.prototype.remove.call(this);\n        return;\n      }\n\n      if (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\n\n      unwrap(this).remove(indexOrNode);\n    },\n\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,\n                  document.createElement('select'));\n\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n\n  var OriginalHTMLTableElement = window.HTMLTableElement;\n\n  function HTMLTableElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableElement.prototype, {\n    get caption() {\n      return wrap(unwrap(this).caption);\n    },\n    createCaption: function() {\n      return wrap(unwrap(this).createCaption());\n    },\n\n    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\n    },\n\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,\n                  document.createElement('table'));\n\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  // IE11 does not have classList for SVG elements. The spec says that classList\n  // is an accessor on Element, but IE11 puts classList on HTMLElement, leaving\n  // SVGElement without a classList property. We therefore move the accessor for\n  // IE11.\n  if (!('classList' in svgTitleElement)) {\n    var descr = Object.getOwnPropertyDescriptor(Element.prototype, 'classList');\n    Object.defineProperty(HTMLElement.prototype, 'classList', descr);\n    delete Element.prototype.classList;\n  }\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(this.impl.correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(this.impl.correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(this.impl.parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(this.impl.firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(this.impl.lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(this.impl.previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(this.impl.nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    this.impl = impl;\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      this.impl.drawImage.apply(this.impl, arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return this.impl.createPattern.apply(this.impl, arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    this.impl = impl;\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      this.impl.texImage2D.apply(this.impl, arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      this.impl.texSubImage2D.apply(this.impl, arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    this.impl = impl;\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(this.impl.startContainer);\n    },\n    get endContainer() {\n      return wrap(this.impl.endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(this.impl.commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      this.impl.setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      this.impl.setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      this.impl.setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      this.impl.setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      this.impl.setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      this.impl.setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      this.impl.selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      this.impl.selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(this.impl.extractContents());\n    },\n    cloneContents: function() {\n      return wrap(this.impl.cloneContents());\n    },\n    insertNode: function(node) {\n      this.impl.insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      this.impl.surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(this.impl.cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return this.impl.comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return this.impl.intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(this.impl.createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    this.treeScope_ =\n        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        var parentRenderer = this.parentRenderer;\n        if (parentRenderer)\n          parentRenderer.invalidate();\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  var selectorStartCharRe = /^[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = this.impl.polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    this.impl.polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(doc.impl, unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    getElementsByName: function(name) {\n      return SelectorsInterface.querySelectorAll.call(this,\n          '[name=' + JSON.stringify(String(name)) + ']');\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        this.impl = node;\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getElementsByName',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  if (OriginalDataTransferSetDragImage) {\n    OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n      OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n    };\n  }\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n\n  var OriginalFormData = window.FormData;\n\n  function FormData(formElement) {\n    this.impl = new OriginalFormData(formElement && unwrap(formElement));\n  }\n\n  registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n\n  scope.wrappers.FormData = FormData;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n\n  function queryShadow(node, selector) {\n    var m, el = node.firstElementChild;\n    var shadows, sr, i;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for(i = shadows.length - 1; i >= 0; i--) {\n      m = shadows[i].querySelector(selector);\n      if (m) {\n        return m;\n      }\n    }\n    while(el) {\n      m = queryShadow(el, selector);\n      if (m) {\n        return m;\n      }\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function queryAllShadows(node, selector, results) {\n    var el = node.firstElementChild;\n    var temp, sr, shadows, i, j;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for (i = shadows.length - 1; i >= 0; i--) {\n      temp = shadows[i].querySelectorAll(selector);\n      for(j = 0; j < temp.length; j++) {\n        results.push(temp[j]);\n      }\n    }\n    while (el) {\n      queryAllShadows(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  scope.queryAllShadows = function(node, selector, all) {\n    if (all) {\n      return queryAllShadows(node, selector, []);\n    } else {\n      return queryShadow(node, selector);\n    }\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertShadowDOMSelectors(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert combinators like ::shadow and pseudo-elements like ::content\n   * by replacing with space.\n  */\n  convertShadowDOMSelectors: function(cssText) {\n    for (var i=0; i < shadowDOMSelectorsRe.length; i++) {\n      cssText = cssText.replace(shadowDOMSelectorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // TODO(sjmiles): KEYFRAMES_RULE in IE11 throws when we query cssText\n          // 'cssText' in rule returns true, but rule.cssText throws anyway\n          // We can test the rule type, e.g.\n          //   else if (rule.type !== CSSRule.KEYFRAMES_RULE && rule.cssText) {\n          // but this will prevent cssText propagation in other browsers which\n          // support it.\n          // KEYFRAMES_RULE has a CSSRuleSet, so the text can probably be reconstructed\n          // from that collection; this would be a proper fix.\n          // For now, I'm trapping the exception so IE11 is unblocked in other areas.\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            // squelch\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*['|\"]([^'\"]*)['|\"][^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*['|\"]([^'\"]*)['|\"][^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*['|\"]([^'\"]*)['|\"][^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    shadowDOMSelectorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g,\n      /::content/g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n  Platform.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})(window.Platform);\n","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  scope.URL = jURL;\n\n})(window);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n// mixin\n\n// copy all properties from inProps (et al) to inObj\nfunction mixin(inObj/*, inProps, inMoreProps, ...*/) {\n  var obj = inObj || {};\n  for (var i = 1; i < arguments.length; i++) {\n    var p = arguments[i];\n    try {\n      for (var n in p) {\n        copyProperty(n, p, obj);\n      }\n    } catch(x) {\n    }\n  }\n  return obj;\n}\n\n// copy property inName from inSource object to inTarget object\nfunction copyProperty(inName, inSource, inTarget) {\n  var pd = getPropertyDescriptor(inSource, inName);\n  Object.defineProperty(inTarget, inName, pd);\n}\n\n// get property descriptor for inName on inObject, even if\n// inName exists on some link in inObject's prototype chain\nfunction getPropertyDescriptor(inObject, inName) {\n  if (inObject) {\n    var pd = Object.getOwnPropertyDescriptor(inObject, inName);\n    return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);\n  }\n}\n\n// export\n\nscope.mixin = mixin;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill DOMTokenList\n  // * add/remove: allow these methods to take multiple classNames\n  // * toggle: add a 2nd argument which forces the given state rather\n  //  than toggling.\n\n  var add = DOMTokenList.prototype.add;\n  var remove = DOMTokenList.prototype.remove;\n  DOMTokenList.prototype.add = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      add.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.remove = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      remove.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.toggle = function(name, bool) {\n    if (arguments.length == 1) {\n      bool = !this.contains(name);\n    }\n    bool ? this.add(name) : this.remove(name);\n  };\n  DOMTokenList.prototype.switch = function(oldName, newName) {\n    oldName && this.remove(oldName);\n    newName && this.add(newName);\n  };\n\n  // add array() to NodeList, NamedNodeMap, HTMLCollection\n\n  var ArraySlice = function() {\n    return Array.prototype.slice.call(this);\n  };\n\n  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});\n\n  NodeList.prototype.array = ArraySlice;\n  namedNodeMap.prototype.array = ArraySlice;\n  HTMLCollection.prototype.array = ArraySlice;\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // utility\n\n  function createDOM(inTagOrNode, inHTML, inAttrs) {\n    var dom = typeof inTagOrNode == 'string' ?\n        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);\n    dom.innerHTML = inHTML;\n    if (inAttrs) {\n      for (var n in inAttrs) {\n        dom.setAttribute(n, inAttrs[n]);\n      }\n    }\n    return dom;\n  }\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    elementDeclarations.push(arguments);\n  }\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.deliverDeclarations = function() {\n    scope.deliverDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    return elementDeclarations;\n  }\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n  // exports\n  scope.createDOM = createDOM;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// poor man's adapter for template.content on various platform scenarios\n(function(scope) {\n  scope.templateContent = scope.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  scope = scope || (window.Inspector = {});\n  \n  var inspector;\n\n  window.sinspect = function(inNode, inProxy) {\n    if (!inspector) {\n      inspector = window.open('', 'ShadowDOM Inspector', null, true);\n      inspector.document.write(inspectorHTML);\n      //inspector.document.close();\n      inspector.api = {\n        shadowize: shadowize\n      };\n    }\n    inspect(inNode || wrap(document.body), inProxy);\n  };\n\n  var inspectorHTML = [\n    '<!DOCTYPE html>',\n    '<html>',\n    '  <head>',\n    '    <title>ShadowDOM Inspector</title>',\n    '    <style>',\n    '      body {',\n    '      }',\n    '      pre {',\n    '        font: 9pt \"Courier New\", monospace;',\n    '        line-height: 1.5em;',\n    '      }',\n    '      tag {',\n    '        color: purple;',\n    '      }',\n    '      ul {',\n    '         margin: 0;',\n    '         padding: 0;',\n    '         list-style: none;',\n    '      }',\n    '      li {',\n    '         display: inline-block;',\n    '         background-color: #f1f1f1;',\n    '         padding: 4px 6px;',\n    '         border-radius: 4px;',\n    '         margin-right: 4px;',\n    '      }',\n    '    </style>',\n    '  </head>',\n    '  <body>',\n    '    <ul id=\"crumbs\">',\n    '    </ul>',\n    '    <div id=\"tree\"></div>',\n    '  </body>',\n    '</html>'\n  ].join('\\n');\n  \n  var crumbs = [];\n\n  var displayCrumbs = function() {\n    // alias our document\n    var d = inspector.document;\n    // get crumbbar\n    var cb = d.querySelector('#crumbs');\n    // clear crumbs\n    cb.textContent = '';\n    // build new crumbs\n    for (var i=0, c; c=crumbs[i]; i++) {\n      var a = d.createElement('a');\n      a.href = '#';\n      a.textContent = c.localName;\n      a.idx = i;\n      a.onclick = function(event) {\n        var c;\n        while (crumbs.length > this.idx) {\n          c = crumbs.pop();\n        }\n        inspect(c.shadow || c, c);\n        event.preventDefault();\n      };\n      cb.appendChild(d.createElement('li')).appendChild(a);\n    }\n  };\n\n  var inspect = function(inNode, inProxy) {\n    // alias our document\n    var d = inspector.document;\n    // reset list of drillable nodes\n    drillable = [];\n    // memoize our crumb proxy\n    var proxy = inProxy || inNode;\n    crumbs.push(proxy);\n    // update crumbs\n    displayCrumbs();\n    // reflect local tree\n    d.body.querySelector('#tree').innerHTML =\n        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';\n  };\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  var blacklisted = {STYLE:1, SCRIPT:1, \"#comment\": 1, TEMPLATE: 1};\n  var blacklist = function(inNode) {\n    return blacklisted[inNode.nodeName];\n  };\n\n  var output = function(inNode, inChildNodes, inIndent) {\n    if (blacklist(inNode)) {\n      return '';\n    }\n    var indent = inIndent || '';\n    if (inNode.localName || inNode.nodeType == 11) {\n      var name = inNode.localName || 'shadow-root';\n      //inChildNodes = ShadowDOM.localNodes(inNode);\n      var info = indent + describe(inNode);\n      // if only textNodes\n      // TODO(sjmiles): make correct for ShadowDOM\n      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {\n        info += catTextContent(inChildNodes);\n      } else*/ {\n        // TODO(sjmiles): native <shadow> has no reference to its projection\n        if (name == 'content' /*|| name == 'shadow'*/) {\n          inChildNodes = inNode.getDistributedNodes();\n        }\n        info += '<br/>';\n        var ind = indent + '&nbsp;&nbsp;';\n        forEach(inChildNodes, function(n) {\n          info += output(n, n.childNodes, ind);\n        });\n        info += indent;\n      }\n      if (!({br:1}[name])) {\n        info += '<tag>&lt;/' + name + '&gt;</tag>';\n        info += '<br/>';\n      }\n    } else {\n      var text = inNode.textContent.trim();\n      info = text ? indent + '\"' + text + '\"' + '<br/>' : '';\n    }\n    return info;\n  };\n\n  var catTextContent = function(inChildNodes) {\n    var info = '';\n    forEach(inChildNodes, function(n) {\n      info += n.textContent.trim();\n    });\n    return info;\n  };\n\n  var drillable = [];\n\n  var describe = function(inNode) {\n    var tag = '<tag>' + '&lt;';\n    var name = inNode.localName || 'shadow-root';\n    if (inNode.webkitShadowRoot || inNode.shadowRoot) {\n      tag += ' <button idx=\"' + drillable.length +\n        '\" onclick=\"api.shadowize.call(this)\">' + name + '</button>';\n      drillable.push(inNode);\n    } else {\n      tag += name || 'shadow-root';\n    }\n    if (inNode.attributes) {\n      forEach(inNode.attributes, function(a) {\n        tag += ' ' + a.name + (a.value ? '=\"' + a.value + '\"' : '');\n      });\n    }\n    tag += '&gt;'+ '</tag>';\n    return tag;\n  };\n\n  // remote api\n\n  shadowize = function() {\n    var idx = Number(this.attributes.idx.value);\n    //alert(idx);\n    var node = drillable[idx];\n    if (node) {\n      inspect(node.webkitShadowRoot || node.shadowRoot, node)\n    } else {\n      console.log(\"bad shadowize node\");\n      console.dir(this);\n    }\n  };\n  \n  // export\n  \n  scope.output = output;\n  \n})(window.Inspector);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl, keepAbsolute) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      var value = attr && attr.value;\n      var replacement;\n      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {\n        if (v === 'style') {\n          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);\n        } else {\n          replacement = resolveRelativeUrl(url, value);\n        }\n        attr.value = replacement;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url, keepAbsolute) {\n  // do not resolve '/' absolute urls\n  if (url && url[0] === '/') {\n    return url;\n  }\n  var u = new URL(url, baseUrl);\n  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = new URL(document.baseURI);\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root, u);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(sourceUrl, targetUrl) {\n  var source = sourceUrl.pathname;\n  var target = targetUrl.pathname;\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/') + targetUrl.search + targetUrl.hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.cache[redirectedUrl] = resource;\n        $p = $p.concat(this.pending[redirectedUrl]);\n      }\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        //if (!err) {\n          // If url was redirected, use the redirected location so paths are\n          // calculated relative to that.\n          this.onload(redirectedUrl || url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.pending[redirectedUrl] = null;\n      }\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : redirectedUrl;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    elt.import.__importParsed = true;\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script);\n  var b64 = 'data:text/javascript';\n  // base64 may be smaller, but does not handle unicode characters\n  // attempt base64 first, fall back to escaped text\n  try {\n    b64 += (';base64,' + btoa(scriptContent));\n  } catch(e) {\n    b64 += (';charset=utf-8,' + encodeURIComponent(scriptContent));\n  }\n  return b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      callback && callback();\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :\n      link.__importParsed;\n}\n\n// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded\n// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007\n// and should be removed when this bug is addressed.\nif (useNative) {\n  new MutationObserver(function(mxns) {\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\n      if (m.addedNodes) {\n        handleImports(m.addedNodes);\n      }\n    }\n  }).observe(document.head, {childList: true});\n\n  function handleImports(nodes) {\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n      if (isImport(n)) {\n        handleImport(n);  \n      }\n    }\n  }\n\n  function isImport(element) {\n    return element.localName === 'link' && element.rel === 'import';\n  }\n\n  function handleImport(element) {\n    var loaded = element.import;\n    if (loaded) {\n      markTargetLoaded({target: element});\n    } else {\n      element.addEventListener('load', markTargetLoaded);\n      element.addEventListener('error', markTargetLoaded);\n    }\n  }\n\n  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\nscope.whenReady = whenImportsReady;\n\n// deprecated\nscope.whenImportsReady = whenImportsReady;\n\n})(window.HTMLImports);\n"," /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(){\n\n// bootstrap\n\n// IE shim for CustomEvent\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, dictionary) {\n     var e = document.createEvent('HTMLEvents');\n     e.initEvent(inType,\n        dictionary.bubbles === false ? false : true,\n        dictionary.cancelable === false ? false : true,\n        dictionary.detail);\n     return e;\n  };\n}\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nHTMLImports.whenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  doc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};"," /*\r\nCopyright 2013 The Polymer Authors. All rights reserved.\r\nUse of this source code is governed by a BSD-style\r\nlicense that can be found in the LICENSE file.\r\n*/\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Implements `document.register`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// For consistent timing, use native custom elements only when not polyfilling\n// other key related web components features.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    name = name.toLowerCase();\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // choose async\n  var async = window.Platform && Platform.endOfMicrotask ? \n    Platform.endOfMicrotask :\n    setTimeout;\n  async(function() {\n    // set internal 'ready' flag, now document.registerElement will trigger \n    // synchronous upgrades\n    CustomElements.ready = true;\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n\n    // install upgrade hook if HTMLImports are available\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        CustomElements.parser.parse(elt.import);\n      }\n    }\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(inType, true, true);\n    return e;\n  };\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.cache = Object.create(null);\n    this.map = Object.create(null);\n    this.requests = 0;\n    this.regex = regex;\n  }\n  Loader.prototype = {\n\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n\n      // every call to process returns all the text this loader has ever received\n      var done = callback.bind(null, this.map);\n      this.fetch(matches, done);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback();\n      }\n\n      // wait for all subrequests to return\n      var done = function() {\n        if (--inflight === 0) {\n          callback();\n        }\n      };\n\n      // start fetching all subrequests\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        req = this.cache[url];\n        // if this url has already been requested, skip requesting it again\n        if (!req) {\n          req = this.xhr(url);\n          req.match = m;\n          this.cache[url] = req;\n        }\n        // wait for the request to process its subrequests\n        req.wait(done);\n      }\n    },\n    handleXhr: function(request) {\n      var match = request.match;\n      var url = match.url;\n\n      // handle errors with an empty string\n      var response = request.response || request.responseText || '';\n      this.map[url] = response;\n      this.fetch(this.extractUrls(response, url), request.resolve);\n    },\n    xhr: function(url) {\n      this.requests++;\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onerror = request.onload = this.handleXhr.bind(this, request);\n\n      // queue of tasks to run after XHR returns\n      request.pending = [];\n      request.resolve = function() {\n        var pending = request.pending;\n        for(var i = 0; i < pending.length; i++) {\n          pending[i]();\n        }\n        request.pending = null;\n      };\n\n      // if we have already resolved, pending is null, async call the callback\n      request.wait = function(fn) {\n        if (request.pending) {\n          request.pending.push(fn);\n        } else {\n          endOfMicrotask(fn);\n        }\n      };\n\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, url, callback) {\n    var text = style.textContent;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer, keep absolute url\n      intermediate = urlResolver.resolveCssText(map[url], url, true);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, base, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, base, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, base, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  Node.prototype.bindFinished = function() {};\n\n  function updateBindings(node, name, binding) {\n    var bindings = node.bindings_;\n    if (!bindings)\n      bindings = node.bindings_ = {};\n\n    if (bindings[name])\n      binding[name].close();\n\n    return bindings[name] = binding;\n  }\n\n  function returnBinding(node, name, binding) {\n    return binding;\n  }\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  var maybeUpdateBindings = returnBinding;\n\n  Object.defineProperty(Platform, 'enableBindingsReflection', {\n    get: function() {\n      return maybeUpdateBindings === updateBindings;\n    },\n    set: function(enable) {\n      maybeUpdateBindings = enable ? updateBindings : returnBinding;\n      return enable;\n    },\n    configurable: true\n  });\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    var observable = value;\n    updateText(this, observable.open(textBinding(this)));\n    return maybeUpdateBindings(this, name, observable);\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n\n    var observable = value;\n    updateAttribute(this, name, conditional,\n        observable.open(attributeBinding(this, name, conditional)));\n\n    return maybeUpdateBindings(this, name, observable);\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    return {\n      close: function() {\n        input.removeEventListener(eventType, eventHandler);\n        observable.close();\n      },\n\n      observable_: observable\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings_.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.observable_.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable, postEventFn);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    // Checkboxes may need to update bindings of other checkboxes.\n    return updateBindings(this, name, binding);\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateInput(this, 'value',\n                observable.open(inputBinding(this, 'value', sanitizeValue)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings_ &&\n        parentNode.bindings_.value) {\n      select = parentNode;\n      selectBinding = select.bindings_.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.observable_.setValue(select.value);\n      selectBinding.observable_.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateOption(this, observable.open(optionBinding(this)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name)));\n\n    // Option update events may need to access select bindings.\n    return updateBindings(this, name, binding);\n  }\n})(this);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue();\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n"]}
\ No newline at end of file
diff --git a/pkg/web_components/pubspec.yaml b/pkg/web_components/pubspec.yaml
index d0a19ee..cf4a1ee 100644
--- a/pkg/web_components/pubspec.yaml
+++ b/pkg/web_components/pubspec.yaml
@@ -1,5 +1,5 @@
 name: web_components
-version: 0.4.0
+version: 0.5.0
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: https://www.dartlang.org/polymer-dart/
 description: >
diff --git a/pkg/yaml/CHANGELOG.md b/pkg/yaml/CHANGELOG.md
index 94c8807..ee12bca 100644
--- a/pkg/yaml/CHANGELOG.md
+++ b/pkg/yaml/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 2.0.2
+
+* Fix an import in a test.
+
+## 2.0.1
+
+* Fix a few lingering references to the old `Span` class in documentation and
+  tests.
+
 ## 2.0.0
 
 * Switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan` class.
diff --git a/pkg/yaml/lib/src/null_span.dart b/pkg/yaml/lib/src/null_span.dart
index 1054df1..06b42f0 100644
--- a/pkg/yaml/lib/src/null_span.dart
+++ b/pkg/yaml/lib/src/null_span.dart
@@ -6,7 +6,7 @@
 
 import 'package:source_span/source_span.dart';
 
-/// A [Span] with no location information.
+/// A [SourceSpan] with no location information.
 ///
 /// This is used with [YamlMap.wrap] and [YamlList.wrap] to provide means of
 /// accessing a non-YAML map that behaves transparently like a map parsed from
diff --git a/pkg/yaml/lib/src/yaml_node.dart b/pkg/yaml/lib/src/yaml_node.dart
index 4f77060..6320156 100644
--- a/pkg/yaml/lib/src/yaml_node.dart
+++ b/pkg/yaml/lib/src/yaml_node.dart
@@ -117,7 +117,7 @@
   /// Any [SourceSpan]s returned by this list or its children will be dummies
   /// without useful location information. However, they will have a reasonable
   /// implementation of [SourceSpan.getLocationMessage]. If [sourceUrl] is
-  /// passed, it's used as the [Span.sourceUrl].
+  /// passed, it's used as the [SourceSpan.sourceUrl].
   ///
   /// [sourceUrl] may be either a [String], a [Uri], or `null`.
   factory YamlList.wrap(List dartList, {sourceUrl}) =>
@@ -144,7 +144,7 @@
   ///
   /// This scalar's [span] won't have useful location information. However, it
   /// will have a reasonable implementation of [SourceSpan.message]. If
-  /// [sourceUrl] is passed, it's used as the [Span.sourceUrl].
+  /// [sourceUrl] is passed, it's used as the [SourceSpan.sourceUrl].
   ///
   /// [sourceUrl] may be either a [String], a [Uri], or `null`.
   YamlScalar.wrap(this.value, {sourceUrl})
diff --git a/pkg/yaml/pubspec.yaml b/pkg/yaml/pubspec.yaml
index 470bc2f..afb8a0e 100644
--- a/pkg/yaml/pubspec.yaml
+++ b/pkg/yaml/pubspec.yaml
@@ -1,5 +1,5 @@
 name: yaml
-version: 2.0.0
+version: 2.0.2-dev
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: A parser for YAML.
diff --git a/pkg/yaml/test/yaml_node_wrapper_test.dart b/pkg/yaml/test/yaml_node_wrapper_test.dart
index 7d4faa6..2c41a6a 100644
--- a/pkg/yaml/test/yaml_node_wrapper_test.dart
+++ b/pkg/yaml/test/yaml_node_wrapper_test.dart
@@ -4,7 +4,7 @@
 
 library yaml.node_wrapper_test;
 
-import 'package:source_maps/source_maps.dart';
+import 'package:source_span/source_span.dart';
 import 'package:unittest/unittest.dart';
 import 'package:yaml/yaml.dart';
 
@@ -18,7 +18,7 @@
 
   test("YamlMap() with a sourceUrl", () {
     var map = new YamlMap(sourceUrl: "source");
-    expect(map.span, isNullSpan("source"));
+    expect(map.span, isNullSpan(Uri.parse("source")));
   });
 
   test("YamlList() with no sourceUrl", () {
@@ -30,7 +30,7 @@
 
   test("YamlList() with a sourceUrl", () {
     var list = new YamlList(sourceUrl: "source");
-    expect(list.span, isNullSpan("source"));
+    expect(list.span, isNullSpan(Uri.parse("source")));
   });
 
   test("YamlMap.wrap() with no sourceUrl", () {
@@ -79,10 +79,11 @@
       "scalar": "value"
     }, sourceUrl: "source");
 
-    expect(map.span, isNullSpan("source"));
-    expect(map["list"].span, isNullSpan("source"));
-    expect(map["map"].span, isNullSpan("source"));
-    expect(map.nodes["scalar"].span, isNullSpan("source"));
+    var source = Uri.parse("source");
+    expect(map.span, isNullSpan(source));
+    expect(map["list"].span, isNullSpan(source));
+    expect(map["map"].span, isNullSpan(source));
+    expect(map.nodes["scalar"].span, isNullSpan(source));
   });
 
   test("YamlList.wrap() with no sourceUrl", () {
@@ -134,7 +135,7 @@
     expect(list.nodes[2].span, isNullSpan(isNull));
   });
 
-  solo_test("re-wrapped objects equal one another", () {
+  test("re-wrapped objects equal one another", () {
     var list = new YamlList.wrap([
       [1, 2, 3],
       {"foo": "bar"}
@@ -150,10 +151,9 @@
 }
 
 Matcher isNullSpan(sourceUrl) => predicate((span) {
-  expect(span, new isInstanceOf<Span>());
+  expect(span, new isInstanceOf<SourceSpan>());
   expect(span.length, equals(0));
   expect(span.text, isEmpty);
-  expect(span.isIdentifier, isFalse);
   expect(span.start, equals(span.end));
   expect(span.start.offset, equals(0));
   expect(span.start.line, equals(0));
diff --git a/runtime/bin/builtin.cc b/runtime/bin/builtin.cc
index 596ea15..d153b11 100644
--- a/runtime/bin/builtin.cc
+++ b/runtime/bin/builtin.cc
@@ -87,7 +87,7 @@
 
 
 Dart_Handle Builtin::LoadLibrary(Dart_Handle url, BuiltinLibraryId id) {
-  Dart_Handle library = Dart_LoadLibrary(url, Source(id));
+  Dart_Handle library = Dart_LoadLibrary(url, Source(id), 0, 0);
   if (!Dart_IsError(library) && (builtin_libraries_[id].has_natives_)) {
     // Setup the native resolver for built in library functions.
     DART_CHECK_VALID(
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 8f6ea77..bc1b362 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -108,7 +108,7 @@
 }
 
 
-void _httpGet(Uri uri, loadCallback(List<int> data)) {
+void _httpGet(Uri uri, String libraryUri, loadCallback(List<int> data)) {
   var httpClient = new HttpClient();
   try {
     httpClient.getUrl(uri)
@@ -125,7 +125,7 @@
               if (response.statusCode != 200) {
                 var msg = 'Failure getting $uri: '
                           '${response.statusCode} ${response.reasonPhrase}';
-                _asyncLoadError(uri.toString(), msg);
+                _asyncLoadError(uri.toString(), libraryUri, msg);
               }
 
               List<int> data = builder.takeBytes();
@@ -133,14 +133,14 @@
               loadCallback(data);
             },
             onError: (error) {
-              _asyncLoadError(uri.toString(), error);
+              _asyncLoadError(uri.toString(), libraryUri, error);
             });
       })
       .catchError((error) {
-        _asyncLoadError(uri.toString(), error);
+        _asyncLoadError(uri.toString(), libraryUri, error);
       });
   } catch (error) {
-    _asyncLoadError(uri.toString(), error);
+    _asyncLoadError(uri.toString(), libraryUri, error);
   }
   // TODO(floitsch): remove this line. It's just here to push an event on the
   // event loop so that we invoke the scheduled microtasks. Also remove the
@@ -329,12 +329,17 @@
 }
 
 
-void _asyncLoadErrorCallback(uri, error) native "Builtin_AsyncLoadError";
+void _asyncLoadErrorCallback(uri, libraryUri, error)
+    native "Builtin_AsyncLoadError";
 
-void _asyncLoadError(uri, error) {
+void _asyncLoadError(uri, libraryUri, error) {
   assert(_numOutstandingLoadRequests > 0);
+  _logResolution("_asyncLoadError($uri), error: $error");
   _numOutstandingLoadRequests--;
-  _asyncLoadErrorCallback(uri, error);
+  _asyncLoadErrorCallback(uri, libraryUri, error);
+  if (_numOutstandingLoadRequests == 0) {
+    _signalDoneLoading();
+  }
 }
 
 
@@ -347,7 +352,7 @@
   _logResolution("_loadDataAsync($uri), "
                  "${_numOutstandingLoadRequests} requests outstanding");
   if (sourceUri.scheme == 'http') {
-    _httpGet(sourceUri, (data) {
+    _httpGet(sourceUri, null, (data) {
       _loadScript(uri, data);
     });
   } else {
@@ -356,7 +361,7 @@
       _loadScript(uri, data);
     },
     onError: (e) {
-      _asyncLoadError(uri, e);
+      _asyncLoadError(uri, null, e);
     });
   }
 }
@@ -388,7 +393,7 @@
   _logResolution("_loadLibrarySource($uri), "
                  "${_numOutstandingLoadRequests} requests outstanding");
   if (sourceUri.scheme == 'http') {
-    _httpGet(sourceUri, (data) {
+    _httpGet(sourceUri, libraryUri, (data) {
       var text = UTF8.decode(data);
       _loadLibrarySource(tag, uri, libraryUri, text);
     });
@@ -398,7 +403,7 @@
       _loadLibrarySource(tag, uri, libraryUri, text);
     },
     onError: (e) {
-      _asyncLoadError(uri, e);
+      _asyncLoadError(uri, libraryUri, e);
     });
   }
 }
diff --git a/runtime/bin/builtin_natives.cc b/runtime/bin/builtin_natives.cc
index 6068f4d..311955e2 100644
--- a/runtime/bin/builtin_natives.cc
+++ b/runtime/bin/builtin_natives.cc
@@ -66,7 +66,7 @@
   V(Logger_PrintString, 1)                                                     \
   V(Builtin_LoadScript, 2)                                                     \
   V(Builtin_LoadLibrarySource, 4)                                              \
-  V(Builtin_AsyncLoadError, 2)                                                 \
+  V(Builtin_AsyncLoadError, 3)                                                 \
   V(Builtin_DoneLoading, 0)                                                    \
 
 
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 3755dbc..8b16ab3 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -504,7 +504,7 @@
       return Dart_LoadSource(
           library,
           part_uri_obj,
-          Builtin::PartSource(Builtin::kIOLibrary, url_string));
+          Builtin::PartSource(Builtin::kIOLibrary, url_string), 0, 0);
     } else {
       ASSERT(tag == Dart_kImportTag);
       return NewError("Unable to import '%s' ", url_string);
@@ -711,10 +711,24 @@
 // Callback function, gets called from asynchronous script and library
 // reading code when there is an i/o error.
 void FUNCTION_NAME(Builtin_AsyncLoadError)(Dart_NativeArguments args) {
-  // Dart_Handle script_uri = Dart_GetNativeArgument(args, 0);
-  Dart_Handle error = Dart_GetNativeArgument(args, 1);
-  Dart_Handle res = Dart_NewUnhandledExceptionError(error);
-  Dart_PropagateError(res);
+  //  Dart_Handle source_uri = Dart_GetNativeArgument(args, 0);
+  Dart_Handle library_uri = Dart_GetNativeArgument(args, 1);
+  Dart_Handle error = Dart_GetNativeArgument(args, 2);
+
+  Dart_Handle library = Dart_LookupLibrary(library_uri);
+  // If a library with the given uri exists, give it a chance to handle
+  // the error. If the load requests stems from a deferred library load,
+  // an IO error is not fatal.
+  if (!Dart_IsError(library)) {
+    ASSERT(Dart_IsLibrary(library));
+    Dart_Handle res = Dart_LibraryHandleError(library, error);
+    if (Dart_IsNull(res)) {
+      return;
+    }
+  }
+  // The error was not handled above. Propagate an unhandled exception.
+  error = Dart_NewUnhandledExceptionError(error);
+  Dart_PropagateError(error);
 }
 
 
@@ -730,14 +744,19 @@
 
   Dart_Handle result;
   if (tag == Dart_kImportTag) {
-    result = Dart_LoadLibrary(resolved_script_uri, sourceText);
+    result = Dart_LoadLibrary(resolved_script_uri, sourceText, 0, 0);
   } else {
     ASSERT(tag == Dart_kSourceTag);
     Dart_Handle library = Dart_LookupLibrary(library_uri);
     DART_CHECK_VALID(library);
-    result = Dart_LoadSource(library, resolved_script_uri, sourceText);
+    result = Dart_LoadSource(library, resolved_script_uri, sourceText, 0, 0);
   }
-  if (Dart_IsError(result)) Dart_PropagateError(result);
+  if (Dart_IsError(result)) {
+    // TODO(hausner): If compilation/loading errors are supposed to
+    // be observable by the program, we need to mark the bad library
+    // with the error instead of propagating it.
+    Dart_PropagateError(result);
+  }
 }
 
 
@@ -746,6 +765,9 @@
 void FUNCTION_NAME(Builtin_DoneLoading)(Dart_NativeArguments args) {
   Dart_Handle res = Dart_FinalizeLoading(true);
   if (Dart_IsError(res)) {
+    // TODO(hausner): If compilation/loading errors are supposed to
+    // be observable by the program, we need to mark the bad library
+    // with the error instead of propagating it.
     Dart_PropagateError(res);
   }
 }
@@ -771,9 +793,9 @@
   // Load it according to the specified tag.
   if (tag == Dart_kImportTag) {
     // Return library object or an error string.
-    return Dart_LoadLibrary(url, source);
+    return Dart_LoadLibrary(url, source, 0, 0);
   } else if (tag == Dart_kSourceTag) {
-    return Dart_LoadSource(library, url, source);
+    return Dart_LoadSource(library, url, source, 0, 0);
   }
   return Dart_NewApiError("wrong tag");
 }
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc
index cc42e62..c58a758 100644
--- a/runtime/bin/eventhandler_win.cc
+++ b/runtime/bin/eventhandler_win.cc
@@ -898,7 +898,6 @@
   OverlappedBuffer::DisposeBuffer(buffer);
   // Update socket to support full socket API, after ConnectEx completed.
   setsockopt(socket(), SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0);
-  connected_ = true;
   Dart_Port p = port();
   if (p != ILLEGAL_PORT) {
     // If the port is set, we already listen for this socket in Dart.
@@ -925,7 +924,7 @@
 
 
 bool ClientSocket::IsClosed() {
-  return closed_;
+  return connected_ && closed_;
 }
 
 
@@ -1197,6 +1196,8 @@
   } else {
     client_socket->ConnectComplete(buffer);
   }
+  client_socket->mark_connected();
+  DeleteIfClosed(client_socket);
 }
 
 
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 8284c67..1a3f264 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -328,8 +328,8 @@
   if (libraryBuiltinId != Builtin::kInvalidLibrary) {
     // Special case for parting sources of a builtin library.
     if (tag == Dart_kSourceTag) {
-      return Dart_LoadSource(
-          library, url, Builtin::PartSource(libraryBuiltinId, url_string));
+      return Dart_LoadSource(library, url,
+          Builtin::PartSource(libraryBuiltinId, url_string), 0, 0);
     }
     ASSERT(tag == Dart_kImportTag);
     return DartUtils::NewError("Unable to import '%s' ", url_string);
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index abcb484..f12ca2a 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -608,7 +608,7 @@
   Dart_Handle io_lib = Dart_LookupLibrary(io_lib_url);
   CHECK_RESULT(io_lib);
   Dart_Handle platform_type = DartUtils::GetDartType(DartUtils::kIOLibURL,
-                                                     "Platform");
+                                                     "_Platform");
   CHECK_RESULT(platform_type);
   Dart_Handle script_name = DartUtils::NewString("_nativeScript");
   CHECK_RESULT(script_name);
@@ -701,7 +701,7 @@
   Dart_Handle io_lib = Dart_LookupLibrary(io_lib_url);
   CHECK_RESULT(io_lib);
   Dart_Handle platform_type = DartUtils::GetDartType(DartUtils::kIOLibURL,
-                                                     "Platform");
+                                                     "_Platform");
   CHECK_RESULT(platform_type);
   Dart_Handle script_name = DartUtils::NewString("_nativeScript");
   CHECK_RESULT(script_name);
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index 365e548..ab9c085 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -15,7 +15,6 @@
 
 #include "bin/fdutils.h"
 #include "bin/file.h"
-#include "bin/log.h"
 #include "bin/socket.h"
 
 #include "platform/signal_blocker.h"
@@ -60,13 +59,8 @@
   intptr_t fd;
   fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0));
   if (fd < 0) {
-    const int kBufferSize = 1024;
-    char error_message[kBufferSize];
-    strerror_r(errno, error_message, kBufferSize);
-    Log::PrintErr("Error Create: %s\n", error_message);
     return -1;
   }
-
   FDUtils::SetCloseOnExec(fd);
   return fd;
 }
@@ -163,10 +157,6 @@
   RawAddr raw;
   socklen_t size = sizeof(raw);
   if (NO_RETRY_EXPECTED(getsockname(fd, &raw.addr, &size))) {
-    const int kBufferSize = 1024;
-    char error_message[kBufferSize];
-    strerror_r(errno, error_message, kBufferSize);
-    Log::PrintErr("Error getsockname: %s\n", error_message);
     return 0;
   }
   return SocketAddress::GetAddrPort(&raw);
@@ -418,13 +408,7 @@
 
 void Socket::Close(intptr_t fd) {
   ASSERT(fd >= 0);
-  int err = TEMP_FAILURE_RETRY(close(fd));
-  if (err != 0) {
-    const int kBufferSize = 1024;
-    char error_message[kBufferSize];
-    strerror_r(errno, error_message, kBufferSize);
-    Log::PrintErr("%s\n", error_message);
-  }
+  VOID_TEMP_FAILURE_RETRY(close(fd));
 }
 
 
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index c883202..752c912 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -17,7 +17,6 @@
 
 #include "bin/fdutils.h"
 #include "bin/file.h"
-#include "bin/log.h"
 #include "bin/socket.h"
 #include "platform/signal_blocker.h"
 #include "vm/thread.h"
@@ -58,10 +57,6 @@
   fd = NO_RETRY_EXPECTED(
       socket(addr.ss.ss_family, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0));
   if (fd < 0) {
-    const int kBufferSize = 1024;
-    char error_buf[kBufferSize];
-    Log::PrintErr("Error Create: %s\n",
-                  strerror_r(errno, error_buf, kBufferSize));
     return -1;
   }
   return fd;
@@ -156,10 +151,6 @@
   RawAddr raw;
   socklen_t size = sizeof(raw);
   if (NO_RETRY_EXPECTED(getsockname(fd, &raw.addr, &size))) {
-    const int kBufferSize = 1024;
-    char error_buf[kBufferSize];
-    Log::PrintErr("Error getsockname: %s\n",
-                  strerror_r(errno, error_buf, kBufferSize));
     return 0;
   }
   return SocketAddress::GetAddrPort(&raw);
@@ -445,12 +436,7 @@
 
 void Socket::Close(intptr_t fd) {
   ASSERT(fd >= 0);
-  int err = TEMP_FAILURE_RETRY(close(fd));
-  if (err != 0) {
-    const int kBufferSize = 1024;
-    char error_buf[kBufferSize];
-    Log::PrintErr("%s\n", strerror_r(errno, error_buf, kBufferSize));
-  }
+  VOID_TEMP_FAILURE_RETRY(close(fd));
 }
 
 
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index d064356..ffe0aee 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -17,7 +17,6 @@
 
 #include "bin/fdutils.h"
 #include "bin/file.h"
-#include "bin/log.h"
 #include "bin/socket.h"
 
 #include "platform/signal_blocker.h"
@@ -62,13 +61,8 @@
   intptr_t fd;
   fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0));
   if (fd < 0) {
-    const int kBufferSize = 1024;
-    char error_message[kBufferSize];
-    strerror_r(errno, error_message, kBufferSize);
-    Log::PrintErr("Error Create: %s\n", error_message);
     return -1;
   }
-
   FDUtils::SetCloseOnExec(fd);
   return fd;
 }
@@ -165,10 +159,6 @@
   RawAddr raw;
   socklen_t size = sizeof(raw);
   if (NO_RETRY_EXPECTED(getsockname(fd, &raw.addr, &size))) {
-    const int kBufferSize = 1024;
-    char error_message[kBufferSize];
-    strerror_r(errno, error_message, kBufferSize);
-    Log::PrintErr("Error getsockname: %s\n", error_message);
     return 0;
   }
   return SocketAddress::GetAddrPort(&raw);
@@ -441,13 +431,7 @@
 
 void Socket::Close(intptr_t fd) {
   ASSERT(fd >= 0);
-  int err = TEMP_FAILURE_RETRY(close(fd));
-  if (err != 0) {
-    const int kBufferSize = 1024;
-    char error_message[kBufferSize];
-    strerror_r(errno, error_message, kBufferSize);
-    Log::PrintErr("%s\n", error_message);
-  }
+  VOID_TEMP_FAILURE_RETRY(close(fd));
 }
 
 
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 7dbc01a..0d7546e 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -273,6 +273,10 @@
   static const int NORMAL_TOKEN_BATCH_SIZE = 8;
   static const int LISTENING_TOKEN_BATCH_SIZE = 2;
 
+  static const Duration _RETRY_DURATION = const Duration(milliseconds: 250);
+  static const Duration _RETRY_DURATION_LOOPBACK =
+      const Duration(milliseconds: 25);
+
   // Use default Map so we keep order.
   static Map<int, _NativeSocket> _sockets = new Map<int, _NativeSocket>();
 
@@ -381,21 +385,25 @@
         .then((host) {
           if (host is _InternetAddress) return [host];
           return lookup(host)
-              .then((list) {
-                if (list.length == 0) {
+              .then((addresses) {
+                if (addresses.isEmpty) {
                   throw createError(response, "Failed host lookup: '$host'");
                 }
-                return list;
+                return addresses;
               });
         })
         .then((addresses) {
           assert(addresses is List);
           var completer = new Completer();
           var it = addresses.iterator;
-          void run(error) {
+          var error = null;
+          var connecting = new HashMap();
+          void connectNext() {
             if (!it.moveNext()) {
-              assert(error != null);
-              completer.completeError(error);
+              if (connecting.isEmpty) {
+                assert(error != null);
+                completer.completeError(error);
+              }
               return;
             }
             var address = it.current;
@@ -404,27 +412,45 @@
             var result = socket.nativeCreateConnect(address._in_addr, port);
             if (result is OSError) {
               // Keep first error, if present.
-              run(error != null ? error :
-                  createError(result, "Connection failed", address, port));
+              if (error == null) {
+                error = createError(result, "Connection failed", address, port);
+              }
+              connectNext();
             } else {
               socket.port;  // Query the local port, for error messages.
+              // Set up timer for when we should retry the next address (if any).
+              var duration = address.isLoopback ?
+                  _RETRY_DURATION_LOOPBACK :
+                  _RETRY_DURATION;
+              var timer = new Timer(duration, connectNext);
+              connecting[socket] = timer;
               // Setup handlers for receiving the first write event which
               // indicate that the socket is fully connected.
               socket.setHandlers(
                   write: () {
+                    timer.cancel();
                     socket.setListening(read: false, write: false);
                     completer.complete(socket);
+                    connecting.remove(socket);
+                    connecting.forEach((s, t) {
+                      t.cancel();
+                      s.close();
+                      s.setHandlers();
+                      s.setListening(read: false, write: false);
+                    });
                   },
                   error: (e) {
+                    timer.cancel();
                     socket.close();
                     // Keep first error, if present.
-                    run(error != null ? error : e);
-                  }
-              );
+                    if (error == null) error = e;
+                    connecting.remove(socket);
+                    if (connecting.isEmpty) connectNext();
+                  });
               socket.setListening(read: false, write: true);
             }
           }
-          run(null);
+          connectNext();
           return completer.future;
         });
   }
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index 4a9e280..baedfc0 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -106,7 +106,6 @@
   if (getsockname(socket_handle->socket(),
                   &raw.addr,
                   &size) == SOCKET_ERROR) {
-    Log::PrintErr("Error getsockname: %d\n", WSAGetLastError());
     return 0;
   }
   return SocketAddress::GetAddrPort(&raw);
@@ -557,7 +556,6 @@
   u_long iMode = blocking ? 0 : 1;
   int status = ioctlsocket(handle->socket(), FIONBIO, &iMode);
   if (status != NO_ERROR) {
-    Log::PrintErr("ioctlsocket FIONBIO failed: %d\n", status);
     return false;
   }
   return true;
diff --git a/runtime/bin/vmservice/client/bin/shell.dart b/runtime/bin/vmservice/client/bin/shell.dart
new file mode 100644
index 0000000..31067fa
--- /dev/null
+++ b/runtime/bin/vmservice/client/bin/shell.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shell;
+
+import 'package:observatory/service_io.dart';
+
+import 'dart:io';
+
+// Simple demo for service_io library. Connects to localhost on the default
+// port, picks the first isolate, reads requests from stdin, and prints
+// results to stdout. Example session:
+// <<< prefix /isolates/1071334835
+// >>> /classes/40
+// <<< {"type":"Class","id":"classes\/40","name":"num","user_name":"num",...
+// >>> /objects/0
+// >>> {"type":"Array","class":{"type":"@Class","id":"classes\/62",...
+
+void repl(VM vm, String prefix, String lastResult) {
+  print(lastResult);
+  // TODO(koda): Use 'get' when ServiceObjects have more informative toString.
+  vm.getString(prefix + stdin.readLineSync()).then((String result) {
+    repl(vm, prefix, result);
+  });
+}
+
+void main() {
+  String addr = 'ws://localhost:8181/ws';
+  new WebSocketVM(new WebSocketVMTarget(addr)).get('vm').then((VM vm) {
+    Isolate isolate = vm.isolates.first;
+    String prefix = '${isolate.link}';
+    repl(vm, prefix, 'prefix $prefix');
+  });
+}
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index e68be83..1a5de8e 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -978,10 +978,15 @@
       .idle {
         color: #0489c3;
         cursor: pointer;
+        text-decoration: none;
+      }
+      .idle:hover {
+        text-decoration: underline;
       }
       .busy {
         color: #aaa;
         cursor: wait;
+        text-decoration: none;
       }
     </style>
 
@@ -989,7 +994,12 @@
       <span class="busy">[{{ label }}]</span>
     </template>
     <template if="{{ !busy }}">
-      <span class="idle"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
+      <template if="{{ color == null }}">
+        <span class="idle"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
+      </template>
+      <template if="{{ color != null }}">
+        <span class="idle" style="color:{{ color }}"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
+      </template>
     </template>
   </template>
 </polymer-element>
@@ -1002,6 +1012,7 @@
 
 
 
+
 <polymer-element name="nav-bar" extends="observatory-element">
   <template>
     <style>
@@ -1556,27 +1567,27 @@
         background: rgba(255,255,255,0.5);
       }
     </style>
-    <template if="{{ event.eventType == 'IsolateInterrupted' }}">
+    <template if="{{ event.eventType == 'IsolateInterrupted' ||
+                     event.eventType == 'BreakpointReached' ||
+                     event.eventType == 'ExceptionThrown' }}">
       <div class="item">
         Isolate
         <a class="link" on-click="{{ goto }}" href="{{ event.isolate.link }}">{{ event.isolate.name }}</a>
         is paused
-        <a class="boxclose" on-click="{{ closeItem }}">×</a>
-      </div>
-    </template>
-    <template if="{{ event.eventType == 'BreakpointReached' }}">
-      <div class="item">
-        Isolate
-        <a class="link" on-click="{{ goto }}" href="{{ event.isolate.link }}">{{ event.isolate.name }}</a>
-        is paused at breakpoint {{ event.breakpoint['id'] }}
-        <a class="boxclose" on-click="{{ closeItem }}">×</a>
-      </div>
-    </template>
-    <template if="{{ event.eventType == 'ExceptionThrown' }}">
-      <div class="item">
-        Isolate
-        <a class="link" on-click="{{ goto }}" href="{{ event.isolate.link }}">{{ event.isolate.name }}</a>
-        is paused at exception
+        <template if="{{ event.breakpoint != null }}">
+          at breakpoint
+        </template>
+        <template if="{{ event.eventType == 'ExceptionThrown' }}">
+          at exception
+        </template>
+
+        <br><br>
+        <action-link callback="{{ resume }}" label="resume" color="white">
+        </action-link>
+        <action-link callback="{{ stepInto }}" label="step" color="white">
+        </action-link>
+        <action-link callback="{{ stepOver }}" label="step&nbsp;over" color="white"></action-link>
+        <action-link callback="{{ stepOut }}" label="step&nbsp;out" color="white"></action-link>
         <a class="boxclose" on-click="{{ closeItem }}">×</a>
       </div>
     </template>
@@ -3450,24 +3461,39 @@
       <content></content>
       <div class="sourceBox" style="height:{{height}}">
         <div class="sourceTable">
-          <template repeat="{{ line in lines }}">
-            <div class="sourceRow" id="{{ makeLineId(line.line) }}">
-              <template if="{{ line.hits == null }}">
-                <div class="hitsNone">{{ line.line }}</div>
-              </template>
-              <template if="{{ line.hits == 0 }}">
-                <div class="hitsNotExecuted">{{ line.line }}</div>
-              </template>
-              <template if="{{ line.hits > 0 }}">
-                <div class="hitsExecuted">{{ line.line }}</div>
-              </template>
-              <div class="sourceItem">&nbsp;</div>
-              <template if="{{ line.line == currentLine }}">
-                <div id="currentLine" class="sourceItemCurrent">{{line.text}}</div>
-              </template>
-              <template if="{{ line.line != currentLine }}">
-                <div class="sourceItem">{{line.text}}</div>
-              </template>
+          <template if="{{ linesReady }}">
+            <template repeat="{{ line in lines }}">
+              <div class="sourceRow" id="{{ makeLineId(line.line) }}">
+                <breakpoint-toggle line="{{ line }}"></breakpoint-toggle>
+
+                <div class="sourceItem">&nbsp;</div>
+
+                <template if="{{ line.hits == null ||
+                              line.hits < 0 }}">
+                  <div class="hitsNone">{{ line.line }}</div>
+                </template>
+                <template if="{{ line.hits == 0 }}">
+                  <div class="hitsNotExecuted">{{ line.line }}</div>
+                </template>
+                <template if="{{ line.hits > 0 }}">
+                  <div class="hitsExecuted">{{ line.line }}</div>
+                </template>
+
+                <div class="sourceItem">&nbsp;</div>
+
+                <template if="{{ line.line == currentLine }}">
+                  <div class="sourceItemCurrent">{{line.text}}</div>
+                </template>
+                <template if="{{ line.line != currentLine }}">
+                  <div class="sourceItem">{{line.text}}</div>
+                </template>
+              </div>
+            </template>
+          </template>
+
+          <template if="{{ !linesReady }}">
+            <div class="sourceRow">
+              <div class="sourceItem">loading...</div>
             </div>
           </template>
         </div>
@@ -3476,6 +3502,68 @@
   </template>
 </polymer-element>
 
+<polymer-element name="breakpoint-toggle" extends="observatory-element">
+  <template>
+    <style>
+      .emptyBreakpoint, .possibleBreakpoint, .busyBreakpoint, .unresolvedBreakpoint, .resolvedBreakpoint  {
+        display: table-cell;
+        vertical-align: top;
+        font: 400 14px consolas, courier, monospace;
+        min-width: 1em;
+        text-align: center;
+        cursor: pointer;
+      }
+      .possibleBreakpoint {
+        color: #e0e0e0;
+      }
+      .possibleBreakpoint:hover {
+        color: white;
+        background-color: #777;
+      }
+      .busyBreakpoint {
+        color: white;
+        background-color: black;
+        cursor: wait;
+      }
+      .unresolvedBreakpoint {
+        color: white;
+        background-color: #cac;
+      }
+      .resolvedBreakpoint {
+        color: white;
+        background-color: #e66;
+      }
+    </style>
+
+    <template if="{{ line.possibleBpt &amp;&amp; busy}}">
+      <div class="busyBreakpoint">B</div>
+    </template>
+
+    <template if="{{ line.bpt == null &amp;&amp; !line.possibleBpt }}">
+      <div class="emptyBreakpoint">&nbsp;</div>
+    </template>
+
+    <template if="{{ line.bpt == null &amp;&amp; line.possibleBpt &amp;&amp; !busy}}">
+      <div class="possibleBreakpoint">
+        <a on-click="{{ toggleBreakpoint }}">B</a>
+      </div>
+    </template>
+
+    <template if="{{ line.bpt != null &amp;&amp; !line.bpt['resolved'] &amp;&amp; !busy}}">
+      <div class="unresolvedBreakpoint">
+        <a on-click="{{ toggleBreakpoint }}">B</a>
+      </div>
+    </template>
+
+    <template if="{{ line.bpt != null &amp;&amp; line.bpt['resolved'] &amp;&amp; !busy}}">
+      <div class="resolvedBreakpoint">
+        <a on-click="{{ toggleBreakpoint }}">B</a>
+      </div>
+    </template>
+
+  </template>
+</polymer-element>
+
 
 
 
@@ -12751,10 +12839,10 @@
       <div class="flex-item-10-percent">
         <isolate-ref ref="{{ isolate }}"></isolate-ref>
       </div>
-      <div class="flex-item-20-percent">
+      <div class="flex-item-30-percent">
         <isolate-run-state isolate="{{ isolate }}"></isolate-run-state>
       </div>
-      <div class="flex-item-50-percent">
+      <div class="flex-item-40-percent">
         <isolate-location isolate="{{ isolate }}"></isolate-location>
       </div>
       <div class="flex-item-10-percent">
@@ -12779,6 +12867,10 @@
     <template if="{{ isolate.pauseEvent != null }}">
       <strong>paused</strong>
       <action-link callback="{{ resume }}" label="resume"></action-link>
+
+      <action-link callback="{{ stepInto }}" label="step"></action-link>
+      <action-link callback="{{ stepOver }}" label="step&nbsp;over"></action-link>
+      <action-link callback="{{ stepOut }}" label="step&nbsp;out"></action-link>
     </template>
 
     <template if="{{ isolate.running }}">
@@ -12803,27 +12895,25 @@
       <template if="{{ isolate.pauseEvent.eventType == 'IsolateCreated' }}">
         at isolate start
       </template>
+
       <template if="{{ isolate.pauseEvent.eventType == 'IsolateShutdown' }}">
         at isolate exit
       </template>
-      <template if="{{ isolate.pauseEvent.eventType == 'IsolateInterrupted' }}">
+
+      <template if="{{ isolate.pauseEvent.eventType == 'IsolateInterrupted' ||
+                       isolate.pauseEvent.eventType == 'BreakpointReached' ||
+                       isolate.pauseEvent.eventType == 'ExceptionThrown' }}">
+        <template if="{{ isolate.pauseEvent.breakpoint != null }}">
+          by breakpoint
+        </template>
+        <template if="{{ isolate.pauseEvent.eventType == 'ExceptionThrown' }}">
+          by exception
+        </template>
         at
         <function-ref ref="{{ isolate.topFrame['function'] }}">
         </function-ref>
         (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
       </template>
-      <template if="{{ isolate.pauseEvent.eventType == 'BreakpointReached' }}">
-        at breakpoint {{ isolate.pauseEvent.breakpoint['id'] }}
-        <function-ref ref="{{ isolate.topFrame['function'] }}">
-        </function-ref>
-        (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
-      </template>
-      <template if="{{ isolate.pauseEvent.eventType == 'ExceptionThrown' }}">
-        at exception
-        <function-ref ref="{{ isolate.topFrame['function'] }}">
-        </function-ref>
-        (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
-      </template>
     </template>
 
     <template if="{{ isolate.running }}">
@@ -13466,10 +13556,10 @@
     <div class="flex-row">
       <div class="flex-item-10-percent">
       </div>
-      <div class="flex-item-20-percent">
+      <div class="flex-item-30-percent">
         <isolate-run-state isolate="{{ isolate }}"></isolate-run-state>
       </div>
-      <div class="flex-item-60-percent">
+      <div class="flex-item-50-percent">
         <isolate-location isolate="{{ isolate }}"></isolate-location>
       </div>
       <div class="flex-item-10-percent">
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
index bee1169..a116f52 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
@@ -150,14 +150,14 @@
 var j=[]
 var i=[]
 processStatics(m)
-x.push([q,p,j,i,o,k,l,n])}})([["_foreign_helper","dart:_foreign_helper",,H,{
+x.push([q,p,j,i,o,k,l,n])}})([["","",,H,{
 "^":"",
 FK2:{
-"^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
+"^":"a;tT>"}}],["","",,J,{
 "^":"",
 x:function(a){return void 0},
-Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-aN:function(a){var z,y,x,w
+uM:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
+Dx:function(a){var z,y,x,w
 z=a[init.dispatchPropertyName]
 if(z==null)if($.Bv==null){H.XD()
 z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
@@ -165,7 +165,7 @@
 if(!0===y)return a
 x=Object.getPrototypeOf(a)
 if(y===x)return z.i
-if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.Gz(a)
+if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.Am(a)
 if(w==null){y=Object.getPrototypeOf(a)
 if(y==null||y===Object.prototype)return C.Sx
 else return C.vB}return w},
@@ -217,7 +217,8 @@
 iCW:{
 "^":"Ue1;"},
 kdQ:{
-"^":"Ue1;"},
+"^":"Ue1;",
+bu:[function(a){return String(a)},"$0","gAY",0,0,71]},
 Q:{
 "^":"Gv;",
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
@@ -238,7 +239,7 @@
 return!0}return!1},
 Nk:function(a,b){H.Ap(a,b)},
 ad:function(a,b){return H.VM(new H.U5(a,b),[null])},
-lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},30],
+lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"RS",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},30],
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(a,z.gl())},
 V1:function(a){this.sB(a,0)},
@@ -256,11 +257,11 @@
 return a[b]},
 aM:function(a,b,c){if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))
-if(b===c)return H.VM([],[H.Oq(a,0)])
-return H.VM(a.slice(b,c),[H.Oq(a,0)])},
+if(b===c)return H.VM([],[H.u3(a,0)])
+return H.VM(a.slice(b,c),[H.u3(a,0)])},
 Mu:function(a,b,c){H.xF(a,b,c)
 return H.c1(a,b,c,null)},
-gTw:function(a){if(a.length>0)return a[0]
+gne:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
@@ -272,12 +273,12 @@
 if(c<b||c>z)throw H.b(P.TE(c,b,z))
 H.tb(a,c,a,b,z-c)
 this.sB(a,z-(c-b))},
-ou:function(a,b){return H.Ck(a,b)},
+Vr:function(a,b){return H.CkK(a,b)},
 GT:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
 H.rd(a,b)},
 Jd:function(a){return this.GT(a,null)},
 XU:function(a,b,c){return H.TK(a,b,c,a.length)},
-kJ:function(a,b){return this.XU(a,b,0)},
+Mw:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){return H.lO(a,b,a.length-1)},
 cn:function(a,b){return this.Pk(a,b,null)},
 tg:function(a,b){var z
@@ -287,15 +288,15 @@
 gor:function(a){return a.length!==0},
 bu:[function(a){return P.WE(a,"[","]")},"$0","gAY",0,0,71],
 tt:function(a,b){var z
-if(b)return H.VM(a.slice(),[H.Oq(a,0)])
-else{z=H.VM(a.slice(),[H.Oq(a,0)])
+if(b)return H.VM(a.slice(),[H.u3(a,0)])
+else{z=H.VM(a.slice(),[H.u3(a,0)])
 z.fixed$length=init
 return z}},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z=P.Ls(null,null,null,H.Oq(a,0))
+zH:function(a){var z=P.Ls(null,null,null,H.u3(a,0))
 z.FV(0,a)
 return z},
-gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Oq(a,0)])},
+gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)])},
 giO:function(a){return H.eQ(a)},
 gB:function(a){return a.length},
 sB:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
@@ -328,7 +329,7 @@
 return 1}else return-1},
 gzP:function(a){return a===0?1/a<0:a<0},
 gG0:function(a){return isNaN(a)},
-gzr:function(a){return isFinite(a)},
+gx8:function(a){return isFinite(a)},
 JV:function(a,b){return a%b},
 Vy:function(a){return Math.abs(a)},
 yu:function(a){var z
@@ -399,13 +400,13 @@
 gbx:function(a){return C.yT},
 $isFK:true,
 static:{"^":"SAz,N6l"}},
-Xh:{
+imn:{
 "^":"P;",
 gbx:function(a){return C.yw},
 $isCP:true,
 $isFK:true,
 $isKN:true},
-VA:{
+VA7:{
 "^":"P;",
 gbx:function(a){return C.pa},
 $isCP:true,
@@ -446,13 +447,14 @@
 if(z>a.length)return!1
 return b===a.substring(c,z)},
 nC:function(a,b){return this.lV(a,b,0)},
-Nj:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
+Nj:function(a,b,c){var z
+if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(c==null)c=a.length
 if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
-if(b<0)throw H.b(P.N(b))
-if(typeof c!=="number")return H.s(c)
-if(b>c)throw H.b(P.N(b))
-if(c>a.length)throw H.b(P.N(c))
+z=J.Wx(b)
+if(z.C(b,0))throw H.b(P.N(b))
+if(z.D(b,c))throw H.b(P.N(b))
+if(J.xZ(c,a.length))throw H.b(P.N(c))
 return a.substring(b,c)},
 yn:function(a,b){return this.Nj(a,b,null)},
 hc:function(a){return a.toLowerCase()},
@@ -484,7 +486,7 @@
 if(!!z.$isVR){y=b.yk(a,c)
 return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
 return-1},
-kJ:function(a,b){return this.XU(a,b,0)},
+Mw:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){var z,y
 c=a.length
 z=b.length
@@ -540,7 +542,7 @@
 $asark:function(){return[P.KN]},
 $asIr:function(){return[P.KN]},
 $asWO:function(){return[P.KN]},
-$asQV:function(){return[P.KN]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+$asQV:function(){return[P.KN]}}}],["","",,H,{
 "^":"",
 dB:function(a,b){var z=a.vV(0,b)
 init.globalState.Xz.bL()
@@ -686,7 +688,7 @@
 self.dartPrint=self.dartPrint||function(b){return function(c){if(self.console&&self.console.log){self.console.log(c)}else{self.postMessage(b(c))}}}(H.wI)}},
 static:{wI:[function(a){return H.t0(P.EF(["command","print","msg",a],null,null))},"$1","UB",2,0,null,0]}},
 aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,C9<,lJ,CN,M2,mf,pa,ir",
+"^":"a;jO>,Gx,Lp,En<,EE<,um,PX,xF?,UF<,C9<,lJ,CN,M2,mf,pa,ir",
 oz:function(a,b){if(!this.um.n(0,a))return
 if(this.lJ.h(0,b)&&!this.UF)this.UF=!0
 this.PC()},
@@ -786,18 +788,18 @@
 O9:function(a,b){var z=this.Gx
 if(z.x4(0,a))throw H.b(P.FM("Registry: ports must be registered only once."))
 z.u(0,a,b)},
-PC:function(){if(this.Gx.X5-this.fW.X5>0||this.UF||!this.xF)init.globalState.iR.u(0,this.jO,this)
+PC:function(){if(this.Gx.X5-this.Lp.X5>0||this.UF||!this.xF)init.globalState.iR.u(0,this.jO,this)
 else this.Dm()},
 Dm:[function(){var z,y
 z=this.M2
 if(z!=null)z.V1(0)
-for(z=this.Gx,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Oq(y,0),H.Oq(y,1)]);y.G();)y.lo.pr()
+for(z=this.Gx,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.u3(y,0),H.u3(y,1)]);y.G();)y.lo.pr()
 z.V1(0)
-this.fW.V1(0)
+this.Lp.V1(0)
 init.globalState.iR.Rz(0,this.jO)
 this.ir.V1(0)
 z=this.CN
-if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.H4(z.lo,null)
+if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.H4(z.lo,null)
 this.CN=null}},"$0","gIm",0,0,17],
 $isaX:true},
 NY:{
@@ -806,11 +808,11 @@
 $isEH:true},
 cC:{
 "^":"a;Rk>,GL",
-mj:function(){var z=this.Rk
+MK:function(){var z=this.Rk
 if(z.av===z.eZ)return
 return z.AR()},
 xB:function(){var z,y,x
-z=this.mj()
+z=this.MK()
 if(z==null){if(init.globalState.Nr!=null&&init.globalState.iR.x4(0,init.globalState.Nr.jO)&&init.globalState.da===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
 y=init.globalState
 if(y.EF===!0&&y.iR.X5===0&&y.Xz.GL===0){y=y.rj
@@ -832,7 +834,7 @@
 Rm:{
 "^":"TpZ:17;a",
 $0:[function(){if(!this.a.xB())return
-P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
+P.cH(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;od*,i3,G1>",
@@ -921,7 +923,7 @@
 z=init.globalState.N0
 y=this.x6
 z.Gx.Rz(0,y)
-z.fW.Rz(0,y)
+z.Lp.Rz(0,y)
 z.PC()},
 Rf:function(a,b){if(this.KS)return
 this.wy(b)},
@@ -984,8 +986,8 @@
 if(!!z.$isZ0)return this.TI(a)
 if(!!z.$ispW)return this.DE(a)
 if(!!z.$ishq)return this.yf(a)
-return this.N1(a)},
-N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
+return this.YZ(a)},
+YZ:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
 ooy:{
 "^":"HU5;",
 Pq:function(a){return a},
@@ -1031,7 +1033,7 @@
 y=this.Ao++
 this.mR.u(0,a,y)
 x=J.RE(a)
-return["map",y,this.mE(J.qA(x.gvc(a))),this.mE(J.qA(x.gUQ(a)))]},
+return["map",y,this.mE(J.Nd(x.gvc(a))),this.mE(J.Nd(x.gUQ(a)))]},
 mE:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
@@ -1143,7 +1145,7 @@
 y=b.x6
 return z==null?y==null:z===y}return!1},
 $iskuS:true,
-$ishq:true}}],["_js_helper","dart:_js_helper",,H,{
+$ishq:true}}],["","",,H,{
 "^":"",
 Gp:function(a,b){var z
 if(b!=null){z=b.x
@@ -1159,7 +1161,7 @@
 eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},
-rj:[function(a){throw H.b(P.cD(a))},"$1","kk",2,0,3],
+rj:[function(a){throw H.b(P.cD(a,null,null))},"$1","kk",2,0,3],
 BU:function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.kk()
 if(typeof a!=="string")H.vh(P.u(a))
@@ -1223,14 +1225,14 @@
 z=[]
 z.$builtinTypeInfo=[P.KN]
 y=new H.a7(a,a.length,0,null)
-y.$builtinTypeInfo=[H.Oq(a,0)]
+y.$builtinTypeInfo=[H.u3(a,0)]
 for(;y.G();){x=y.lo
 if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
 if(x<=65535)z.push(x)
 else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
 z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},
 LY:function(a){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Oq(a,0)]);z.G();){y=z.lo
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.lo
 if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
 if(y<0)throw H.b(P.u(y))
 if(y>65535)return H.XZ(a)}return H.RF(a)},
@@ -1304,7 +1306,7 @@
 tM:[function(){return J.AG(this.dartException)},"$0","nR",0,0,null],
 vh:function(a){throw H.b(a)},
 Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=new H.Am(a)
+z=new H.Hk(a)
 if(a==null)return
 if(typeof a!=="object")return a
 if("dartException" in a)return z.$1(a.dartException)
@@ -1436,9 +1438,9 @@
 return e.apply(f(this),h)}}(d,z,y)}},
 Hf:function(a,b){var z,y,x,w,v,u,t,s
 z=H.bO()
-y=$.U9
+y=$.P4
 if(y==null){y=H.bd("receiver")
-$.U9=y}x=b.$stubName
+$.P4=y}x=b.$stubName
 w=b.length
 v=typeof dart_precompiled=="function"
 u=a[x]
@@ -1466,7 +1468,7 @@
 KT:function(a,b,c){return new H.GN(a,b,c,null)},
 Og:function(a,b){var z=a.name
 if(b==null||b.length===0)return new H.Hs(z)
-return new H.fw(z,b,null)},
+return new H.KEA(z,b,null)},
 G3:function(){return C.KZ},
 IL:function(a){return new H.cu(a,null)},
 VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
@@ -1476,7 +1478,7 @@
 IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},
 ip:function(a,b,c){var z=H.IM(a,b)
 return z==null?null:z[c]},
-Oq:function(a,b){var z=H.oX(a)
+u3:function(a,b){var z=H.oX(a)
 return z==null?null:z[b]},
 Ko:function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
@@ -1581,11 +1583,11 @@
 n=u[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},
 ml:function(a,b,c){return a.apply(b,c)},
-Pq:function(a){var z=$.NF
+CE:function(a){var z=$.NF
 return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
 wzi:function(a){return H.eQ(a)},
 fc:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
-Gz:function(a){var z,y,x,w,v,u
+Am:function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
 y=$.q4[z]
 if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
@@ -1613,13 +1615,13 @@
 return u.i}else return H.B1(a,x)},
 B1:function(a,b){var z,y
 z=Object.getPrototypeOf(a)
-y=J.Qu(b,z,null,null)
+y=J.uM(b,z,null,null)
 Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
 return b},
-Va:function(a){return J.Qu(a,!1,null,!!a.$isXj)},
+Va:function(a){return J.uM(a,!1,null,!!a.$isXj)},
 ow:function(a,b,c){var z=b.prototype
-if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},
+if(init.leafTags[a]===true)return J.uM(z,!1,null,!!z.$isXj)
+else return J.uM(z,c,null,null)},
 XD:function(){if(!0===$.Bv)return
 $.Bv=!0
 H.Z1()},
@@ -1703,8 +1705,8 @@
 z=this.tc
 for(y=0;y<z.length;++y){x=z[y]
 b.$2(x,this.TZ(x))}},
-gvc:function(a){return H.VM(new H.XR(this),[H.Oq(this,0)])},
-gUQ:function(a){return H.K1(this.tc,new H.hY(this),H.Oq(this,0),H.Oq(this,1))},
+gvc:function(a){return H.VM(new H.XR(this),[H.u3(this,0)])},
+gUQ:function(a){return H.fR(this.tc,new H.hY(this),H.u3(this,0),H.u3(this,1))},
 $isyN:true},
 hY:{
 "^":"TpZ:12;a",
@@ -1857,7 +1859,7 @@
 "^":"XS;K9",
 bu:[function(a){var z=this.K9
 return C.xB.gl0(z)?"Error":"Error: "+z},"$0","gAY",0,0,71]},
-Am:{
+Hk:{
 "^":"TpZ:12;a",
 $1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
 return a},
@@ -1911,7 +1913,7 @@
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
 return J.UN(y,H.eQ(this.jm))},
 $isv:true,
-static:{"^":"bf,U9",uj:function(a){return a.nw},HY:function(a){return a.cR},bO:function(){var z=$.bf
+static:{"^":"bf,P4",uj:function(a){return a.nw},HY:function(a){return a.cR},bO:function(){var z=$.bf
 if(z==null){z=H.bd("self")
 $.bf=z}return z},bd:function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
@@ -1985,7 +1987,7 @@
 if(y==null)throw H.b("no type for '"+H.d(z)+"'")
 return y},
 bu:[function(a){return this.oc},"$0","gAY",0,0,71]},
-fw:{
+KEA:{
 "^":"lbp;oc>,re,Et",
 za:function(){var z,y
 z=this.Et
@@ -1994,7 +1996,7 @@
 y=[init.allClasses[z]]
 if(0>=y.length)return H.e(y,0)
 if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
-for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)y.push(z.lo.za())
+for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)y.push(z.lo.za())
 this.Et=y
 return y},
 bu:[function(a){return H.d(this.oc)+"<"+J.xp(this.re,", ")+">"},"$0","gAY",0,0,71]},
@@ -2041,7 +2043,7 @@
 if(typeof a!=="string")H.vh(P.u(a))
 z=this.Ej.exec(a)
 if(z==null)return
-return H.Mr(this,z)},
+return H.yx(this,z)},
 zD:function(a){if(typeof a!=="string")H.vh(P.u(a))
 return this.Ej.test(a)},
 dd:function(a,b){return new H.KW(this,b)},
@@ -2050,7 +2052,7 @@
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
-return H.Mr(this,y)},
+return H.yx(this,y)},
 Bh:function(a,b){var z,y,x,w
 z=this.gAT()
 z.lastIndex=b
@@ -2061,7 +2063,7 @@
 if(w<0)return H.e(y,w)
 if(y[w]!=null)return
 C.Nm.sB(y,w)
-return H.Mr(this,y)},
+return H.yx(this,y)},
 wL:function(a,b,c){var z
 if(c>=0){z=J.q8(b)
 if(typeof z!=="number")return H.s(z)
@@ -2078,7 +2080,7 @@
 w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))}}},
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v,null,null))}}},
 EK:{
 "^":"a;zO,QK",
 t:function(a,b){var z=this.QK
@@ -2086,7 +2088,7 @@
 return z[b]},
 VO:function(a,b){},
 $isns:true,
-static:{Mr:function(a,b){var z=new H.EK(a,b)
+static:{yx:function(a,b){var z=new H.EK(a,b)
 z.VO(a,b)
 return z}}},
 KW:{
@@ -2115,10 +2117,10 @@
 "^":"a;M,f1,zO",
 t:function(a,b){if(!J.xC(b,0))H.vh(P.N(b))
 return this.zO},
-$isns:true}}],["action_link_element","package:observatory/src/elements/action_link.dart",,X,{
+$isns:true}}],["","",,X,{
 "^":"",
 hV:{
-"^":"LPc;IF,Qw,cw,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"LPc;IF,Qw,cw,oX,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gv8:function(a){return a.IF},
 sv8:function(a,b){a.IF=this.ct(a,C.S4,a.IF,b)},
 gFR:function(a){return a.Qw},
@@ -2127,6 +2129,8 @@
 sFR:function(a,b){a.Qw=this.ct(a,C.AV,a.Qw,b)},
 gph:function(a){return a.cw},
 sph:function(a,b){a.cw=this.ct(a,C.hf,a.cw,b)},
+gih:function(a){return a.oX},
+sih:function(a,b){a.oX=this.ct(a,C.mJ,a.oX,b)},
 F6:[function(a,b,c,d){var z=a.IF
 if(z===!0)return
 if(a.Qw!=null){a.IF=this.ct(a,C.S4,z,!0)
@@ -2138,8 +2142,9 @@
 a.IF=!1
 a.Qw=null
 a.cw="action"
+a.oX=null
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -2153,7 +2158,7 @@
 "^":"TpZ:74;a",
 $0:[function(){var z=this.a
 z.IF=J.Q5(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["app","package:observatory/app.dart",,G,{
+$isEH:true}}],["","",,G,{
 "^":"",
 m7:[function(a){var z
 N.QM("").To("Google Charts API loaded")
@@ -2163,7 +2168,7 @@
 DUC:function(a){var z=$.Vy().getItem(a)
 if(z==null)return
 return C.xr.kV(z)},
-FI:function(a){if(a==null)return P.Vu(null,null,null)
+n8:function(a){if(a==null)return P.Vu(null,null,null)
 return W.Kn("/crdptargets/"+P.jW(C.yD,a,C.xM,!1),null,null).ml(new G.KF()).OA(new G.XN())},
 dj:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"},
 o1:function(a,b){var z
@@ -2205,23 +2210,24 @@
 if(x!==0)return""+x+"m "+w+"s"
 return""+w+"s"},
 mL:{
-"^":"Pi;OJ,Ef,Z6,Eh,m2<,Eb,bn,Pv,cC,AP,fn",
+"^":"Pi;OJ,Ef,Z6,Eh,m2<,Eb,bn,Pv,pW,AP,fn",
 gwv:function(a){return this.Eh},
-swv:function(a,b){var z
+swv:function(a,b){var z,y
 if(J.xC(this.Eh,b))return
-z=this.Eh
-if(z!=null)J.tw(z)
-if(b!=null){N.QM("").To("Registering new VM callbacks")
+if(this.Eh!=null){J.Z8(this.pW)
+J.tw(this.Eh)}if(b!=null){N.QM("").To("Registering new VM callbacks")
 b.gEH().ml(this.gwn())
-J.d7(b).ml(this.gkq())
-z=b.gG2()
-H.VM(new P.Ik(z),[H.Oq(z,0)]).yI(this.gbf())
+z=J.RE(b)
+z.giG(b).ml(this.gkq())
+y=b.gG2()
+H.VM(new P.Ik(y),[H.u3(y,0)]).yI(this.gbf())
+J.Sr(z.gRk(b)).yI(this.gI2())
 z=b.gLi()
-H.VM(new P.Ik(z),[H.Oq(z,0)]).yI(this.gVG())}this.Eh=b},
+H.VM(new P.Ik(z),[H.u3(z,0)]).yI(this.gVG())}this.Eh=b},
 god:function(a){return this.Eb},
 sod:function(a,b){this.Eb=F.Wi(this,C.rB,this.Eb,b)},
-gvK:function(){return this.cC},
-svK:function(a){this.cC=F.Wi(this,C.c6,this.cC,a)},
+gvK:function(){return this.pW},
+svK:function(a){this.pW=F.Wi(this,C.c6,this.pW,a)},
 AQ:function(a){var z,y
 $.Kh=this
 z=this.OJ
@@ -2232,14 +2238,25 @@
 z=this.Z6
 z.ec=this
 y=H.VM(new W.RO(window,C.yf.Ph,!1),[null])
-H.VM(new W.Ov(0,y.DK,y.Ph,W.aF(z.gbQ()),y.Sg),[H.Oq(y,0)]).Zz()
+H.VM(new W.Ov(0,y.bi,y.Ph,W.aF(z.gbQ()),y.Sg),[H.u3(y,0)]).Zz()
 z.Cy()},
-x3:function(a){J.rA(this.cC,new G.xE(a,new G.cE()))},
+x3:function(a){J.r8(this.pW,new G.xE(a,new G.cE()))},
+Vu:[function(a){var z=J.RE(a)
+switch(z.gfG(a)){case"IsolateCreated":break
+case"IsolateShutdown":this.x3(z.god(a))
+break
+case"BreakpointResolved":z.god(a).Xb()
+break
+case"BreakpointReached":case"IsolateInterrupted":case"ExceptionThrown":this.x3(z.god(a))
+J.bi(this.pW,a)
+break
+default:N.QM("").YX("Unrecognized event type: "+H.d(z.gfG(a)))
+break}},"$1","gI2",2,0,84,85],
 yS:[function(a){this.Pv=a
-this.og("error/",null)},"$1","gbf",2,0,84,23],
+this.og("error/",null)},"$1","gbf",2,0,86,23],
 kI:[function(a){this.Pv=a
 if(J.xC(J.Iz(a),"NetworkException"))this.Z6.bo(0,"#/vm-connect/")
-else this.og("error/",null)},"$1","gVG",2,0,85,86],
+else this.og("error/",null)},"$1","gVG",2,0,87,88],
 og:function(a,b){var z,y,x,w,v
 z=b==null?P.Fl(null,null):P.Ms(b,C.xM)
 for(y=this.OJ,x=0;x<y.length;++x){w=y[x]
@@ -2264,43 +2281,43 @@
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.RG,w,x)
 w.$builtinTypeInfo=[null]
 this.nq(this,w)}this.Ef=x},
-mn:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gwn",2,0,87,88],
-aO:[function(a){if(!J.xC(this.Eh,a))return
+mn:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gwn",2,0,89,90],
+fu:[function(a){if(!J.xC(this.Eh,a))return
 this.swv(0,null)
-this.Z6.bo(0,"#/vm-connect/")},"$1","gkq",2,0,87,88],
+this.Z6.bo(0,"#/vm-connect/")},"$1","gkq",2,0,89,90],
 Ty:function(a){var z=this.m2.TY
-z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 this.swv(0,z)
 this.AQ(!1)},
-E0:function(a){var z=new U.dS(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),P.L5(null,null,null,P.qU,P.A5),0,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+E0:function(a){var z=new U.dS(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),P.L5(null,null,null,P.qU,P.A0),0,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.ZH()
 this.swv(0,z)
 this.AQ(!0)},
 static:{"^":"Kh<"}},
 cE:{
-"^":"TpZ:89;",
+"^":"TpZ:91;",
 $1:function(a){var z=J.RE(a)
 return J.xC(z.gfG(a),"IsolateInterrupted")||J.xC(z.gfG(a),"BreakpointReached")||J.xC(z.gfG(a),"ExceptionThrown")},
 $isEH:true},
 xE:{
 "^":"TpZ:12;a,b",
-$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,90,"call"],
+$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 Kf:{
-"^":"a;KJ",
-goH:function(){return this.KJ.nQ("getNumberOfColumns")},
-gvp:function(a){return this.KJ.nQ("getNumberOfRows")},
-Ai:function(){var z=this.KJ
+"^":"a;Yb",
+goH:function(){return this.Yb.nQ("getNumberOfColumns")},
+gvp:function(a){return this.Yb.nQ("getNumberOfRows")},
+Ai:function(){var z=this.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
 Id:function(a,b){var z=[]
 C.Nm.FV(z,J.kl(b,P.En()))
-this.KJ.V7("addRow",[H.VM(new P.GD(z),[null])])}},
+this.Yb.V7("addRow",[H.VM(new P.GD(z),[null])])}},
 qu:{
 "^":"a;vR,bG",
 W2:function(a){var z=P.jT(this.bG)
-this.vR.V7("draw",[a.KJ,z])}},
+this.vR.V7("draw",[a.Yb,z])}},
 yVe:{
 "^":"d3;",
 bo:function(a,b){var z
@@ -2319,7 +2336,7 @@
 if(y>1&&!J.xC(z[1],"")){if(1>=z.length)return H.e(z,1)
 x=z[1]}else x=null}else x=null
 this.ec.og(a,x)},
-WV:function(a,b,c){var z,y,x
+Cz:function(a,b,c){var z,y,x
 z=J.Vs(c).MW.getAttribute("href")
 y=J.RE(a)
 x=y.gpL(a)
@@ -2333,7 +2350,7 @@
 if(window.location.hash===""||window.location.hash==="#")z="#"+this.MP
 window.history.pushState(z,document.title,z)
 this.lU(window.location.hash)},
-y0:[function(a){this.lU(window.location.hash)},"$1","gbQ",2,0,91,13],
+y0:[function(a){this.lU(window.location.hash)},"$1","gbQ",2,0,93,13],
 wa:function(a){return"#"+H.d(a)}},
 OS:{
 "^":"Pi;i6>,yF<",
@@ -2351,7 +2368,7 @@
 VU:function(a){return!0}},
 mo:{
 "^":"TpZ:12;a",
-$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,92,"call"],
+$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,94,"call"],
 $isEH:true},
 Go5:{
 "^":"TpZ:12;",
@@ -2362,15 +2379,15 @@
 ci:function(){if(this.yF==null){var z=W.r3("class-tree",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 qY:function(a){a=J.ZZ(a,11)
-this.i6.Eh.cv(a).ml(new G.Za(this)).OA(new G.ha())},
+this.i6.Eh.cv(a).ml(new G.Za(this)).OA(new G.aY())},
 VU:function(a){return J.co(a,"class-tree/")},
 static:{"^":"rjk"}},
 Za:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a.yF
-if(z!=null)J.uM(z,a)},"$1",null,2,0,null,93,"call"],
+if(z!=null)J.Rp(z,a)},"$1",null,2,0,null,95,"call"],
 $isEH:true},
-ha:{
+aY:{
 "^":"TpZ:12;",
 $1:[function(a){N.QM("").YX("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
@@ -2402,29 +2419,29 @@
 while(!0){w=y.gB(z)
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
-y.u(z,x,U.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,94,"call"],
+y.u(z,x,L.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,96,"call"],
 $isEH:true},
 XN:{
 "^":"TpZ:12;",
 $1:[function(a){},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 nD:{
-"^":"d3;wu,jY>,TY,ro,fb,pt",
+"^":"d3;wu,bq>,TY,ro,fb,pt",
 BZ:function(){return"ws://"+H.d(window.location.host)+"/ws"},
 TP:function(a){var z=this.MG(a)
 if(z!=null)return z
-z=new U.Z5(0,!1,null,a)
+z=new L.Z5(0,!1,null,a)
 z.oc=a
 return z},
 MG:function(a){var z,y
 z={}
 z.a=null
-y=this.jY
-y.aN(y,new G.Un(z,a))
+y=this.bq
+y.aN(y,new G.La(z,a))
 return z.a},
 h:function(a,b){var z,y
 if(b.gA9()===!0)return
-z=this.jY
+z=this.bq
 if(z.tg(z,b))return
 z.h(0,b)
 this.XT()
@@ -2432,16 +2449,16 @@
 y=this.wu.IU+".history"
 $.Vy().setItem(y,C.xr.KP(z))},
 Rz:function(a,b){var z,y
-z=this.jY
+z=this.bq
 z.Rz(0,b)
 this.XT()
 this.XT()
 y=this.wu.IU+".history"
 $.Vy().setItem(y,C.xr.KP(z))},
-XT:function(){var z=this.jY
+XT:function(){var z=this.bq
 z.GT(z,new G.jQ())},
 UJ:function(){var z,y,x,w,v
-z=this.jY
+z=this.bq
 z.V1(z)
 y=G.DUC(this.wu.IU+".history")
 if(y==null)return
@@ -2450,19 +2467,19 @@
 while(!0){v=x.gB(y)
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
-x.u(y,w,U.K9(x.t(y,w)));++w}z.FV(0,y)
+x.u(y,w,L.K9(x.t(y,w)));++w}z.FV(0,y)
 this.XT()},
-XA:function(){this.UJ()
+Ff:function(){this.UJ()
 var z=this.TP(this.BZ())
 this.TY=z
 this.h(0,z)},
 static:{"^":"dI"}},
-Un:{
+La:{
 "^":"TpZ:12;a,b",
 $1:function(a){if(J.xC(a.gw8(),this.b)&&J.xC(a.gA9(),!1))this.a.a=a},
 $isEH:true},
 jQ:{
-"^":"TpZ:95;",
+"^":"TpZ:97;",
 $2:function(a,b){return J.FW(b.geX(),a.geX())},
 $isEH:true},
 Y2:{
@@ -2480,7 +2497,7 @@
 return this.yq},
 k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Pn,this.aZ,"visibility:hidden;")},
 $isY2:true},
-xK:{
+iY:{
 "^":"Pi;vp>,AP,fn",
 mA:function(a){var z,y
 z=this.vp
@@ -2492,7 +2509,7 @@
 z=this.vp
 y=J.U6(z)
 x=y.t(z,a)
-if(x.r8()===!0)y.oF(z,y.kJ(z,x)+1,J.Mx(x))
+if(x.r8()===!0)y.oF(z,y.Mw(z,x)+1,J.Mx(x))
 else this.FS(x)},
 FS:function(a){var z,y,x,w,v
 z=J.RE(a)
@@ -2502,9 +2519,9 @@
 z.soE(a,!1)
 z=this.vp
 w=J.U6(z)
-v=w.kJ(z,a)+1
+v=w.Mw(z,a)+1
 w.UZ(z,v,v+y)}},
-Kt:{
+Ktd:{
 "^":"a;ph>,xy<",
 static:{mb:[function(a){return a!=null?J.AG(a):"<null>"},"$1","ji",2,0,16]}},
 Ni:{
@@ -2520,17 +2537,17 @@
 F.Wi(this,C.JB,0,1)},
 eE:function(a,b){var z=this.vp
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.U8(z[a]),b)},
+return J.UQ(J.hI(z[a]),b)},
 PV:[function(a,b){var z=this.eE(a,this.pT)
-return J.FW(this.eE(b,this.pT),z)},"$2","gpPX",4,0,96],
-zF:[function(a,b){return J.FW(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","gCa",4,0,96],
+return J.FW(this.eE(b,this.pT),z)},"$2","gCS",4,0,98],
+zF:[function(a,b){return J.FW(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","glq",4,0,98],
 Jd:function(a){var z,y
 H.PA()
 $.xj=$.zIm
 new P.VV(null,null).wE(0)
 z=this.zz
-if(this.jV){y=this.gpPX()
-H.rd(z,y)}else{y=this.gCa()
+if(this.jV){y=this.gCS()
+H.rd(z,y)}else{y=this.glq()
 H.rd(z,y)}},
 Ai:function(){C.Nm.sB(this.vp,0)
 C.Nm.sB(this.zz,0)},
@@ -2540,7 +2557,7 @@
 Gu:function(a,b){var z,y
 z=this.vp
 if(a>=z.length)return H.e(z,a)
-y=J.UQ(J.U8(z[a]),b)
+y=J.UQ(J.hI(z[a]),b)
 z=this.oH
 if(b>=z.length)return H.e(z,b)
 return z[b].gxy().$1(y)},
@@ -2550,18 +2567,18 @@
 return J.ew(J.Yq(z[a]),"\u2003")}z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 z=J.Yq(z[a])
-return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,14,97]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
+return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,14,99]}}],["","",,E,{
 "^":"",
 Jz:[function(){var z,y,x,w,v
-z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.Zg,new E.ed(),C.ET,new E.wa(),C.BE,new E.Or(),C.WC,new E.YL(),C.hR,new E.wf(),C.S4,new E.Oa(),C.Ro,new E.emv(),C.hN,new E.Lbd(),C.AV,new E.QAa(),C.bV,new E.CvS(),C.C0,new E.edy(),C.eZ,new E.waE(),C.bk,new E.Ore(),C.lH,new E.YLa(),C.am,new E.wfa(),C.oE,new E.Oaa(),C.kG,new E.e0(),C.OI,new E.e1(),C.I9,new E.e2(),C.To,new E.e3(),C.XA,new E.e4(),C.i4,new E.e5(),C.qt,new E.e6(),C.p1,new E.e7(),C.yJ,new E.e8(),C.la,new E.e9(),C.yL,new E.e10(),C.bJ,new E.e11(),C.ox,new E.e12(),C.Je,new E.e13(),C.kI,new E.e14(),C.vY,new E.e15(),C.Rs,new E.e16(),C.Lw,new E.e17(),C.eR,new E.e18(),C.iE,new E.e19(),C.f4,new E.e20(),C.VK,new E.e21(),C.aH,new E.e22(),C.aK,new E.e23(),C.GP,new E.e24(),C.vs,new E.e25(),C.Gr,new E.e26(),C.TU,new E.e27(),C.Fe,new E.e28(),C.tP,new E.e29(),C.yh,new E.e30(),C.Zb,new E.e31(),C.u7,new E.e32(),C.p8,new E.e33(),C.qR,new E.e34(),C.ld,new E.e35(),C.ne,new E.e36(),C.B0,new E.e37(),C.r1,new E.e38(),C.mr,new E.e39(),C.Ek,new E.e40(),C.Pn,new E.e41(),C.YT,new E.e42(),C.h7,new E.e43(),C.R3,new E.e44(),C.WQ,new E.e45(),C.fV,new E.e46(),C.jU,new E.e47(),C.OO,new E.e48(),C.Mc,new E.e49(),C.FP,new E.e50(),C.kF,new E.e51(),C.UD,new E.e52(),C.Aq,new E.e53(),C.DS,new E.e54(),C.C9,new E.e55(),C.VF,new E.e56(),C.uU,new E.e57(),C.YJ,new E.e58(),C.eF,new E.e59(),C.oI,new E.e60(),C.ST,new E.e61(),C.QH,new E.e62(),C.qX,new E.e63(),C.rE,new E.e64(),C.nf,new E.e65(),C.EI,new E.e66(),C.JB,new E.e67(),C.RY,new E.e68(),C.d4,new E.e69(),C.cF,new E.e70(),C.SI,new E.e71(),C.zS,new E.e72(),C.YA,new E.e73(),C.Ge,new E.e74(),C.A7,new E.e75(),C.He,new E.e76(),C.im,new E.e77(),C.Ss,new E.e78(),C.k6,new E.e79(),C.oj,new E.e80(),C.PJ,new E.e81(),C.q2,new E.e82(),C.d2,new E.e83(),C.kN,new E.e84(),C.fn,new E.e85(),C.yB,new E.e86(),C.eJ,new E.e87(),C.iG,new E.e88(),C.Py,new E.e89(),C.pC,new E.e90(),C.uu,new E.e91(),C.qs,new E.e92(),C.XH,new E.e93(),C.tJ,new E.e94(),C.F8,new E.e95(),C.C1,new E.e96(),C.Nr,new E.e97(),C.nL,new E.e98(),C.a0,new E.e99(),C.Yg,new E.e100(),C.bR,new E.e101(),C.ai,new E.e102(),C.ob,new E.e103(),C.MY,new E.e104(),C.Iv,new E.e105(),C.Wg,new E.e106(),C.tD,new E.e107(),C.nZ,new E.e108(),C.Of,new E.e109(),C.Vl,new E.e110(),C.pY,new E.e111(),C.XL,new E.e112(),C.LA,new E.e113(),C.AT,new E.e114(),C.Lk,new E.e115(),C.dK,new E.e116(),C.xf,new E.e117(),C.rB,new E.e118(),C.bz,new E.e119(),C.Jx,new E.e120(),C.b5,new E.e121(),C.Lc,new E.e122(),C.hf,new E.e123(),C.uk,new E.e124(),C.Zi,new E.e125(),C.TN,new E.e126(),C.GI,new E.e127(),C.Wn,new E.e128(),C.ur,new E.e129(),C.VN,new E.e130(),C.EV,new E.e131(),C.VI,new E.e132(),C.eh,new E.e133(),C.SA,new E.e134(),C.kV,new E.e135(),C.vp,new E.e136(),C.cc,new E.e137(),C.DY,new E.e138(),C.Lx,new E.e139(),C.M3,new E.e140(),C.wT,new E.e141(),C.JK,new E.e142(),C.SR,new E.e143(),C.t6,new E.e144(),C.rP,new E.e145(),C.pX,new E.e146(),C.VD,new E.e147(),C.NN,new E.e148(),C.UX,new E.e149(),C.YS,new E.e150(),C.pu,new E.e151(),C.BJ,new E.e152(),C.c6,new E.e153(),C.td,new E.e154(),C.Gn,new E.e155(),C.zO,new E.e156(),C.vg,new E.e157(),C.YV,new E.e158(),C.If,new E.e159(),C.Ys,new E.e160(),C.zm,new E.e161(),C.nX,new E.e162(),C.xP,new E.e163(),C.XM,new E.e164(),C.Ic,new E.e165(),C.yG,new E.e166(),C.uI,new E.e167(),C.O9,new E.e168(),C.ba,new E.e169(),C.tW,new E.e170(),C.CG,new E.e171(),C.Wj,new E.e172(),C.vb,new E.e173(),C.UL,new E.e174(),C.AY,new E.e175(),C.QK,new E.e176(),C.AO,new E.e177(),C.Xd,new E.e178(),C.I7,new E.e179(),C.kY,new E.e180(),C.Wm,new E.e181(),C.GR,new E.e182(),C.KX,new E.e183(),C.ja,new E.e184(),C.Dj,new E.e185(),C.ir,new E.e186(),C.dx,new E.e187(),C.ni,new E.e188(),C.X2,new E.e189(),C.F3,new E.e190(),C.UY,new E.e191(),C.Aa,new E.e192(),C.nY,new E.e193(),C.tg,new E.e194(),C.HD,new E.e195(),C.iU,new E.e196(),C.eN,new E.e197(),C.ue,new E.e198(),C.nh,new E.e199(),C.L2,new E.e200(),C.Gs,new E.e201(),C.bE,new E.e202(),C.YD,new E.e203(),C.PX,new E.e204(),C.N8,new E.e205(),C.EA,new E.e206(),C.oW,new E.e207(),C.hd,new E.e208(),C.pH,new E.e209(),C.Ve,new E.e210(),C.jM,new E.e211(),C.W5,new E.e212(),C.uX,new E.e213(),C.nt,new E.e214(),C.IT,new E.e215(),C.li,new E.e216(),C.PM,new E.e217(),C.k5,new E.e218(),C.Nv,new E.e219(),C.Cw,new E.e220(),C.TW,new E.e221(),C.xS,new E.e222(),C.ft,new E.e223(),C.QF,new E.e224(),C.mi,new E.e225(),C.zz,new E.e226(),C.hO,new E.e227(),C.ei,new E.e228(),C.HK,new E.e229(),C.je,new E.e230(),C.Ef,new E.e231(),C.QL,new E.e232(),C.RH,new E.e233(),C.Q1,new E.e234(),C.ID,new E.e235(),C.z6,new E.e236(),C.bc,new E.e237(),C.kw,new E.e238(),C.ep,new E.e239(),C.J2,new E.e240(),C.zU,new E.e241(),C.OU,new E.e242(),C.bn,new E.e243(),C.mh,new E.e244(),C.Fh,new E.e245(),C.yv,new E.e246(),C.LP,new E.e247(),C.jh,new E.e248(),C.fj,new E.e249(),C.xw,new E.e250(),C.zn,new E.e251(),C.RJ,new E.e252(),C.Tc,new E.e253(),C.YE,new E.e254(),C.Uy,new E.e255()],null,null)
-y=P.EF([C.aP,new E.e256(),C.cg,new E.e257(),C.Zg,new E.e258(),C.S4,new E.e259(),C.AV,new E.e260(),C.bk,new E.e261(),C.lH,new E.e262(),C.am,new E.e263(),C.oE,new E.e264(),C.kG,new E.e265(),C.XA,new E.e266(),C.i4,new E.e267(),C.yL,new E.e268(),C.bJ,new E.e269(),C.kI,new E.e270(),C.vY,new E.e271(),C.VK,new E.e272(),C.aH,new E.e273(),C.vs,new E.e274(),C.Gr,new E.e275(),C.Fe,new E.e276(),C.tP,new E.e277(),C.yh,new E.e278(),C.Zb,new E.e279(),C.p8,new E.e280(),C.ld,new E.e281(),C.ne,new E.e282(),C.B0,new E.e283(),C.mr,new E.e284(),C.YT,new E.e285(),C.WQ,new E.e286(),C.jU,new E.e287(),C.OO,new E.e288(),C.Mc,new E.e289(),C.QH,new E.e290(),C.rE,new E.e291(),C.nf,new E.e292(),C.Ge,new E.e293(),C.A7,new E.e294(),C.He,new E.e295(),C.oj,new E.e296(),C.d2,new E.e297(),C.fn,new E.e298(),C.yB,new E.e299(),C.Py,new E.e300(),C.uu,new E.e301(),C.qs,new E.e302(),C.rB,new E.e303(),C.hf,new E.e304(),C.uk,new E.e305(),C.Zi,new E.e306(),C.TN,new E.e307(),C.ur,new E.e308(),C.EV,new E.e309(),C.eh,new E.e310(),C.SA,new E.e311(),C.kV,new E.e312(),C.vp,new E.e313(),C.SR,new E.e314(),C.t6,new E.e315(),C.UX,new E.e316(),C.YS,new E.e317(),C.c6,new E.e318(),C.td,new E.e319(),C.zO,new E.e320(),C.YV,new E.e321(),C.If,new E.e322(),C.Ys,new E.e323(),C.nX,new E.e324(),C.XM,new E.e325(),C.Ic,new E.e326(),C.O9,new E.e327(),C.tW,new E.e328(),C.Wj,new E.e329(),C.vb,new E.e330(),C.QK,new E.e331(),C.Xd,new E.e332(),C.kY,new E.e333(),C.GR,new E.e334(),C.KX,new E.e335(),C.ja,new E.e336(),C.Dj,new E.e337(),C.X2,new E.e338(),C.UY,new E.e339(),C.Aa,new E.e340(),C.nY,new E.e341(),C.tg,new E.e342(),C.HD,new E.e343(),C.iU,new E.e344(),C.eN,new E.e345(),C.Gs,new E.e346(),C.bE,new E.e347(),C.YD,new E.e348(),C.PX,new E.e349(),C.pH,new E.e350(),C.Ve,new E.e351(),C.jM,new E.e352(),C.uX,new E.e353(),C.nt,new E.e354(),C.IT,new E.e355(),C.PM,new E.e356(),C.Nv,new E.e357(),C.Cw,new E.e358(),C.TW,new E.e359(),C.ft,new E.e360(),C.mi,new E.e361(),C.zz,new E.e362(),C.z6,new E.e363(),C.kw,new E.e364(),C.zU,new E.e365(),C.OU,new E.e366(),C.RJ,new E.e367(),C.YE,new E.e368()],null,null)
-x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.ou,C.Mt,C.oT,C.il,C.jR,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.Qb,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.MI,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.qZ,C.il,C.Zj,C.Mt,C.he,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.Jf,C.il,C.EZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.l4,C.ms,C.Mt,C.FA,C.Mt,C.Qt,C.Mt,C.a8,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.qJ,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.X8,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.bC,C.Mt,C.ws,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.l4,C.al,C.il],null,null)
-w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.Qp,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,C.CM,C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.Qp,C.B0,C.b6,C.r1,C.nP,C.mr,C.HE],null,null),C.KO,P.EF([C.yh,C.zd],null,null),C.wk,P.EF([C.AV,C.fr,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.ah],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.Qb,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.QK,C.Yo],null,null),C.te,P.EF([C.nf,C.wR],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.mM],null,null),C.Wz,C.CM,C.MI,P.EF([C.fn,C.fz,C.XM,C.Tt,C.tg,C.DC],null,null),C.pF,C.CM,C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.qZ,C.CM,C.Zj,P.EF([C.oj,C.GT],null,null),C.he,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.Fk],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,C.CM,C.oG,P.EF([C.jU,C.bw],null,null),C.Jf,C.CM,C.EZ,P.EF([C.vp,C.o0],null,null),C.FG,C.CM,C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,C.CM,C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.oV,C.vb,C.Mq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bB,C.zz,C.lS],null,null),C.UJ,C.CM,C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.hr,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.ZQ],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.p4],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.p4],null,null),C.vw,P.EF([C.uk,C.p4,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Ce],null,null),C.NW,C.CM,C.ms,P.EF([C.cg,C.ll,C.uk,C.p4,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.xD,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.p4],null,null),C.Dl,P.EF([C.VK,C.Od],null,null),C.l4,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.ON,P.EF([C.kI,C.JM,C.vY,C.ZS,C.Rs,C.EW,C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.A7,C.SD,C.SA,C.KI,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS,C.IT,C.NL,C.li,C.Tz],null,null),C.Sb,P.EF([C.tW,C.kH,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.rZ],null,null),C.il,P.EF([C.uu,C.yY,C.kY,C.TO,C.Wm,C.QW],null,null),C.X8,P.EF([C.Zg,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Ud,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.rE,C.KS],null,null),C.vu,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.ft,C.u3],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.Ul,C.RJ,C.BP],null,null)],null,null)
-v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.Zg,"args",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.I9,"closeItem",C.To,"closing",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.kI,"currentLine",C.vY,"currentPos",C.Rs,"currentPosChanged",C.Lw,"deleteVm",C.eR,"deoptimizations",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.WQ,"field",C.fV,"fields",C.jU,"file",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.Ge,"hashLinkWorkaround",C.A7,"height",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.tJ,"isBool",C.F8,"isChromeTarget",C.C1,"isComment",C.Nr,"isConst",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.MY,"isInlinable",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.Vl,"isOptimizable",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.AT,"isStatic",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.JK,"makeLineId",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.YV,"owningClass",C.If,"owningLibrary",C.Ys,"pad",C.zm,"padding",C.nX,"parent",C.xP,"parseInt",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.kY,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.IT,"startPos",C.li,"startPosChanged",C.PM,"status",C.k5,"subClasses",C.Nv,"subclass",C.Cw,"superClass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.ft,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.QL,"toString",C.RH,"toStringAsFixed",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.OU,"unoptimizedCode",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.yv,"usageCounter",C.LP,"used",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),!1))
+z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.Zg,new E.ed(),C.ET,new E.wa(),C.BE,new E.Or(),C.WC,new E.YL(),C.hR,new E.wf(),C.S4,new E.Oa(),C.Ro,new E.emv(),C.hN,new E.Lbd(),C.AV,new E.QAa(),C.bV,new E.CvS(),C.C0,new E.edy(),C.eZ,new E.waE(),C.bk,new E.Ore(),C.lH,new E.YLa(),C.am,new E.wfa(),C.oE,new E.Oaa(),C.kG,new E.e0(),C.OI,new E.e1(),C.I9,new E.e2(),C.To,new E.e3(),C.XA,new E.e4(),C.i4,new E.e5(),C.mJ,new E.e6(),C.qt,new E.e7(),C.p1,new E.e8(),C.yJ,new E.e9(),C.la,new E.e10(),C.yL,new E.e11(),C.bJ,new E.e12(),C.ox,new E.e13(),C.Je,new E.e14(),C.kI,new E.e15(),C.vY,new E.e16(),C.Rs,new E.e17(),C.Lw,new E.e18(),C.eR,new E.e19(),C.iE,new E.e20(),C.f4,new E.e21(),C.VK,new E.e22(),C.aH,new E.e23(),C.aK,new E.e24(),C.GP,new E.e25(),C.vs,new E.e26(),C.Gr,new E.e27(),C.TU,new E.e28(),C.Fe,new E.e29(),C.tP,new E.e30(),C.yh,new E.e31(),C.Zb,new E.e32(),C.u7,new E.e33(),C.p8,new E.e34(),C.qR,new E.e35(),C.ld,new E.e36(),C.ne,new E.e37(),C.B0,new E.e38(),C.r1,new E.e39(),C.mr,new E.e40(),C.Ek,new E.e41(),C.Pn,new E.e42(),C.YT,new E.e43(),C.h7,new E.e44(),C.R3,new E.e45(),C.WQ,new E.e46(),C.fV,new E.e47(),C.jU,new E.e48(),C.OO,new E.e49(),C.Mc,new E.e50(),C.FP,new E.e51(),C.kF,new E.e52(),C.UD,new E.e53(),C.Aq,new E.e54(),C.DS,new E.e55(),C.C9,new E.e56(),C.VF,new E.e57(),C.uU,new E.e58(),C.YJ,new E.e59(),C.eF,new E.e60(),C.oI,new E.e61(),C.ST,new E.e62(),C.QH,new E.e63(),C.qX,new E.e64(),C.rE,new E.e65(),C.nf,new E.e66(),C.EI,new E.e67(),C.JB,new E.e68(),C.RY,new E.e69(),C.d4,new E.e70(),C.cF,new E.e71(),C.SI,new E.e72(),C.zS,new E.e73(),C.YA,new E.e74(),C.Ge,new E.e75(),C.A7,new E.e76(),C.He,new E.e77(),C.im,new E.e78(),C.Ss,new E.e79(),C.k6,new E.e80(),C.oj,new E.e81(),C.PJ,new E.e82(),C.q2,new E.e83(),C.d2,new E.e84(),C.kN,new E.e85(),C.fn,new E.e86(),C.yB,new E.e87(),C.eJ,new E.e88(),C.iG,new E.e89(),C.Py,new E.e90(),C.pC,new E.e91(),C.uu,new E.e92(),C.qs,new E.e93(),C.XH,new E.e94(),C.tJ,new E.e95(),C.F8,new E.e96(),C.C1,new E.e97(),C.Nr,new E.e98(),C.nL,new E.e99(),C.a0,new E.e100(),C.Yg,new E.e101(),C.bR,new E.e102(),C.ai,new E.e103(),C.ob,new E.e104(),C.MY,new E.e105(),C.Iv,new E.e106(),C.Wg,new E.e107(),C.tD,new E.e108(),C.nZ,new E.e109(),C.Of,new E.e110(),C.Vl,new E.e111(),C.pY,new E.e112(),C.XL,new E.e113(),C.LA,new E.e114(),C.AT,new E.e115(),C.Lk,new E.e116(),C.dK,new E.e117(),C.xf,new E.e118(),C.rB,new E.e119(),C.bz,new E.e120(),C.Jx,new E.e121(),C.b5,new E.e122(),C.Lc,new E.e123(),C.hf,new E.e124(),C.uk,new E.e125(),C.Zi,new E.e126(),C.TN,new E.e127(),C.GI,new E.e128(),C.Wn,new E.e129(),C.ur,new E.e130(),C.VN,new E.e131(),C.EV,new E.e132(),C.VI,new E.e133(),C.eh,new E.e134(),C.SA,new E.e135(),C.uG,new E.e136(),C.kV,new E.e137(),C.vp,new E.e138(),C.cc,new E.e139(),C.DY,new E.e140(),C.Lx,new E.e141(),C.M3,new E.e142(),C.wT,new E.e143(),C.JK,new E.e144(),C.SR,new E.e145(),C.t6,new E.e146(),C.rP,new E.e147(),C.pX,new E.e148(),C.VD,new E.e149(),C.NN,new E.e150(),C.UX,new E.e151(),C.YS,new E.e152(),C.pu,new E.e153(),C.BJ,new E.e154(),C.c6,new E.e155(),C.td,new E.e156(),C.Gn,new E.e157(),C.zO,new E.e158(),C.vg,new E.e159(),C.YV,new E.e160(),C.If,new E.e161(),C.Ys,new E.e162(),C.zm,new E.e163(),C.nX,new E.e164(),C.xP,new E.e165(),C.XM,new E.e166(),C.Ic,new E.e167(),C.yG,new E.e168(),C.uI,new E.e169(),C.O9,new E.e170(),C.ba,new E.e171(),C.tW,new E.e172(),C.CG,new E.e173(),C.Jf,new E.e174(),C.Wj,new E.e175(),C.vb,new E.e176(),C.UL,new E.e177(),C.AY,new E.e178(),C.QK,new E.e179(),C.AO,new E.e180(),C.Xd,new E.e181(),C.I7,new E.e182(),C.kY,new E.e183(),C.Wm,new E.e184(),C.GR,new E.e185(),C.KX,new E.e186(),C.ja,new E.e187(),C.Dj,new E.e188(),C.ir,new E.e189(),C.dx,new E.e190(),C.ni,new E.e191(),C.X2,new E.e192(),C.F3,new E.e193(),C.UY,new E.e194(),C.Aa,new E.e195(),C.nY,new E.e196(),C.tg,new E.e197(),C.HD,new E.e198(),C.iU,new E.e199(),C.eN,new E.e200(),C.ue,new E.e201(),C.nh,new E.e202(),C.L2,new E.e203(),C.Gs,new E.e204(),C.bE,new E.e205(),C.YD,new E.e206(),C.PX,new E.e207(),C.N8,new E.e208(),C.EA,new E.e209(),C.oW,new E.e210(),C.hd,new E.e211(),C.pH,new E.e212(),C.Ve,new E.e213(),C.jM,new E.e214(),C.W5,new E.e215(),C.uX,new E.e216(),C.nt,new E.e217(),C.IT,new E.e218(),C.li,new E.e219(),C.PM,new E.e220(),C.ks,new E.e221(),C.Om,new E.e222(),C.iC,new E.e223(),C.k5,new E.e224(),C.Nv,new E.e225(),C.Cw,new E.e226(),C.TW,new E.e227(),C.xS,new E.e228(),C.ft,new E.e229(),C.QF,new E.e230(),C.mi,new E.e231(),C.zz,new E.e232(),C.hO,new E.e233(),C.ei,new E.e234(),C.HK,new E.e235(),C.je,new E.e236(),C.Ef,new E.e237(),C.QL,new E.e238(),C.RH,new E.e239(),C.SP,new E.e240(),C.Q1,new E.e241(),C.ID,new E.e242(),C.z6,new E.e243(),C.bc,new E.e244(),C.kw,new E.e245(),C.ep,new E.e246(),C.J2,new E.e247(),C.zU,new E.e248(),C.OU,new E.e249(),C.bn,new E.e250(),C.mh,new E.e251(),C.Fh,new E.e252(),C.yv,new E.e253(),C.LP,new E.e254(),C.jh,new E.e255(),C.fj,new E.e256(),C.xw,new E.e257(),C.zn,new E.e258(),C.RJ,new E.e259(),C.Tc,new E.e260(),C.YE,new E.e261(),C.Uy,new E.e262()],null,null)
+y=P.EF([C.aP,new E.e263(),C.cg,new E.e264(),C.Zg,new E.e265(),C.S4,new E.e266(),C.AV,new E.e267(),C.bk,new E.e268(),C.lH,new E.e269(),C.am,new E.e270(),C.oE,new E.e271(),C.kG,new E.e272(),C.XA,new E.e273(),C.i4,new E.e274(),C.mJ,new E.e275(),C.yL,new E.e276(),C.bJ,new E.e277(),C.kI,new E.e278(),C.vY,new E.e279(),C.VK,new E.e280(),C.aH,new E.e281(),C.vs,new E.e282(),C.Gr,new E.e283(),C.Fe,new E.e284(),C.tP,new E.e285(),C.yh,new E.e286(),C.Zb,new E.e287(),C.p8,new E.e288(),C.ld,new E.e289(),C.ne,new E.e290(),C.B0,new E.e291(),C.mr,new E.e292(),C.YT,new E.e293(),C.WQ,new E.e294(),C.jU,new E.e295(),C.OO,new E.e296(),C.Mc,new E.e297(),C.QH,new E.e298(),C.rE,new E.e299(),C.nf,new E.e300(),C.Ge,new E.e301(),C.A7,new E.e302(),C.He,new E.e303(),C.oj,new E.e304(),C.d2,new E.e305(),C.fn,new E.e306(),C.yB,new E.e307(),C.Py,new E.e308(),C.uu,new E.e309(),C.qs,new E.e310(),C.rB,new E.e311(),C.hf,new E.e312(),C.uk,new E.e313(),C.Zi,new E.e314(),C.TN,new E.e315(),C.ur,new E.e316(),C.EV,new E.e317(),C.VI,new E.e318(),C.eh,new E.e319(),C.SA,new E.e320(),C.uG,new E.e321(),C.kV,new E.e322(),C.vp,new E.e323(),C.SR,new E.e324(),C.t6,new E.e325(),C.UX,new E.e326(),C.YS,new E.e327(),C.c6,new E.e328(),C.td,new E.e329(),C.zO,new E.e330(),C.YV,new E.e331(),C.If,new E.e332(),C.Ys,new E.e333(),C.nX,new E.e334(),C.XM,new E.e335(),C.Ic,new E.e336(),C.O9,new E.e337(),C.tW,new E.e338(),C.Wj,new E.e339(),C.vb,new E.e340(),C.QK,new E.e341(),C.Xd,new E.e342(),C.kY,new E.e343(),C.GR,new E.e344(),C.KX,new E.e345(),C.ja,new E.e346(),C.Dj,new E.e347(),C.X2,new E.e348(),C.UY,new E.e349(),C.Aa,new E.e350(),C.nY,new E.e351(),C.tg,new E.e352(),C.HD,new E.e353(),C.iU,new E.e354(),C.eN,new E.e355(),C.Gs,new E.e356(),C.bE,new E.e357(),C.YD,new E.e358(),C.PX,new E.e359(),C.pH,new E.e360(),C.Ve,new E.e361(),C.jM,new E.e362(),C.uX,new E.e363(),C.nt,new E.e364(),C.IT,new E.e365(),C.PM,new E.e366(),C.ks,new E.e367(),C.Om,new E.e368(),C.iC,new E.e369(),C.Nv,new E.e370(),C.Cw,new E.e371(),C.TW,new E.e372(),C.ft,new E.e373(),C.mi,new E.e374(),C.zz,new E.e375(),C.z6,new E.e376(),C.kw,new E.e377(),C.zU,new E.e378(),C.OU,new E.e379(),C.RJ,new E.e380(),C.YE,new E.e381()],null,null)
+x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.ou,C.Mt,C.oT,C.il,C.jR,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.Qb,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.MI,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.qZ,C.il,C.Zj,C.Mt,C.he,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.mK,C.il,C.EZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.l4,C.ms,C.Mt,C.FA,C.Mt,C.Qt,C.Mt,C.a8,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.qJ,C.Nw,C.Mt,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.X8,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.bC,C.Mt,C.ws,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.l4,C.al,C.il],null,null)
+w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.Qp,C.mJ,C.Qu,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,C.CM,C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.Qp,C.B0,C.b6,C.r1,C.nP,C.mr,C.HE],null,null),C.KO,P.EF([C.yh,C.zd],null,null),C.wk,P.EF([C.AV,C.fr,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.ah],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.Qb,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.QK,C.Yo],null,null),C.te,P.EF([C.nf,C.wR],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.mM],null,null),C.Wz,C.CM,C.MI,P.EF([C.fn,C.fz,C.XM,C.Tt,C.tg,C.DC],null,null),C.pF,C.CM,C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.qZ,C.CM,C.Zj,P.EF([C.oj,C.GT],null,null),C.he,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.Fk],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,C.CM,C.oG,P.EF([C.jU,C.bw],null,null),C.mK,C.CM,C.EZ,P.EF([C.vp,C.o0],null,null),C.FG,C.CM,C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,C.CM,C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.oV,C.vb,C.Mq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bB,C.zz,C.lS],null,null),C.UJ,C.CM,C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.hr,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.ZQ],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.p4],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.p4],null,null),C.vw,P.EF([C.uk,C.p4,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Ce],null,null),C.NW,C.CM,C.ms,P.EF([C.cg,C.ll,C.uk,C.p4,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.xD,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.p4],null,null),C.Dl,P.EF([C.VK,C.Od],null,null),C.l4,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.Nw,P.EF([C.S4,C.FB,C.VI,C.w6],null,null),C.ON,P.EF([C.kI,C.JM,C.vY,C.ZS,C.Rs,C.EW,C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.A7,C.SD,C.SA,C.KI,C.uG,C.K1,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS,C.IT,C.NL,C.li,C.Tz],null,null),C.Sb,P.EF([C.tW,C.kH,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.rZ],null,null),C.il,P.EF([C.uu,C.yY,C.kY,C.TO,C.Wm,C.QW],null,null),C.X8,P.EF([C.Zg,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Ud,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.rE,C.KS],null,null),C.vu,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.ft,C.Gz],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.Ul,C.RJ,C.BP],null,null)],null,null)
+v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.Zg,"args",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.I9,"closeItem",C.To,"closing",C.XA,"cls",C.i4,"code",C.mJ,"color",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.kI,"currentLine",C.vY,"currentPos",C.Rs,"currentPosChanged",C.Lw,"deleteVm",C.eR,"deoptimizations",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.WQ,"field",C.fV,"fields",C.jU,"file",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.Ge,"hashLinkWorkaround",C.A7,"height",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.tJ,"isBool",C.F8,"isChromeTarget",C.C1,"isComment",C.Nr,"isConst",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.MY,"isInlinable",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.Vl,"isOptimizable",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.AT,"isStatic",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.uG,"linesReady",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.JK,"makeLineId",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.YV,"owningClass",C.If,"owningLibrary",C.Ys,"pad",C.zm,"padding",C.nX,"parent",C.xP,"parseInt",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Jf,"possibleBpt",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.kY,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.IT,"startPos",C.li,"startPosChanged",C.PM,"status",C.ks,"stepInto",C.Om,"stepOut",C.iC,"stepOver",C.k5,"subClasses",C.Nv,"subclass",C.Cw,"superClass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.ft,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.QL,"toString",C.RH,"toStringAsFixed",C.SP,"toggleBreakpoint",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.OU,"unoptimizedCode",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.yv,"usageCounter",C.LP,"used",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),!1))
 $.j8=new O.fH(z,y,C.CM)
 $.Yv=new O.bY(x,w,!1)
 $.qe=v
-$.M6=[new E.e369(),new E.e370(),new E.e371(),new E.e372(),new E.e373(),new E.e374(),new E.e375(),new E.e376(),new E.e377(),new E.e378(),new E.e379(),new E.e380(),new E.e381(),new E.e382(),new E.e383(),new E.e384(),new E.e385(),new E.e386(),new E.e387(),new E.e388(),new E.e389(),new E.e390(),new E.e391(),new E.e392(),new E.e393(),new E.e394(),new E.e395(),new E.e396(),new E.e397(),new E.e398(),new E.e399(),new E.e400(),new E.e401(),new E.e402(),new E.e403(),new E.e404(),new E.e405(),new E.e406(),new E.e407(),new E.e408(),new E.e409(),new E.e410(),new E.e411(),new E.e412(),new E.e413(),new E.e414(),new E.e415(),new E.e416(),new E.e417(),new E.e418(),new E.e419(),new E.e420(),new E.e421(),new E.e422(),new E.e423(),new E.e424(),new E.e425(),new E.e426(),new E.e427(),new E.e428(),new E.e429(),new E.e430(),new E.e431(),new E.e432(),new E.e433(),new E.e434(),new E.e435(),new E.e436(),new E.e437(),new E.e438(),new E.e439(),new E.e440(),new E.e441(),new E.e442(),new E.e443(),new E.e444(),new E.e445(),new E.e446()]
+$.M6=[new E.e382(),new E.e383(),new E.e384(),new E.e385(),new E.e386(),new E.e387(),new E.e388(),new E.e389(),new E.e390(),new E.e391(),new E.e392(),new E.e393(),new E.e394(),new E.e395(),new E.e396(),new E.e397(),new E.e398(),new E.e399(),new E.e400(),new E.e401(),new E.e402(),new E.e403(),new E.e404(),new E.e405(),new E.e406(),new E.e407(),new E.e408(),new E.e409(),new E.e410(),new E.e411(),new E.e412(),new E.e413(),new E.e414(),new E.e415(),new E.e416(),new E.e417(),new E.e418(),new E.e419(),new E.e420(),new E.e421(),new E.e422(),new E.e423(),new E.e424(),new E.e425(),new E.e426(),new E.e427(),new E.e428(),new E.e429(),new E.e430(),new E.e431(),new E.e432(),new E.e433(),new E.e434(),new E.e435(),new E.e436(),new E.e437(),new E.e438(),new E.e439(),new E.e440(),new E.e441(),new E.e442(),new E.e443(),new E.e444(),new E.e445(),new E.e446(),new E.e447(),new E.e448(),new E.e449(),new E.e450(),new E.e451(),new E.e452(),new E.e453(),new E.e454(),new E.e455(),new E.e456(),new E.e457(),new E.e458(),new E.e459(),new E.e460()]
 $.UG=!0
 F.E2()},"$0","jk",0,0,17],
 em:{
@@ -2670,1780 +2687,1836 @@
 $isEH:true},
 e6:{
 "^":"TpZ:12;",
-$1:function(a){return J.SM(a)},
+$1:function(a){return J.yI(a)},
 $isEH:true},
 e7:{
 "^":"TpZ:12;",
-$1:function(a){return a.goH()},
+$1:function(a){return J.SM(a)},
 $isEH:true},
 e8:{
 "^":"TpZ:12;",
-$1:function(a){return J.Mh(a)},
+$1:function(a){return a.goH()},
 $isEH:true},
 e9:{
 "^":"TpZ:12;",
-$1:function(a){return J.jO(a)},
+$1:function(a){return J.dw(a)},
 $isEH:true},
 e10:{
 "^":"TpZ:12;",
-$1:function(a){return J.xe(a)},
+$1:function(a){return J.jO(a)},
 $isEH:true},
 e11:{
 "^":"TpZ:12;",
-$1:function(a){return J.OT(a)},
+$1:function(a){return J.xe(a)},
 $isEH:true},
 e12:{
 "^":"TpZ:12;",
-$1:function(a){return J.Ok(a)},
+$1:function(a){return J.OT(a)},
 $isEH:true},
 e13:{
 "^":"TpZ:12;",
-$1:function(a){return a.gl()},
+$1:function(a){return J.Ok(a)},
 $isEH:true},
 e14:{
 "^":"TpZ:12;",
-$1:function(a){return J.h6(a)},
+$1:function(a){return a.gl()},
 $isEH:true},
 e15:{
 "^":"TpZ:12;",
-$1:function(a){return J.Jr(a)},
+$1:function(a){return J.h6(a)},
 $isEH:true},
 e16:{
 "^":"TpZ:12;",
-$1:function(a){return J.Cg(a)},
+$1:function(a){return J.Jr(a)},
 $isEH:true},
 e17:{
 "^":"TpZ:12;",
-$1:function(a){return J.o4(a)},
+$1:function(a){return J.Cg(a)},
 $isEH:true},
 e18:{
 "^":"TpZ:12;",
-$1:function(a){return a.guh()},
+$1:function(a){return J.o4(a)},
 $isEH:true},
 e19:{
 "^":"TpZ:12;",
-$1:function(a){return a.gP9()},
+$1:function(a){return a.guh()},
 $isEH:true},
 e20:{
 "^":"TpZ:12;",
-$1:function(a){return a.guH()},
+$1:function(a){return a.gP9()},
 $isEH:true},
 e21:{
 "^":"TpZ:12;",
-$1:function(a){return J.mP(a)},
+$1:function(a){return a.guH()},
 $isEH:true},
 e22:{
 "^":"TpZ:12;",
-$1:function(a){return J.BT(a)},
+$1:function(a){return J.mP(a)},
 $isEH:true},
 e23:{
 "^":"TpZ:12;",
-$1:function(a){return J.vi(a)},
+$1:function(a){return J.BT(a)},
 $isEH:true},
 e24:{
 "^":"TpZ:12;",
-$1:function(a){return J.nq(a)},
+$1:function(a){return J.vi(a)},
 $isEH:true},
 e25:{
 "^":"TpZ:12;",
-$1:function(a){return J.k0(a)},
+$1:function(a){return J.nq(a)},
 $isEH:true},
 e26:{
 "^":"TpZ:12;",
-$1:function(a){return J.rw(a)},
+$1:function(a){return J.k0(a)},
 $isEH:true},
 e27:{
 "^":"TpZ:12;",
-$1:function(a){return J.lk(a)},
+$1:function(a){return J.rw(a)},
 $isEH:true},
 e28:{
 "^":"TpZ:12;",
-$1:function(a){return a.gej()},
+$1:function(a){return J.lk(a)},
 $isEH:true},
 e29:{
 "^":"TpZ:12;",
-$1:function(a){return a.gw2()},
+$1:function(a){return a.gej()},
 $isEH:true},
 e30:{
 "^":"TpZ:12;",
-$1:function(a){return J.w8(a)},
+$1:function(a){return a.gw2()},
 $isEH:true},
 e31:{
 "^":"TpZ:12;",
-$1:function(a){return J.zk(a)},
+$1:function(a){return J.w8(a)},
 $isEH:true},
 e32:{
 "^":"TpZ:12;",
-$1:function(a){return J.kv(a)},
+$1:function(a){return J.zk(a)},
 $isEH:true},
 e33:{
 "^":"TpZ:12;",
-$1:function(a){return J.a3(a)},
+$1:function(a){return J.kv(a)},
 $isEH:true},
 e34:{
 "^":"TpZ:12;",
-$1:function(a){return J.Ts(a)},
+$1:function(a){return J.a3(a)},
 $isEH:true},
 e35:{
 "^":"TpZ:12;",
-$1:function(a){return J.Ky(a)},
+$1:function(a){return J.Ts(a)},
 $isEH:true},
 e36:{
 "^":"TpZ:12;",
-$1:function(a){return J.io(a)},
+$1:function(a){return J.Ky(a)},
 $isEH:true},
 e37:{
 "^":"TpZ:12;",
-$1:function(a){return J.kE(a)},
+$1:function(a){return J.io(a)},
 $isEH:true},
 e38:{
 "^":"TpZ:12;",
-$1:function(a){return J.Gl(a)},
+$1:function(a){return J.kE(a)},
 $isEH:true},
 e39:{
 "^":"TpZ:12;",
-$1:function(a){return J.Mz(a)},
+$1:function(a){return J.Gl(a)},
 $isEH:true},
 e40:{
 "^":"TpZ:12;",
-$1:function(a){return J.nb(a)},
+$1:function(a){return J.Mz(a)},
 $isEH:true},
 e41:{
 "^":"TpZ:12;",
-$1:function(a){return a.gty()},
+$1:function(a){return J.nb(a)},
 $isEH:true},
 e42:{
 "^":"TpZ:12;",
-$1:function(a){return J.yn(a)},
+$1:function(a){return a.gty()},
 $isEH:true},
 e43:{
 "^":"TpZ:12;",
-$1:function(a){return a.gMX()},
+$1:function(a){return J.yn(a)},
 $isEH:true},
 e44:{
 "^":"TpZ:12;",
-$1:function(a){return a.gx5()},
+$1:function(a){return a.gMX()},
 $isEH:true},
 e45:{
 "^":"TpZ:12;",
-$1:function(a){return J.pm(a)},
+$1:function(a){return a.gx5()},
 $isEH:true},
 e46:{
 "^":"TpZ:12;",
-$1:function(a){return a.gtJ()},
+$1:function(a){return J.pm(a)},
 $isEH:true},
 e47:{
 "^":"TpZ:12;",
-$1:function(a){return J.Ec(a)},
+$1:function(a){return a.gtJ()},
 $isEH:true},
 e48:{
 "^":"TpZ:12;",
-$1:function(a){return J.ra(a)},
+$1:function(a){return J.Ec(a)},
 $isEH:true},
 e49:{
 "^":"TpZ:12;",
-$1:function(a){return J.YH(a)},
+$1:function(a){return J.ra(a)},
 $isEH:true},
 e50:{
 "^":"TpZ:12;",
-$1:function(a){return J.WX(a)},
+$1:function(a){return J.YH(a)},
 $isEH:true},
 e51:{
 "^":"TpZ:12;",
-$1:function(a){return J.IP(a)},
+$1:function(a){return J.WX(a)},
 $isEH:true},
 e52:{
 "^":"TpZ:12;",
-$1:function(a){return a.gZd()},
+$1:function(a){return J.IP(a)},
 $isEH:true},
 e53:{
 "^":"TpZ:12;",
-$1:function(a){return J.TM(a)},
+$1:function(a){return a.gZd()},
 $isEH:true},
 e54:{
 "^":"TpZ:12;",
-$1:function(a){return J.xo(a)},
+$1:function(a){return J.TM(a)},
 $isEH:true},
 e55:{
 "^":"TpZ:12;",
-$1:function(a){return a.gkA()},
+$1:function(a){return J.xo(a)},
 $isEH:true},
 e56:{
 "^":"TpZ:12;",
-$1:function(a){return a.gGK()},
+$1:function(a){return a.gkA()},
 $isEH:true},
 e57:{
 "^":"TpZ:12;",
-$1:function(a){return a.gan()},
+$1:function(a){return a.gGK()},
 $isEH:true},
 e58:{
 "^":"TpZ:12;",
-$1:function(a){return a.gcQ()},
+$1:function(a){return a.gan()},
 $isEH:true},
 e59:{
 "^":"TpZ:12;",
-$1:function(a){return a.gS7()},
+$1:function(a){return a.gcQ()},
 $isEH:true},
 e60:{
 "^":"TpZ:12;",
-$1:function(a){return a.gJz()},
+$1:function(a){return a.gS7()},
 $isEH:true},
 e61:{
 "^":"TpZ:12;",
-$1:function(a){return J.PY(a)},
+$1:function(a){return a.gJz()},
 $isEH:true},
 e62:{
 "^":"TpZ:12;",
-$1:function(a){return J.bu(a)},
+$1:function(a){return J.PY(a)},
 $isEH:true},
 e63:{
 "^":"TpZ:12;",
-$1:function(a){return J.VL(a)},
+$1:function(a){return J.bu(a)},
 $isEH:true},
 e64:{
 "^":"TpZ:12;",
-$1:function(a){return J.zN(a)},
+$1:function(a){return J.m8(a)},
 $isEH:true},
 e65:{
 "^":"TpZ:12;",
-$1:function(a){return J.m4(a)},
+$1:function(a){return J.zN(a)},
 $isEH:true},
 e66:{
 "^":"TpZ:12;",
-$1:function(a){return a.gmu()},
+$1:function(a){return J.m4(a)},
 $isEH:true},
 e67:{
 "^":"TpZ:12;",
-$1:function(a){return a.gCO()},
+$1:function(a){return a.gmu()},
 $isEH:true},
 e68:{
 "^":"TpZ:12;",
-$1:function(a){return J.MB(a)},
+$1:function(a){return a.gCO()},
 $isEH:true},
 e69:{
 "^":"TpZ:12;",
-$1:function(a){return J.eU(a)},
+$1:function(a){return J.MB(a)},
 $isEH:true},
 e70:{
 "^":"TpZ:12;",
-$1:function(a){return J.DB(a)},
+$1:function(a){return J.eU(a)},
 $isEH:true},
 e71:{
 "^":"TpZ:12;",
-$1:function(a){return a.gGf()},
+$1:function(a){return J.DB(a)},
 $isEH:true},
 e72:{
 "^":"TpZ:12;",
-$1:function(a){return a.gvS()},
+$1:function(a){return a.gGf()},
 $isEH:true},
 e73:{
 "^":"TpZ:12;",
-$1:function(a){return a.gJL()},
+$1:function(a){return a.gvS()},
 $isEH:true},
 e74:{
 "^":"TpZ:12;",
-$1:function(a){return J.Er(a)},
+$1:function(a){return a.gMp()},
 $isEH:true},
 e75:{
 "^":"TpZ:12;",
-$1:function(a){return J.OB(a)},
+$1:function(a){return J.Er(a)},
 $isEH:true},
 e76:{
 "^":"TpZ:12;",
-$1:function(a){return J.YQ(a)},
+$1:function(a){return J.OB(a)},
 $isEH:true},
 e77:{
 "^":"TpZ:12;",
-$1:function(a){return J.tC(a)},
+$1:function(a){return J.YQ(a)},
 $isEH:true},
 e78:{
 "^":"TpZ:12;",
-$1:function(a){return a.gu9()},
+$1:function(a){return J.Xf(a)},
 $isEH:true},
 e79:{
 "^":"TpZ:12;",
-$1:function(a){return J.aW(a)},
+$1:function(a){return a.gu9()},
 $isEH:true},
 e80:{
 "^":"TpZ:12;",
-$1:function(a){return J.aB(a)},
+$1:function(a){return J.aW(a)},
 $isEH:true},
 e81:{
 "^":"TpZ:12;",
-$1:function(a){return a.gL4()},
+$1:function(a){return J.aB(a)},
 $isEH:true},
 e82:{
 "^":"TpZ:12;",
-$1:function(a){return a.gaj()},
+$1:function(a){return a.gL4()},
 $isEH:true},
 e83:{
 "^":"TpZ:12;",
-$1:function(a){return a.giq()},
+$1:function(a){return a.gaj()},
 $isEH:true},
 e84:{
 "^":"TpZ:12;",
-$1:function(a){return a.gBm()},
+$1:function(a){return a.giq()},
 $isEH:true},
 e85:{
 "^":"TpZ:12;",
-$1:function(a){return J.xR(a)},
+$1:function(a){return a.gBm()},
 $isEH:true},
 e86:{
 "^":"TpZ:12;",
-$1:function(a){return J.US(a)},
+$1:function(a){return J.xR(a)},
 $isEH:true},
 e87:{
 "^":"TpZ:12;",
-$1:function(a){return a.gNI()},
+$1:function(a){return J.AR(a)},
 $isEH:true},
 e88:{
 "^":"TpZ:12;",
-$1:function(a){return a.gva()},
+$1:function(a){return a.gNI()},
 $isEH:true},
 e89:{
 "^":"TpZ:12;",
-$1:function(a){return a.gKt()},
+$1:function(a){return a.gva()},
 $isEH:true},
 e90:{
 "^":"TpZ:12;",
-$1:function(a){return a.gp2()},
+$1:function(a){return a.gKt()},
 $isEH:true},
 e91:{
 "^":"TpZ:12;",
-$1:function(a){return J.IA(a)},
+$1:function(a){return a.gp2()},
 $isEH:true},
 e92:{
 "^":"TpZ:12;",
-$1:function(a){return J.Ew(a)},
+$1:function(a){return J.IA(a)},
 $isEH:true},
 e93:{
 "^":"TpZ:12;",
-$1:function(a){return a.gVM()},
+$1:function(a){return J.Ew(a)},
 $isEH:true},
 e94:{
 "^":"TpZ:12;",
-$1:function(a){return J.Xi(a)},
+$1:function(a){return a.gVM()},
 $isEH:true},
 e95:{
 "^":"TpZ:12;",
-$1:function(a){return J.bL(a)},
+$1:function(a){return J.Xi(a)},
 $isEH:true},
 e96:{
 "^":"TpZ:12;",
-$1:function(a){return a.gUB()},
+$1:function(a){return J.bL(a)},
 $isEH:true},
 e97:{
 "^":"TpZ:12;",
-$1:function(a){return a.gRs()},
+$1:function(a){return a.gUB()},
 $isEH:true},
 e98:{
 "^":"TpZ:12;",
-$1:function(a){return J.ix(a)},
+$1:function(a){return a.gRs()},
 $isEH:true},
 e99:{
 "^":"TpZ:12;",
-$1:function(a){return a.gni()},
+$1:function(a){return J.ix(a)},
 $isEH:true},
 e100:{
 "^":"TpZ:12;",
-$1:function(a){return a.gqy()},
+$1:function(a){return a.gni()},
 $isEH:true},
 e101:{
 "^":"TpZ:12;",
-$1:function(a){return J.wz(a)},
+$1:function(a){return a.gqy()},
 $isEH:true},
 e102:{
 "^":"TpZ:12;",
-$1:function(a){return J.FN(a)},
+$1:function(a){return J.wz(a)},
 $isEH:true},
 e103:{
 "^":"TpZ:12;",
-$1:function(a){return J.Wk(a)},
+$1:function(a){return J.FN(a)},
 $isEH:true},
 e104:{
 "^":"TpZ:12;",
-$1:function(a){return a.gho()},
+$1:function(a){return J.Wk(a)},
 $isEH:true},
 e105:{
 "^":"TpZ:12;",
-$1:function(a){return J.eT(a)},
+$1:function(a){return a.gho()},
 $isEH:true},
 e106:{
 "^":"TpZ:12;",
-$1:function(a){return J.C8(a)},
+$1:function(a){return J.eT(a)},
 $isEH:true},
 e107:{
 "^":"TpZ:12;",
-$1:function(a){return J.tf(a)},
+$1:function(a){return J.C8(a)},
 $isEH:true},
 e108:{
 "^":"TpZ:12;",
-$1:function(a){return J.pO(a)},
+$1:function(a){return J.tf(a)},
 $isEH:true},
 e109:{
 "^":"TpZ:12;",
-$1:function(a){return J.cU(a)},
+$1:function(a){return J.pO(a)},
 $isEH:true},
 e110:{
 "^":"TpZ:12;",
-$1:function(a){return a.gW1()},
+$1:function(a){return J.cU(a)},
 $isEH:true},
 e111:{
 "^":"TpZ:12;",
-$1:function(a){return a.gYG()},
+$1:function(a){return a.gW1()},
 $isEH:true},
 e112:{
 "^":"TpZ:12;",
-$1:function(a){return a.gi2()},
+$1:function(a){return a.gYG()},
 $isEH:true},
 e113:{
 "^":"TpZ:12;",
-$1:function(a){return a.gHY()},
+$1:function(a){return a.gi2()},
 $isEH:true},
 e114:{
 "^":"TpZ:12;",
-$1:function(a){return a.gFo()},
+$1:function(a){return a.gHY()},
 $isEH:true},
 e115:{
 "^":"TpZ:12;",
-$1:function(a){return J.j0(a)},
+$1:function(a){return a.gFo()},
 $isEH:true},
 e116:{
 "^":"TpZ:12;",
-$1:function(a){return J.ZN(a)},
+$1:function(a){return J.j0(a)},
 $isEH:true},
 e117:{
 "^":"TpZ:12;",
-$1:function(a){return J.xa(a)},
+$1:function(a){return J.ZN(a)},
 $isEH:true},
 e118:{
 "^":"TpZ:12;",
-$1:function(a){return J.aT(a)},
+$1:function(a){return J.xa(a)},
 $isEH:true},
 e119:{
 "^":"TpZ:12;",
-$1:function(a){return J.KG(a)},
+$1:function(a){return J.aT(a)},
 $isEH:true},
 e120:{
 "^":"TpZ:12;",
-$1:function(a){return a.giR()},
+$1:function(a){return J.KG(a)},
 $isEH:true},
 e121:{
 "^":"TpZ:12;",
-$1:function(a){return a.gEB()},
+$1:function(a){return a.giR()},
 $isEH:true},
 e122:{
 "^":"TpZ:12;",
-$1:function(a){return J.Iz(a)},
+$1:function(a){return a.gEB()},
 $isEH:true},
 e123:{
 "^":"TpZ:12;",
-$1:function(a){return J.Yq(a)},
+$1:function(a){return J.Iz(a)},
 $isEH:true},
 e124:{
 "^":"TpZ:12;",
-$1:function(a){return J.uY(a)},
+$1:function(a){return J.Yq(a)},
 $isEH:true},
 e125:{
 "^":"TpZ:12;",
-$1:function(a){return J.X7(a)},
+$1:function(a){return J.uY(a)},
 $isEH:true},
 e126:{
 "^":"TpZ:12;",
-$1:function(a){return J.IR(a)},
+$1:function(a){return J.X7(a)},
 $isEH:true},
 e127:{
 "^":"TpZ:12;",
-$1:function(a){return a.gPE()},
+$1:function(a){return J.IR(a)},
 $isEH:true},
 e128:{
 "^":"TpZ:12;",
-$1:function(a){return J.q8(a)},
+$1:function(a){return a.gPE()},
 $isEH:true},
 e129:{
 "^":"TpZ:12;",
-$1:function(a){return a.ghX()},
+$1:function(a){return J.q8(a)},
 $isEH:true},
 e130:{
 "^":"TpZ:12;",
-$1:function(a){return a.gvU()},
+$1:function(a){return a.ghX()},
 $isEH:true},
 e131:{
 "^":"TpZ:12;",
-$1:function(a){return J.jl(a)},
+$1:function(a){return a.gvU()},
 $isEH:true},
 e132:{
 "^":"TpZ:12;",
-$1:function(a){return a.gRd()},
+$1:function(a){return J.jl(a)},
 $isEH:true},
 e133:{
 "^":"TpZ:12;",
-$1:function(a){return J.zY(a)},
+$1:function(a){return J.f2(a)},
 $isEH:true},
 e134:{
 "^":"TpZ:12;",
-$1:function(a){return J.de(a)},
+$1:function(a){return J.zY(a)},
 $isEH:true},
 e135:{
 "^":"TpZ:12;",
-$1:function(a){return J.Ds(a)},
+$1:function(a){return J.de(a)},
 $isEH:true},
 e136:{
 "^":"TpZ:12;",
-$1:function(a){return J.cO(a)},
+$1:function(a){return J.fy(a)},
 $isEH:true},
 e137:{
 "^":"TpZ:12;",
-$1:function(a){return a.gzM()},
+$1:function(a){return J.Ds(a)},
 $isEH:true},
 e138:{
 "^":"TpZ:12;",
-$1:function(a){return a.gMN()},
+$1:function(a){return J.cO(a)},
 $isEH:true},
 e139:{
 "^":"TpZ:12;",
-$1:function(a){return a.giP()},
+$1:function(a){return a.gzM()},
 $isEH:true},
 e140:{
 "^":"TpZ:12;",
-$1:function(a){return a.gmd()},
+$1:function(a){return a.gMN()},
 $isEH:true},
 e141:{
 "^":"TpZ:12;",
-$1:function(a){return a.geH()},
+$1:function(a){return a.giP()},
 $isEH:true},
 e142:{
 "^":"TpZ:12;",
-$1:function(a){return J.yc(a)},
+$1:function(a){return a.gmd()},
 $isEH:true},
 e143:{
 "^":"TpZ:12;",
-$1:function(a){return J.Yf(a)},
+$1:function(a){return a.geH()},
 $isEH:true},
 e144:{
 "^":"TpZ:12;",
-$1:function(a){return J.Zq(a)},
+$1:function(a){return J.yc(a)},
 $isEH:true},
 e145:{
 "^":"TpZ:12;",
-$1:function(a){return J.ih(a)},
+$1:function(a){return J.Yf(a)},
 $isEH:true},
 e146:{
 "^":"TpZ:12;",
-$1:function(a){return J.z2(a)},
+$1:function(a){return J.Zq(a)},
 $isEH:true},
 e147:{
 "^":"TpZ:12;",
-$1:function(a){return J.ZF(a)},
+$1:function(a){return J.ih(a)},
 $isEH:true},
 e148:{
 "^":"TpZ:12;",
-$1:function(a){return J.Lh(a)},
+$1:function(a){return J.z2(a)},
 $isEH:true},
 e149:{
 "^":"TpZ:12;",
-$1:function(a){return J.Zv(a)},
+$1:function(a){return J.ZF(a)},
 $isEH:true},
 e150:{
 "^":"TpZ:12;",
-$1:function(a){return J.O6(a)},
+$1:function(a){return J.FY(a)},
 $isEH:true},
 e151:{
 "^":"TpZ:12;",
-$1:function(a){return J.Pf(a)},
+$1:function(a){return J.Zv(a)},
 $isEH:true},
 e152:{
 "^":"TpZ:12;",
-$1:function(a){return a.gUY()},
+$1:function(a){return J.O6(a)},
 $isEH:true},
 e153:{
 "^":"TpZ:12;",
-$1:function(a){return a.gvK()},
+$1:function(a){return J.Pf(a)},
 $isEH:true},
 e154:{
 "^":"TpZ:12;",
-$1:function(a){return J.Jj(a)},
+$1:function(a){return a.gUY()},
 $isEH:true},
 e155:{
 "^":"TpZ:12;",
-$1:function(a){return J.t8(a)},
+$1:function(a){return a.gvK()},
 $isEH:true},
 e156:{
 "^":"TpZ:12;",
-$1:function(a){return a.gL1()},
+$1:function(a){return J.Jj(a)},
 $isEH:true},
 e157:{
 "^":"TpZ:12;",
-$1:function(a){return a.gxQ()},
+$1:function(a){return J.t8(a)},
 $isEH:true},
 e158:{
 "^":"TpZ:12;",
-$1:function(a){return a.gEl()},
+$1:function(a){return a.gL1()},
 $isEH:true},
 e159:{
 "^":"TpZ:12;",
-$1:function(a){return a.gxH()},
+$1:function(a){return a.gxQ()},
 $isEH:true},
 e160:{
 "^":"TpZ:12;",
-$1:function(a){return J.ee(a)},
+$1:function(a){return a.gEl()},
 $isEH:true},
 e161:{
 "^":"TpZ:12;",
-$1:function(a){return J.JG(a)},
+$1:function(a){return a.gxH()},
 $isEH:true},
 e162:{
 "^":"TpZ:12;",
-$1:function(a){return J.Lp(a)},
+$1:function(a){return J.ee(a)},
 $isEH:true},
 e163:{
 "^":"TpZ:12;",
-$1:function(a){return J.z1(a)},
+$1:function(a){return J.JG(a)},
 $isEH:true},
 e164:{
 "^":"TpZ:12;",
-$1:function(a){return J.AF(a)},
+$1:function(a){return J.Lp(a)},
 $isEH:true},
 e165:{
 "^":"TpZ:12;",
-$1:function(a){return J.LB(a)},
+$1:function(a){return J.z1(a)},
 $isEH:true},
 e166:{
 "^":"TpZ:12;",
-$1:function(a){return J.Kl(a)},
+$1:function(a){return J.AF(a)},
 $isEH:true},
 e167:{
 "^":"TpZ:12;",
-$1:function(a){return a.gU6()},
+$1:function(a){return J.LB(a)},
 $isEH:true},
 e168:{
 "^":"TpZ:12;",
-$1:function(a){return J.cj(a)},
+$1:function(a){return J.Kl(a)},
 $isEH:true},
 e169:{
 "^":"TpZ:12;",
-$1:function(a){return J.br(a)},
+$1:function(a){return a.gcD()},
 $isEH:true},
 e170:{
 "^":"TpZ:12;",
-$1:function(a){return J.jL(a)},
+$1:function(a){return J.cj(a)},
 $isEH:true},
 e171:{
 "^":"TpZ:12;",
-$1:function(a){return J.L6(a)},
+$1:function(a){return J.tC(a)},
 $isEH:true},
 e172:{
 "^":"TpZ:12;",
-$1:function(a){return J.Qa(a)},
+$1:function(a){return J.jL(a)},
 $isEH:true},
 e173:{
 "^":"TpZ:12;",
-$1:function(a){return J.ks(a)},
+$1:function(a){return J.L6(a)},
 $isEH:true},
 e174:{
 "^":"TpZ:12;",
-$1:function(a){return J.CN(a)},
+$1:function(a){return a.gj9()},
 $isEH:true},
 e175:{
 "^":"TpZ:12;",
-$1:function(a){return J.ql(a)},
+$1:function(a){return J.Qa(a)},
 $isEH:true},
 e176:{
 "^":"TpZ:12;",
-$1:function(a){return J.ul(a)},
+$1:function(a){return J.Tv(a)},
 $isEH:true},
 e177:{
 "^":"TpZ:12;",
-$1:function(a){return a.gUx()},
+$1:function(a){return J.CN(a)},
 $isEH:true},
 e178:{
 "^":"TpZ:12;",
-$1:function(a){return J.id(a)},
+$1:function(a){return J.ql(a)},
 $isEH:true},
 e179:{
 "^":"TpZ:12;",
-$1:function(a){return a.gm8()},
+$1:function(a){return J.ul(a)},
 $isEH:true},
 e180:{
 "^":"TpZ:12;",
-$1:function(a){return J.BZ(a)},
+$1:function(a){return a.gUx()},
 $isEH:true},
 e181:{
 "^":"TpZ:12;",
-$1:function(a){return J.H1(a)},
+$1:function(a){return J.id(a)},
 $isEH:true},
 e182:{
 "^":"TpZ:12;",
-$1:function(a){return J.Cm(a)},
+$1:function(a){return a.gm8()},
 $isEH:true},
 e183:{
 "^":"TpZ:12;",
-$1:function(a){return J.fU(a)},
+$1:function(a){return J.BZ(a)},
 $isEH:true},
 e184:{
 "^":"TpZ:12;",
-$1:function(a){return J.GH(a)},
+$1:function(a){return J.H1(a)},
 $isEH:true},
 e185:{
 "^":"TpZ:12;",
-$1:function(a){return J.n8(a)},
+$1:function(a){return J.At(a)},
 $isEH:true},
 e186:{
 "^":"TpZ:12;",
-$1:function(a){return a.gLc()},
+$1:function(a){return J.fU(a)},
 $isEH:true},
 e187:{
 "^":"TpZ:12;",
-$1:function(a){return a.gNS()},
+$1:function(a){return J.GH(a)},
 $isEH:true},
 e188:{
 "^":"TpZ:12;",
-$1:function(a){return a.gVI()},
+$1:function(a){return J.bS(a)},
 $isEH:true},
 e189:{
 "^":"TpZ:12;",
-$1:function(a){return J.iL(a)},
+$1:function(a){return a.gua()},
 $isEH:true},
 e190:{
 "^":"TpZ:12;",
-$1:function(a){return J.k7(a)},
+$1:function(a){return a.gNS()},
 $isEH:true},
 e191:{
 "^":"TpZ:12;",
-$1:function(a){return J.uW(a)},
+$1:function(a){return a.gVI()},
 $isEH:true},
 e192:{
 "^":"TpZ:12;",
-$1:function(a){return J.W2(a)},
+$1:function(a){return J.iL(a)},
 $isEH:true},
 e193:{
 "^":"TpZ:12;",
-$1:function(a){return J.UT(a)},
+$1:function(a){return J.k7(a)},
 $isEH:true},
 e194:{
 "^":"TpZ:12;",
-$1:function(a){return J.Kd(a)},
+$1:function(a){return J.uW(a)},
 $isEH:true},
 e195:{
 "^":"TpZ:12;",
-$1:function(a){return J.pU(a)},
+$1:function(a){return J.W2(a)},
 $isEH:true},
 e196:{
 "^":"TpZ:12;",
-$1:function(a){return J.Tg(a)},
+$1:function(a){return J.UT(a)},
 $isEH:true},
 e197:{
 "^":"TpZ:12;",
-$1:function(a){return a.gVc()},
+$1:function(a){return J.Kd(a)},
 $isEH:true},
 e198:{
 "^":"TpZ:12;",
-$1:function(a){return a.gpF()},
+$1:function(a){return J.pU(a)},
 $isEH:true},
 e199:{
 "^":"TpZ:12;",
-$1:function(a){return J.TY(a)},
+$1:function(a){return J.Tg(a)},
 $isEH:true},
 e200:{
 "^":"TpZ:12;",
-$1:function(a){return a.gA6()},
+$1:function(a){return a.gVc()},
 $isEH:true},
 e201:{
 "^":"TpZ:12;",
-$1:function(a){return J.Ry(a)},
+$1:function(a){return a.gpF()},
 $isEH:true},
 e202:{
 "^":"TpZ:12;",
-$1:function(a){return J.UP(a)},
+$1:function(a){return J.TY(a)},
 $isEH:true},
 e203:{
 "^":"TpZ:12;",
-$1:function(a){return J.UA(a)},
+$1:function(a){return a.gA6()},
 $isEH:true},
 e204:{
 "^":"TpZ:12;",
-$1:function(a){return J.zH(a)},
+$1:function(a){return J.Ry(a)},
 $isEH:true},
 e205:{
 "^":"TpZ:12;",
-$1:function(a){return J.Zs(a)},
+$1:function(a){return J.UP(a)},
 $isEH:true},
 e206:{
 "^":"TpZ:12;",
-$1:function(a){return a.gXR()},
+$1:function(a){return J.o9(a)},
 $isEH:true},
 e207:{
 "^":"TpZ:12;",
-$1:function(a){return J.NB(a)},
+$1:function(a){return J.zH(a)},
 $isEH:true},
 e208:{
 "^":"TpZ:12;",
-$1:function(a){return a.gzS()},
+$1:function(a){return J.Zs(a)},
 $isEH:true},
 e209:{
 "^":"TpZ:12;",
-$1:function(a){return J.Cr(a)},
+$1:function(a){return a.gXR()},
 $isEH:true},
 e210:{
 "^":"TpZ:12;",
-$1:function(a){return J.oN(a)},
+$1:function(a){return J.NB(a)},
 $isEH:true},
 e211:{
 "^":"TpZ:12;",
-$1:function(a){return a.gV8()},
+$1:function(a){return a.gzS()},
 $isEH:true},
 e212:{
 "^":"TpZ:12;",
-$1:function(a){return a.gp8()},
+$1:function(a){return J.U8(a)},
 $isEH:true},
 e213:{
 "^":"TpZ:12;",
-$1:function(a){return J.F9(a)},
+$1:function(a){return J.oN(a)},
 $isEH:true},
 e214:{
 "^":"TpZ:12;",
-$1:function(a){return J.HB(a)},
+$1:function(a){return a.gV8()},
 $isEH:true},
 e215:{
 "^":"TpZ:12;",
-$1:function(a){return J.yI(a)},
+$1:function(a){return a.gp8()},
 $isEH:true},
 e216:{
 "^":"TpZ:12;",
-$1:function(a){return J.jx(a)},
+$1:function(a){return J.F9(a)},
 $isEH:true},
 e217:{
 "^":"TpZ:12;",
-$1:function(a){return J.jB(a)},
+$1:function(a){return J.HB(a)},
 $isEH:true},
 e218:{
 "^":"TpZ:12;",
-$1:function(a){return a.gS5()},
+$1:function(a){return J.bh(a)},
 $isEH:true},
 e219:{
 "^":"TpZ:12;",
-$1:function(a){return a.gDo()},
+$1:function(a){return J.jx(a)},
 $isEH:true},
 e220:{
 "^":"TpZ:12;",
-$1:function(a){return a.guj()},
+$1:function(a){return J.jB(a)},
 $isEH:true},
 e221:{
 "^":"TpZ:12;",
-$1:function(a){return J.j1(a)},
+$1:function(a){return J.C7(a)},
 $isEH:true},
 e222:{
 "^":"TpZ:12;",
-$1:function(a){return J.Aw(a)},
+$1:function(a){return J.vI(a)},
 $isEH:true},
 e223:{
 "^":"TpZ:12;",
-$1:function(a){return J.l2(a)},
+$1:function(a){return J.Pq(a)},
 $isEH:true},
 e224:{
 "^":"TpZ:12;",
-$1:function(a){return a.gm2()},
+$1:function(a){return a.gS5()},
 $isEH:true},
 e225:{
 "^":"TpZ:12;",
-$1:function(a){return J.dY(a)},
+$1:function(a){return a.gDo()},
 $isEH:true},
 e226:{
 "^":"TpZ:12;",
-$1:function(a){return J.yq(a)},
+$1:function(a){return a.guj()},
 $isEH:true},
 e227:{
 "^":"TpZ:12;",
-$1:function(a){return a.gki()},
+$1:function(a){return J.j1(a)},
 $isEH:true},
 e228:{
 "^":"TpZ:12;",
-$1:function(a){return a.gZn()},
+$1:function(a){return J.Aw(a)},
 $isEH:true},
 e229:{
 "^":"TpZ:12;",
-$1:function(a){return a.gvs()},
+$1:function(a){return J.l2(a)},
 $isEH:true},
 e230:{
 "^":"TpZ:12;",
-$1:function(a){return a.gVh()},
+$1:function(a){return a.gm2()},
 $isEH:true},
 e231:{
 "^":"TpZ:12;",
-$1:function(a){return a.gZX()},
+$1:function(a){return J.dY(a)},
 $isEH:true},
 e232:{
 "^":"TpZ:12;",
-$1:function(a){return J.Rg(a)},
+$1:function(a){return J.yq(a)},
 $isEH:true},
 e233:{
 "^":"TpZ:12;",
-$1:function(a){return J.d5(a)},
+$1:function(a){return a.gki()},
 $isEH:true},
 e234:{
 "^":"TpZ:12;",
-$1:function(a){return J.SG(a)},
+$1:function(a){return a.gZn()},
 $isEH:true},
 e235:{
 "^":"TpZ:12;",
-$1:function(a){return J.cs(a)},
+$1:function(a){return a.gvs()},
 $isEH:true},
 e236:{
 "^":"TpZ:12;",
-$1:function(a){return a.gVF()},
+$1:function(a){return a.gVh()},
 $isEH:true},
 e237:{
 "^":"TpZ:12;",
-$1:function(a){return a.gkw()},
+$1:function(a){return a.gZX()},
 $isEH:true},
 e238:{
 "^":"TpZ:12;",
-$1:function(a){return J.K2(a)},
+$1:function(a){return J.Rg(a)},
 $isEH:true},
 e239:{
 "^":"TpZ:12;",
-$1:function(a){return J.uy(a)},
+$1:function(a){return J.d5(a)},
 $isEH:true},
 e240:{
 "^":"TpZ:12;",
-$1:function(a){return a.gEy()},
+$1:function(a){return J.YG(a)},
 $isEH:true},
 e241:{
 "^":"TpZ:12;",
-$1:function(a){return J.XJ(a)},
+$1:function(a){return J.SG(a)},
 $isEH:true},
 e242:{
 "^":"TpZ:12;",
-$1:function(a){return a.gjW()},
+$1:function(a){return J.cs(a)},
 $isEH:true},
 e243:{
 "^":"TpZ:12;",
-$1:function(a){return J.P4(a)},
+$1:function(a){return a.gVF()},
 $isEH:true},
 e244:{
 "^":"TpZ:12;",
-$1:function(a){return a.gJk()},
+$1:function(a){return a.gkw()},
 $isEH:true},
 e245:{
 "^":"TpZ:12;",
-$1:function(a){return J.Q2(a)},
+$1:function(a){return J.K2(a)},
 $isEH:true},
 e246:{
 "^":"TpZ:12;",
-$1:function(a){return a.gSu()},
+$1:function(a){return J.uy(a)},
 $isEH:true},
 e247:{
 "^":"TpZ:12;",
-$1:function(a){return a.gSU()},
+$1:function(a){return a.gEy()},
 $isEH:true},
 e248:{
 "^":"TpZ:12;",
-$1:function(a){return a.gFc()},
+$1:function(a){return J.XJ(a)},
 $isEH:true},
 e249:{
 "^":"TpZ:12;",
-$1:function(a){return a.gYY()},
+$1:function(a){return a.gjW()},
 $isEH:true},
 e250:{
 "^":"TpZ:12;",
-$1:function(a){return a.gZ3()},
+$1:function(a){return J.Sl(a)},
 $isEH:true},
 e251:{
 "^":"TpZ:12;",
-$1:function(a){return J.ry(a)},
+$1:function(a){return a.gJk()},
 $isEH:true},
 e252:{
 "^":"TpZ:12;",
-$1:function(a){return J.I2(a)},
+$1:function(a){return J.Q2(a)},
 $isEH:true},
 e253:{
 "^":"TpZ:12;",
-$1:function(a){return a.gTX()},
+$1:function(a){return a.gSu()},
 $isEH:true},
 e254:{
 "^":"TpZ:12;",
-$1:function(a){return J.NC(a)},
+$1:function(a){return a.gSU()},
 $isEH:true},
 e255:{
 "^":"TpZ:12;",
-$1:function(a){return a.gV0()},
+$1:function(a){return a.gXA()},
 $isEH:true},
 e256:{
-"^":"TpZ:79;",
-$2:function(a,b){J.RX(a,b)},
+"^":"TpZ:12;",
+$1:function(a){return a.gYY()},
 $isEH:true},
 e257:{
-"^":"TpZ:79;",
-$2:function(a,b){J.L9(a,b)},
+"^":"TpZ:12;",
+$1:function(a){return a.gZ3()},
 $isEH:true},
 e258:{
-"^":"TpZ:79;",
-$2:function(a,b){J.NV(a,b)},
+"^":"TpZ:12;",
+$1:function(a){return J.Hg(a)},
 $isEH:true},
 e259:{
-"^":"TpZ:79;",
-$2:function(a,b){J.l7(a,b)},
+"^":"TpZ:12;",
+$1:function(a){return J.I2(a)},
 $isEH:true},
 e260:{
-"^":"TpZ:79;",
-$2:function(a,b){J.kB(a,b)},
+"^":"TpZ:12;",
+$1:function(a){return a.gTX()},
 $isEH:true},
 e261:{
-"^":"TpZ:79;",
-$2:function(a,b){J.Ae(a,b)},
+"^":"TpZ:12;",
+$1:function(a){return J.NC(a)},
 $isEH:true},
 e262:{
-"^":"TpZ:79;",
-$2:function(a,b){J.IX(a,b)},
+"^":"TpZ:12;",
+$1:function(a){return a.gV0()},
 $isEH:true},
 e263:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Ed(a,b)},
+$2:function(a,b){J.RX(a,b)},
 $isEH:true},
 e264:{
 "^":"TpZ:79;",
-$2:function(a,b){J.NE(a,b)},
+$2:function(a,b){J.L9(a,b)},
 $isEH:true},
 e265:{
 "^":"TpZ:79;",
-$2:function(a,b){J.WI(a,b)},
+$2:function(a,b){J.NV(a,b)},
 $isEH:true},
 e266:{
 "^":"TpZ:79;",
-$2:function(a,b){J.NZ(a,b)},
+$2:function(a,b){J.l7(a,b)},
 $isEH:true},
 e267:{
 "^":"TpZ:79;",
-$2:function(a,b){J.T5(a,b)},
+$2:function(a,b){J.kB(a,b)},
 $isEH:true},
 e268:{
 "^":"TpZ:79;",
-$2:function(a,b){J.i0(a,b)},
+$2:function(a,b){J.Ae(a,b)},
 $isEH:true},
 e269:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Sf(a,b)},
+$2:function(a,b){J.IX(a,b)},
 $isEH:true},
 e270:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Jl(a,b)},
+$2:function(a,b){J.Ed(a,b)},
 $isEH:true},
 e271:{
 "^":"TpZ:79;",
-$2:function(a,b){J.TP(a,b)},
+$2:function(a,b){J.NE(a,b)},
 $isEH:true},
 e272:{
 "^":"TpZ:79;",
-$2:function(a,b){J.LM(a,b)},
+$2:function(a,b){J.WI(a,b)},
 $isEH:true},
 e273:{
 "^":"TpZ:79;",
-$2:function(a,b){J.au(a,b)},
+$2:function(a,b){J.NZ(a,b)},
 $isEH:true},
 e274:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Ac(a,b)},
+$2:function(a,b){J.T5(a,b)},
 $isEH:true},
 e275:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Yz(a,b)},
+$2:function(a,b){J.FI(a,b)},
 $isEH:true},
 e276:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sej(b)},
+$2:function(a,b){J.i0(a,b)},
 $isEH:true},
 e277:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sw2(b)},
+$2:function(a,b){J.Sf(a,b)},
 $isEH:true},
 e278:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Qr(a,b)},
+$2:function(a,b){J.Jl(a,b)},
 $isEH:true},
 e279:{
 "^":"TpZ:79;",
-$2:function(a,b){J.xW(a,b)},
+$2:function(a,b){J.TP(a,b)},
 $isEH:true},
 e280:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Wy(a,b)},
+$2:function(a,b){J.LM(a,b)},
 $isEH:true},
 e281:{
 "^":"TpZ:79;",
-$2:function(a,b){J.i2(a,b)},
+$2:function(a,b){J.au(a,b)},
 $isEH:true},
 e282:{
 "^":"TpZ:79;",
-$2:function(a,b){J.BC(a,b)},
+$2:function(a,b){J.Ac(a,b)},
 $isEH:true},
 e283:{
 "^":"TpZ:79;",
-$2:function(a,b){J.pB(a,b)},
+$2:function(a,b){J.Yz(a,b)},
 $isEH:true},
 e284:{
 "^":"TpZ:79;",
-$2:function(a,b){J.NO(a,b)},
+$2:function(a,b){a.sej(b)},
 $isEH:true},
 e285:{
 "^":"TpZ:79;",
-$2:function(a,b){J.WB(a,b)},
+$2:function(a,b){a.sw2(b)},
 $isEH:true},
 e286:{
 "^":"TpZ:79;",
-$2:function(a,b){J.JZ(a,b)},
+$2:function(a,b){J.Qr(a,b)},
 $isEH:true},
 e287:{
 "^":"TpZ:79;",
-$2:function(a,b){J.fR(a,b)},
+$2:function(a,b){J.xW(a,b)},
 $isEH:true},
 e288:{
 "^":"TpZ:79;",
-$2:function(a,b){J.uP(a,b)},
+$2:function(a,b){J.Wy(a,b)},
 $isEH:true},
 e289:{
 "^":"TpZ:79;",
-$2:function(a,b){J.vJ(a,b)},
+$2:function(a,b){J.i2(a,b)},
 $isEH:true},
 e290:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Nf(a,b)},
+$2:function(a,b){J.BC(a,b)},
 $isEH:true},
 e291:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Pl(a,b)},
+$2:function(a,b){J.pB(a,b)},
 $isEH:true},
 e292:{
 "^":"TpZ:79;",
-$2:function(a,b){J.C3(a,b)},
+$2:function(a,b){J.NO(a,b)},
 $isEH:true},
 e293:{
 "^":"TpZ:79;",
-$2:function(a,b){J.AI(a,b)},
+$2:function(a,b){J.WB(a,b)},
 $isEH:true},
 e294:{
 "^":"TpZ:79;",
-$2:function(a,b){J.OE(a,b)},
+$2:function(a,b){J.JZ(a,b)},
 $isEH:true},
 e295:{
 "^":"TpZ:79;",
-$2:function(a,b){J.nA(a,b)},
+$2:function(a,b){J.OH(a,b)},
 $isEH:true},
 e296:{
 "^":"TpZ:79;",
-$2:function(a,b){J.fb(a,b)},
+$2:function(a,b){J.uP(a,b)},
 $isEH:true},
 e297:{
 "^":"TpZ:79;",
-$2:function(a,b){a.siq(b)},
+$2:function(a,b){J.vJ(a,b)},
 $isEH:true},
 e298:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Qy(a,b)},
+$2:function(a,b){J.Nf(a,b)},
 $isEH:true},
 e299:{
 "^":"TpZ:79;",
-$2:function(a,b){J.x0(a,b)},
+$2:function(a,b){J.Pl(a,b)},
 $isEH:true},
 e300:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sKt(b)},
+$2:function(a,b){J.C3(a,b)},
 $isEH:true},
 e301:{
 "^":"TpZ:79;",
-$2:function(a,b){J.cV(a,b)},
+$2:function(a,b){J.AI(a,b)},
 $isEH:true},
 e302:{
 "^":"TpZ:79;",
-$2:function(a,b){J.mU(a,b)},
+$2:function(a,b){J.OE(a,b)},
 $isEH:true},
 e303:{
 "^":"TpZ:79;",
-$2:function(a,b){J.uM(a,b)},
+$2:function(a,b){J.nA(a,b)},
 $isEH:true},
 e304:{
 "^":"TpZ:79;",
-$2:function(a,b){J.GZ(a,b)},
+$2:function(a,b){J.fb(a,b)},
 $isEH:true},
 e305:{
 "^":"TpZ:79;",
-$2:function(a,b){J.hS(a,b)},
+$2:function(a,b){a.siq(b)},
 $isEH:true},
 e306:{
 "^":"TpZ:79;",
-$2:function(a,b){J.mz(a,b)},
+$2:function(a,b){J.Qy(a,b)},
 $isEH:true},
 e307:{
 "^":"TpZ:79;",
-$2:function(a,b){J.pA(a,b)},
+$2:function(a,b){J.x0(a,b)},
 $isEH:true},
 e308:{
 "^":"TpZ:79;",
-$2:function(a,b){a.shX(b)},
+$2:function(a,b){a.sKt(b)},
 $isEH:true},
 e309:{
 "^":"TpZ:79;",
-$2:function(a,b){J.cl(a,b)},
+$2:function(a,b){J.cV(a,b)},
 $isEH:true},
 e310:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Ql(a,b)},
+$2:function(a,b){J.mU(a,b)},
 $isEH:true},
 e311:{
 "^":"TpZ:79;",
-$2:function(a,b){J.xQ(a,b)},
+$2:function(a,b){J.Rp(a,b)},
 $isEH:true},
 e312:{
 "^":"TpZ:79;",
-$2:function(a,b){J.MX(a,b)},
+$2:function(a,b){J.GZ(a,b)},
 $isEH:true},
 e313:{
 "^":"TpZ:79;",
-$2:function(a,b){J.A4(a,b)},
+$2:function(a,b){J.hS(a,b)},
 $isEH:true},
 e314:{
 "^":"TpZ:79;",
-$2:function(a,b){J.wD(a,b)},
+$2:function(a,b){J.mz(a,b)},
 $isEH:true},
 e315:{
 "^":"TpZ:79;",
-$2:function(a,b){J.wJ(a,b)},
+$2:function(a,b){J.pA(a,b)},
 $isEH:true},
 e316:{
 "^":"TpZ:79;",
-$2:function(a,b){J.oJ(a,b)},
+$2:function(a,b){a.shX(b)},
 $isEH:true},
 e317:{
 "^":"TpZ:79;",
-$2:function(a,b){J.DF(a,b)},
+$2:function(a,b){J.cl(a,b)},
 $isEH:true},
 e318:{
 "^":"TpZ:79;",
-$2:function(a,b){a.svK(b)},
+$2:function(a,b){J.BL(a,b)},
 $isEH:true},
 e319:{
 "^":"TpZ:79;",
-$2:function(a,b){J.h9(a,b)},
+$2:function(a,b){J.Ql(a,b)},
 $isEH:true},
 e320:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sL1(b)},
+$2:function(a,b){J.xQ(a,b)},
 $isEH:true},
 e321:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sEl(b)},
+$2:function(a,b){J.Mh(a,b)},
 $isEH:true},
 e322:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sxH(b)},
+$2:function(a,b){J.MX(a,b)},
 $isEH:true},
 e323:{
 "^":"TpZ:79;",
-$2:function(a,b){J.XF(a,b)},
+$2:function(a,b){J.A4(a,b)},
 $isEH:true},
 e324:{
 "^":"TpZ:79;",
-$2:function(a,b){J.A1(a,b)},
+$2:function(a,b){J.wD(a,b)},
 $isEH:true},
 e325:{
 "^":"TpZ:79;",
-$2:function(a,b){J.SF(a,b)},
+$2:function(a,b){J.wJ(a,b)},
 $isEH:true},
 e326:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Qv(a,b)},
+$2:function(a,b){J.oJ(a,b)},
 $isEH:true},
 e327:{
 "^":"TpZ:79;",
-$2:function(a,b){J.R8(a,b)},
+$2:function(a,b){J.DF(a,b)},
 $isEH:true},
 e328:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Xg(a,b)},
+$2:function(a,b){a.svK(b)},
 $isEH:true},
 e329:{
 "^":"TpZ:79;",
-$2:function(a,b){J.aw(a,b)},
+$2:function(a,b){J.h9(a,b)},
 $isEH:true},
 e330:{
 "^":"TpZ:79;",
-$2:function(a,b){J.CJ(a,b)},
+$2:function(a,b){a.sL1(b)},
 $isEH:true},
 e331:{
 "^":"TpZ:79;",
-$2:function(a,b){J.P2(a,b)},
+$2:function(a,b){a.sEl(b)},
 $isEH:true},
 e332:{
 "^":"TpZ:79;",
-$2:function(a,b){J.J0(a,b)},
+$2:function(a,b){a.sxH(b)},
 $isEH:true},
 e333:{
 "^":"TpZ:79;",
-$2:function(a,b){J.PP(a,b)},
+$2:function(a,b){J.XF(a,b)},
 $isEH:true},
 e334:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Sj(a,b)},
+$2:function(a,b){J.A1(a,b)},
 $isEH:true},
 e335:{
 "^":"TpZ:79;",
-$2:function(a,b){J.tv(a,b)},
+$2:function(a,b){J.SF(a,b)},
 $isEH:true},
 e336:{
 "^":"TpZ:79;",
-$2:function(a,b){J.w7(a,b)},
+$2:function(a,b){J.Qv(a,b)},
 $isEH:true},
 e337:{
 "^":"TpZ:79;",
-$2:function(a,b){J.ME(a,b)},
+$2:function(a,b){J.R8(a,b)},
 $isEH:true},
 e338:{
 "^":"TpZ:79;",
-$2:function(a,b){J.kX(a,b)},
+$2:function(a,b){J.Xg(a,b)},
 $isEH:true},
 e339:{
 "^":"TpZ:79;",
-$2:function(a,b){J.q0(a,b)},
+$2:function(a,b){J.aw(a,b)},
 $isEH:true},
 e340:{
 "^":"TpZ:79;",
-$2:function(a,b){J.EJ(a,b)},
+$2:function(a,b){J.CJ(a,b)},
 $isEH:true},
 e341:{
 "^":"TpZ:79;",
-$2:function(a,b){J.iH(a,b)},
+$2:function(a,b){J.P2(a,b)},
 $isEH:true},
 e342:{
 "^":"TpZ:79;",
-$2:function(a,b){J.SO(a,b)},
+$2:function(a,b){J.J0(a,b)},
 $isEH:true},
 e343:{
 "^":"TpZ:79;",
-$2:function(a,b){J.B9(a,b)},
+$2:function(a,b){J.PP(a,b)},
 $isEH:true},
 e344:{
 "^":"TpZ:79;",
-$2:function(a,b){J.PN(a,b)},
+$2:function(a,b){J.Sj(a,b)},
 $isEH:true},
 e345:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sVc(b)},
+$2:function(a,b){J.tv(a,b)},
 $isEH:true},
 e346:{
 "^":"TpZ:79;",
-$2:function(a,b){J.By(a,b)},
+$2:function(a,b){J.w7(a,b)},
 $isEH:true},
 e347:{
 "^":"TpZ:79;",
-$2:function(a,b){J.jd(a,b)},
+$2:function(a,b){J.ME(a,b)},
 $isEH:true},
 e348:{
 "^":"TpZ:79;",
-$2:function(a,b){J.uH(a,b)},
+$2:function(a,b){J.kX(a,b)},
 $isEH:true},
 e349:{
 "^":"TpZ:79;",
-$2:function(a,b){J.ZI(a,b)},
+$2:function(a,b){J.q0(a,b)},
 $isEH:true},
 e350:{
 "^":"TpZ:79;",
-$2:function(a,b){J.fa(a,b)},
+$2:function(a,b){J.EJ(a,b)},
 $isEH:true},
 e351:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Cu(a,b)},
+$2:function(a,b){J.iH(a,b)},
 $isEH:true},
 e352:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sV8(b)},
+$2:function(a,b){J.SO(a,b)},
 $isEH:true},
 e353:{
 "^":"TpZ:79;",
-$2:function(a,b){J.EC(a,b)},
+$2:function(a,b){J.B9(a,b)},
 $isEH:true},
 e354:{
 "^":"TpZ:79;",
-$2:function(a,b){J.xH(a,b)},
+$2:function(a,b){J.PN(a,b)},
 $isEH:true},
 e355:{
 "^":"TpZ:79;",
-$2:function(a,b){J.wu(a,b)},
+$2:function(a,b){a.sVc(b)},
 $isEH:true},
 e356:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Tx(a,b)},
+$2:function(a,b){J.By(a,b)},
 $isEH:true},
 e357:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sDo(b)},
+$2:function(a,b){J.jd(a,b)},
 $isEH:true},
 e358:{
 "^":"TpZ:79;",
-$2:function(a,b){a.suj(b)},
+$2:function(a,b){J.uH(a,b)},
 $isEH:true},
 e359:{
 "^":"TpZ:79;",
-$2:function(a,b){J.H3(a,b)},
+$2:function(a,b){J.ZI(a,b)},
 $isEH:true},
 e360:{
 "^":"TpZ:79;",
-$2:function(a,b){J.TZ(a,b)},
+$2:function(a,b){J.fa(a,b)},
 $isEH:true},
 e361:{
 "^":"TpZ:79;",
-$2:function(a,b){J.t3(a,b)},
+$2:function(a,b){J.Cu(a,b)},
 $isEH:true},
 e362:{
 "^":"TpZ:79;",
-$2:function(a,b){J.my(a,b)},
+$2:function(a,b){a.sV8(b)},
 $isEH:true},
 e363:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sVF(b)},
+$2:function(a,b){J.EC(a,b)},
 $isEH:true},
 e364:{
 "^":"TpZ:79;",
-$2:function(a,b){J.yO(a,b)},
+$2:function(a,b){J.xH(a,b)},
 $isEH:true},
 e365:{
 "^":"TpZ:79;",
-$2:function(a,b){J.ZU(a,b)},
+$2:function(a,b){J.wu(a,b)},
 $isEH:true},
 e366:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sjW(b)},
+$2:function(a,b){J.Tx(a,b)},
 $isEH:true},
 e367:{
 "^":"TpZ:79;",
-$2:function(a,b){J.tQ(a,b)},
+$2:function(a,b){J.HT(a,b)},
 $isEH:true},
 e368:{
 "^":"TpZ:79;",
-$2:function(a,b){J.tH(a,b)},
+$2:function(a,b){J.FH(a,b)},
 $isEH:true},
 e369:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.o8(a,b)},
 $isEH:true},
 e370:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){a.sDo(b)},
 $isEH:true},
 e371:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){a.suj(b)},
 $isEH:true},
 e372:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.H3(a,b)},
 $isEH:true},
 e373:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.TZ(a,b)},
 $isEH:true},
 e374:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.t3(a,b)},
 $isEH:true},
 e375:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.my(a,b)},
 $isEH:true},
 e376:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){a.sVF(b)},
 $isEH:true},
 e377:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.yO(a,b)},
 $isEH:true},
 e378:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.ZU(a,b)},
 $isEH:true},
 e379:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){a.sjW(b)},
 $isEH:true},
 e380:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.tQ(a,b)},
 $isEH:true},
 e381:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.tH(a,b)},
 $isEH:true},
 e382:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e383:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e384:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e385:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e386:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e387:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e388:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e389:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e390:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e391:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e392:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e393:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e394:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e395:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e396:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e397:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e398:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e399:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e400:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e401:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e402:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e403:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e404:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e405:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e406:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-ref",C.Jf)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e407:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("breakpoint-toggle",C.Nw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e408:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e409:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e410:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e411:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e412:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e413:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e414:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e415:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e416:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e417:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e418:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e419:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e420:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-ref",C.mK)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e421:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e422:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e423:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e424:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e425:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e426:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e427:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e428:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e429:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e430:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e431:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e432:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e433:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e434:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e435:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e436:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e437:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e438:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e439:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e440:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e441:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e442:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e443:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e444:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e445:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e446:{
 "^":"TpZ:74;",
+$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e447:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e448:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e449:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e450:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e451:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e452:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e453:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e454:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e455:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e456:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e457:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e458:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e459:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e460:{
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"],
-$isEH:true}},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
+$isEH:true}},1],["","",,B,{
 "^":"",
 G6:{
-"^":"tu;BW,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"tu;BW,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 grs:function(a){return a.BW},
 srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
-SK:[function(a,b){J.cI(a.BW).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.BW).YM(b)},"$1","gvC",2,0,19,100],
 static:{Dw:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -4452,23 +4525,23 @@
 return a}}},
 tu:{
 "^":"uL+Pi;",
-$isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
+$isd3:true}}],["","",,Q,{
 "^":"",
 eW:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{rt:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.YZz.ZL(a)
 C.YZz.XI(a)
-return a}}}}],["class_tree_element","package:observatory/src/elements/class_tree.dart",,O,{
+return a}}}}],["","",,O,{
 "^":"",
 CZ:{
 "^":"Y2;od>,Ru>,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
@@ -4487,16 +4560,16 @@
 o8:function(){},
 Nh:function(){return J.q8(J.Mx(this.Ru))>0}},
 eo:{
-"^":"Dsd;CA,Hm=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"Dsd;CA,Hm=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 god:function(a){return a.CA},
 sod:function(a,b){a.CA=this.ct(a,C.rB,a.CA,b)},
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=R.tB([])
-a.Hm=new G.xK(z,null,null)
+a.Hm=new G.iY(z,null,null)
 z=a.CA
 if(z!=null)this.hP(a,z.gDZ())},
-GU:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","guz",2,0,12,59],
+vD:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","guz",2,0,12,59],
 hP:function(a,b){var z,y,x,w,v,u,t,s,r,q
 try{w=a.CA
 v=H.VM([],[G.Y2])
@@ -4516,8 +4589,8 @@
 x=new H.oP(q,null)
 N.QM("").wF("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,99,100],
-LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,99,100],
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,101,102],
+ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,101,102],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
@@ -4528,48 +4601,48 @@
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.oP(u,null)
-N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,101,2,102,103],
+N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,103,2,104,105],
 static:{l0:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.RD.ZL(a)
-C.RD.XI(a)
+C.fe.ZL(a)
+C.fe.XI(a)
 return a}}},
 Dsd:{
 "^":"uL+Pi;",
 $isd3:true},
 nc:{
 "^":"TpZ:12;a",
-$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,104,"call"],
-$isEH:true}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,106,"call"],
+$isEH:true}}],["","",,Z,{
 "^":"",
 ak:{
-"^":"tuj;yB,nJ,mN,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"tuj;yB,nJ,mN,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gRu:function(a){return a.yB},
 sRu:function(a,b){a.yB=this.ct(a,C.XA,a.yB,b)},
 gWt:function(a){return a.nJ},
 sWt:function(a,b){a.nJ=this.ct(a,C.yB,a.nJ,b)},
 gCF:function(a){return a.mN},
 sCF:function(a,b){a.mN=this.ct(a,C.tg,a.mN,b)},
-vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,105,106],
-tl:[function(a,b){return a.yB.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gR1",2,0,107,108],
-S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,107,109],
+vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,107,108],
+tl:[function(a,b){return a.yB.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gR1",2,0,109,110],
+S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,109,111],
 SK:[function(a,b){a.nJ=this.ct(a,C.yB,a.nJ,null)
 a.mN=this.ct(a,C.tg,a.mN,null)
-J.cI(a.yB).YM(b)},"$1","gvC",2,0,19,98],
-j9:[function(a,b){J.eg(a.yB).YM(b)},"$1","gDX",2,0,19,98],
-static:{lW:function(a){var z,y
+J.cI(a.yB).YM(b)},"$1","gvC",2,0,19,100],
+Ur:[function(a,b){J.eg(a.yB).YM(b)},"$1","gDX",2,0,19,100],
+static:{zB:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -4580,20 +4653,20 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ob:{
-"^":"TpZ:110;a",
+"^":"TpZ:112;a",
 $1:[function(a){var z=this.a
-z.nJ=J.Q5(z,C.yB,z.nJ,a)},"$1",null,2,0,null,92,"call"],
+z.nJ=J.Q5(z,C.yB,z.nJ,a)},"$1",null,2,0,null,94,"call"],
 $isEH:true},
 SS:{
-"^":"TpZ:110;a",
+"^":"TpZ:112;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,92,"call"],
-$isEH:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
+z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,94,"call"],
+$isEH:true}}],["","",,O,{
 "^":"",
 VY:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gtT:function(a){return a.tY},
 aV:[function(a,b){Q.xI.prototype.aV.call(this,a,b)
 this.ct(a,C.i4,0,1)},"$1","gLe",2,0,12,59],
@@ -4603,16 +4676,16 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.tWO.ZL(a)
 C.tWO.XI(a)
-return a}}}}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+return a}}}}],["","",,F,{
 "^":"",
 Be:{
-"^":"Vct;Xx,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"Vct;Xx,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gtT:function(a){return a.Xx},
 stT:function(a,b){a.Xx=this.ct(a,C.i4,a.Xx,b)},
 Es:function(a){var z
@@ -4620,7 +4693,7 @@
 z=a.Xx
 if(z==null)return
 J.SK(z).ml(new F.P9())},
-SK:[function(a,b){J.cI(a.Xx).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.Xx).YM(b)},"$1","gvC",2,0,19,100],
 b0:function(a,b){var z,y,x
 z=J.Vs(b).MW.getAttribute("data-jump-target")
 if(z==="")return
@@ -4628,18 +4701,18 @@
 x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
 if(x==null)return
 return x},
-YI:[function(a,b,c,d){var z=this.b0(a,d)
+Gm:[function(a,b,c,d){var z=this.b0(a,d)
 if(z==null)return
-J.Uf(z).h(0,"highlight")},"$3","gff",6,0,111,2,102,103],
+J.Uf(z).h(0,"highlight")},"$3","gKJ",6,0,113,2,104,105],
 Lk:[function(a,b,c,d){var z=this.b0(a,d)
 if(z==null)return
-J.Uf(z).Rz(0,"highlight")},"$3","gAF",6,0,111,2,102,103],
+J.Uf(z).Rz(0,"highlight")},"$3","gAF",6,0,113,2,104,105],
 static:{fm:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -4650,12 +4723,12 @@
 "^":"uL+Pi;",
 $isd3:true},
 P9:{
-"^":"TpZ:112;",
+"^":"TpZ:114;",
 $1:[function(a){a.OF()},"$1",null,2,0,null,83,"call"],
-$isEH:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
+$isEH:true}}],["","",,R,{
 "^":"",
 JI:{
-"^":"SaM;tH,uo,nx,oM,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"SaM;tH,uo,nx,oM,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 goE:function(a){return a.tH},
 soE:function(a,b){a.tH=this.ct(a,C.mr,a.tH,b)},
 gv8:function(a){return a.uo},
@@ -4676,7 +4749,7 @@
 if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
 this.AV(a,a.tH!==!0,this.gN2(a))}else{z=a.tH
 a.tH=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,82,49,50,83],
-static:{oS:function(a){var z,y
+static:{U9:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -4685,7 +4758,7 @@
 a.nx=null
 a.oM=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -4694,15 +4767,15 @@
 return a}}},
 SaM:{
 "^":"xc+Pi;",
-$isd3:true}}],["dart._internal","dart:_internal",,H,{
+$isd3:true}}],["","",,H,{
 "^":"",
 bQ:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Oq(a,0)]);z.G();)b.$1(z.lo)},
-Ck:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Oq(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b.$1(z.lo)},
+CkK:function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
 return!1},
 n3:function(a,b,c){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Oq(a,0)]);z.G();)b=c.$2(b,z.lo)
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b=c.$2(b,z.lo)
 return b},
 Ap:function(a,b){var z,y,x,w,v
 z=[]
@@ -4729,7 +4802,7 @@
 y=J.x(d)
 if(!!y.$isWO){x=e
 w=d}else{w=y.eR(d,e).tt(0,!1)
-x=0}if(J.z8(J.ew(x,z),J.q8(w)))throw H.b(H.ar())
+x=0}if(J.xZ(J.ew(x,z),J.q8(w)))throw H.b(H.ar())
 H.tb(w,x,a,b,z)},
 IC:function(a,b,c){var z,y,x,w
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
@@ -4771,7 +4844,7 @@
 w9:function(a,b,c,d){var z,y,x,w,v
 for(z=b+1,y=J.U6(a);z<=c;++z){x=y.t(a,z)
 w=z
-while(!0){if(!(w>b&&J.z8(d.$2(y.t(a,w-1),x),0)))break
+while(!0){if(!(w>b&&J.xZ(d.$2(y.t(a,w-1),x),0)))break
 v=w-1
 y.u(a,w,y.t(a,v))
 w=v}y.u(a,w,x)}},
@@ -4788,23 +4861,23 @@
 q=t.t(a,w)
 p=t.t(a,u)
 o=t.t(a,x)
-if(J.z8(d.$2(s,r),0)){n=r
+if(J.xZ(d.$2(s,r),0)){n=r
 r=s
-s=n}if(J.z8(d.$2(p,o),0)){n=o
+s=n}if(J.xZ(d.$2(p,o),0)){n=o
 o=p
-p=n}if(J.z8(d.$2(s,q),0)){n=q
+p=n}if(J.xZ(d.$2(s,q),0)){n=q
 q=s
-s=n}if(J.z8(d.$2(r,q),0)){n=q
+s=n}if(J.xZ(d.$2(r,q),0)){n=q
 q=r
-r=n}if(J.z8(d.$2(s,p),0)){n=p
+r=n}if(J.xZ(d.$2(s,p),0)){n=p
 p=s
-s=n}if(J.z8(d.$2(q,p),0)){n=p
+s=n}if(J.xZ(d.$2(q,p),0)){n=p
 p=q
-q=n}if(J.z8(d.$2(r,o),0)){n=o
+q=n}if(J.xZ(d.$2(r,o),0)){n=o
 o=r
-r=n}if(J.z8(d.$2(r,q),0)){n=q
+r=n}if(J.xZ(d.$2(r,q),0)){n=q
 q=r
-r=n}if(J.z8(d.$2(p,o),0)){n=o
+r=n}if(J.xZ(d.$2(p,o),0)){n=o
 o=p
 p=n}t.u(a,y,s)
 t.u(a,w,q)
@@ -4833,7 +4906,7 @@
 l=g
 break}}}}e=!0}else{for(k=m;k<=l;++k){j=t.t(a,k)
 if(J.u6(d.$2(j,r),0)){if(k!==m){t.u(a,k,t.t(a,m))
-t.u(a,m,j)}++m}else if(J.z8(d.$2(j,p),0))for(;!0;)if(J.z8(d.$2(t.t(a,l),p),0)){--l
+t.u(a,m,j)}++m}else if(J.xZ(d.$2(j,p),0))for(;!0;)if(J.xZ(d.$2(t.t(a,l),p),0)){--l
 if(l<k)break
 continue}else{g=l-1
 if(J.u6(d.$2(t.t(a,l),r),0)){t.u(a,k,t.t(a,m))
@@ -4885,7 +4958,7 @@
 y=0
 for(;y<z;++y){if(J.xC(this.Zv(0,y),b))return!0
 if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
-ou:function(a,b){var z,y
+Vr:function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=0
@@ -4918,6 +4991,7 @@
 x=0
 for(;x<z;++x){y=c.$2(y,this.Zv(0,x))
 if(z!==this.gB(this))throw H.b(P.a4(this))}return y},
+eR:function(a,b){return H.c1(this,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(this,"aL",0)])
 C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
@@ -4945,12 +5019,12 @@
 gMa:function(){var z,y
 z=J.q8(this.l6)
 y=this.AN
-if(y==null||J.z8(y,z))return z
+if(y==null||J.xZ(y,z))return z
 return y},
 gjX:function(){var z,y
 z=J.q8(this.l6)
 y=this.SH
-if(J.z8(y,z))return z
+if(J.xZ(y,z))return z
 return y},
 gB:function(a){var z,y,x
 z=J.q8(this.l6)
@@ -5006,7 +5080,7 @@
 grZ:function(a){return this.mb(J.uY(this.l6))},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
-static:{K1:function(a,b,c,d){if(!!J.x(a).$isyN)return H.VM(new H.xy(a,b),[c,d])
+static:{fR:function(a,b,c,d){if(!!J.x(a).$isyN)return H.VM(new H.xy(a,b),[c,d])
 return H.VM(new H.i1(a,b),[c,d])}}},
 xy:{
 "^":"i1;l6,T6",
@@ -5059,6 +5133,36 @@
 z=J.mY(this.mb(y.gl()))
 this.e0=z}else return!1}this.lo=this.e0.gl()
 return!0}},
+AM:{
+"^":"mW;l6,FT",
+eR:function(a,b){if(b<0)throw H.b(P.N(b))
+return H.ke(this.l6,this.FT+b,H.u3(this,0))},
+gA:function(a){var z=this.l6
+z=new H.ig(z.gA(z),this.FT)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+return z},
+jb:function(a,b,c){if(this.FT<0)throw H.b(P.KP(this.FT))},
+static:{ke:function(a,b,c){var z
+if(!!a.$isyN){z=H.VM(new H.wB(a,b),[c])
+z.jb(a,b,c)
+return z}return H.wb(a,b,c)},wb:function(a,b,c){var z=H.VM(new H.AM(a,b),[c])
+z.jb(a,b,c)
+return z}}},
+wB:{
+"^":"AM;l6,FT",
+gB:function(a){var z,y
+z=this.l6
+y=J.Hn(z.gB(z),this.FT)
+if(J.J5(y,0))return y
+return 0},
+$isyN:true},
+ig:{
+"^":"Anv;OI,FT",
+G:function(){var z,y
+for(z=this.OI,y=0;y<this.FT;++y)z.G()
+this.FT=0
+return z.G()},
+gl:function(){return this.OI.gl()}},
 FuS:{
 "^":"a;",
 G:function(){return!1},
@@ -5074,7 +5178,7 @@
 Nk:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
 UZ:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
-Zl:{
+ReL:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
@@ -5097,7 +5201,7 @@
 $isQV:true,
 $asQV:null},
 w2Y:{
-"^":"ark+Zl;",
+"^":"ark+ReL;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
@@ -5122,15 +5226,21 @@
 bu:[function(a){return"Symbol(\""+H.d(this.fN)+"\")"},"$0","gAY",0,0,74],
 $istx:true,
 $isIN:true,
-static:{"^":"RWj,ES1,quP,KGP,eD,fbV"}}}],["dart._js_names","dart:_js_names",,H,{
+static:{"^":"RWj,ES1,quP,KGP,eD,fbV"}}}],["","",,H,{
 "^":"",
 kU:function(a){var z=H.VM(function(b,c){var y=[]
 for(var x in b){if(c.call(b,x))y.push(x)}return y}(a,Object.prototype.hasOwnProperty),[null])
 z.fixed$length=init
-return z}}],["dart.async","dart:async",,P,{
+return z}}],["","",,P,{
 "^":"",
-xg:function(){if(self.scheduleImmediate!=null)return P.vd()
-return P.K7()},
+xg:function(){var z,y,x
+z={}
+if(self.scheduleImmediate!=null)return P.vd()
+if(self.MutationObserver!=null&&self.document!=null){y=self.document.createElement("div")
+x=self.document.createElement("span")
+z.a=null
+new self.MutationObserver(H.tR(new P.th(z),1)).observe(y,{childList:true})
+return new P.ha(z,y,x)}return P.K7()},
 ZV:[function(a){++init.globalState.Xz.GL
 self.scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,18],
 Bz:[function(a){P.YF(C.ny,a)},"$1","K7",2,0,18],
@@ -5139,7 +5249,7 @@
 if(z)return b.O8(a)
 else return b.wY(a)},
 Iw:function(a,b){var z=P.Dt(b)
-P.rT(C.ny,new P.Vq(a,z))
+P.cH(C.ny,new P.w4(a,z))
 return z},
 Ne:function(a,b){var z,y,x,w,v
 z={}
@@ -5149,7 +5259,7 @@
 z.d=null
 z.e=null
 y=new P.mQ(z,b)
-for(x=H.VM(new H.a7(a,a.length,0,null),[H.Oq(a,0)]);x.G();)x.lo.Rx(new P.Tw(z,b,z.c++),y)
+for(x=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);x.G();)x.lo.Rx(new P.Tw(z,b,z.c++),y)
 y=z.c
 if(y===0)return P.Ab(C.dn,null)
 w=Array(y)
@@ -5185,10 +5295,10 @@
 y=v
 x=new H.oP(w,null)
 $.X3.hk(y,x)}},
-HC:[function(a){},"$1","C7",2,0,19,20],
+QEz:[function(a){},"$1","yy",2,0,19,20],
 SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","Xq",2,2,21,22,23,24],
 dL:[function(){},"$0","v3",0,0,17],
-zE:function(a,b,c){var z,y,x,w
+FE:function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.oP(x,null)
@@ -5200,7 +5310,7 @@
 Bb:function(a,b,c){var z=a.ed()
 if(!!J.x(z).$isb8)z.YM(new P.QX(b,c))
 else b.rX(c)},
-rT:function(a,b){var z
+cH:function(a,b){var z
 if(J.xC($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
@@ -5223,7 +5333,7 @@
 if(J.xC($.X3,c))return d.$1(e)
 z=P.Us(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","MM",10,0,31,26,27,28,30,32],
+return y}finally{$.X3=z}},"$5","J6",10,0,31,26,27,28,30,32],
 Mu:[function(a,b,c,d,e,f){var z,y
 if(J.xC($.X3,c))return d.$2(e,f)
 z=P.Us(c)
@@ -5243,7 +5353,7 @@
 $.k8=y}},"$4","G2",8,0,37,26,27,28,30],
 PB:[function(a,b,c,d,e){return P.YF(d,C.NU!==c?c.ce(e):e)},"$5","vRP",10,0,38,26,27,28,39,40],
 PD:[function(a,b,c,d,e){return P.dp(d,C.NU!==c?c.UG(e):e)},"$5","oo",10,0,41,26,27,28,39,40],
-JjS:[function(a,b,c,d){H.qw(H.d(d))},"$4","hI",8,0,42,26,27,28,43],
+JjS:[function(a,b,c,d){H.qw(H.d(d))},"$4","uy1",8,0,42,26,27,28,43],
 CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,44],
 E1:[function(a,b,c,d,e){var z,y
 $.oK=P.jt()
@@ -5254,6 +5364,23 @@
 z.FV(0,e)}y=new P.FQ(null,null,null,null,null,null,null,null,null,null,null,null,null,c,z)
 y.UE(c,d,z)
 return y},"$5","H2",10,0,45,26,27,28,46,47],
+th:{
+"^":"TpZ:12;a",
+$1:[function(a){var z,y
+H.cv()
+z=this.a
+y=z.a
+z.a=null
+y.$0()},"$1",null,2,0,null,13,"call"],
+$isEH:true},
+ha:{
+"^":"TpZ:115;a,b,c",
+$1:function(a){var z,y;++init.globalState.Xz.GL
+this.a.a=a
+z=this.b
+y=this.c
+z.firstChild?z.removeChild(y):z.appendChild(y)},
+$isEH:true},
 C6:{
 "^":"TpZ:74;a",
 $0:[function(){H.cv()
@@ -5287,6 +5414,9 @@
 static:{"^":"E2b,HCK,VCd"}},
 WVu:{
 "^":"a;iE@,SJ@",
+gvq:function(a){var z=new P.Ik(this)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+return z},
 gUF:function(){return!1},
 SL:function(){var z=this.yx
 if(z!=null)return z
@@ -5309,7 +5439,7 @@
 y=d?1:0
 x=new P.LR(null,null,null,this,null,null,null,z,y,null,null)
 x.$builtinTypeInfo=this.$builtinTypeInfo
-x.aA(a,b,c,d,H.Oq(this,0))
+x.aA(a,b,c,d,H.u3(this,0))
 x.SJ=x
 x.iE=x
 y=this.SJ
@@ -5329,9 +5459,9 @@
 q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"$1","gL0",2,0,function(){return H.IGs(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"WVu")},113],
+this.Iv(b)},"$1","gL0",2,0,function(){return H.IGs(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"WVu")},116],
 ld:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.ld(a,null)},"JT","$2","$1","gGj",2,2,114,22,23,24],
+this.pb(a,b)},function(a){return this.ld(a,null)},"JT","$2","$1","gGj",2,2,117,22,23,24],
 xO:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.yx
@@ -5385,12 +5515,12 @@
 "^":"TpZ;a,b",
 $1:function(a){a.Rg(0,this.b)},
 $isEH:true,
-$signature:function(){return H.IGs(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
+$signature:function(){return H.IGs(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"zW")}},
 OR:{
 "^":"TpZ;a,b,c",
 $1:function(a){a.oJ(this.b,this.c)},
 $isEH:true,
-$signature:function(){return H.IGs(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
+$signature:function(){return H.IGs(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"zW")}},
 Bg:{
 "^":"TpZ;a",
 $1:function(a){a.Qj()},
@@ -5410,7 +5540,7 @@
 b8:{
 "^":"a;",
 $isb8:true},
-Vq:{
+w4:{
 "^":"TpZ:74;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
@@ -5427,10 +5557,10 @@
 x=--z.c
 if(y!=null)if(x===0||this.b)z.a.w0(a,b)
 else{z.d=a
-z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,115,116,"call"],
+z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,118,119,"call"],
 $isEH:true},
 Tw:{
-"^":"TpZ:117;a,c,d",
+"^":"TpZ:120;a,c,d",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=--z.c
@@ -5442,22 +5572,22 @@
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,20,"call"],
 $isEH:true},
-A5:{
+A0:{
 "^":"a;",
-$isA5:true},
+$isA0:true},
 Pf0:{
 "^":"a;",
-$isA5:true},
+$isA0:true},
 Zf:{
 "^":"Pf0;MM",
 j3:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,118,22,20],
+z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,121,22,20],
 w0:[function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,114,22,23,24]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,117,22,23,24]},
 Gc:{
 "^":"a;Gv,Lj<,jk,BQ@,OY?,As?,qV?,o4?",
 gcg:function(){return this.Gv>=4},
@@ -5514,7 +5644,7 @@
 P.HZ(this,z)},
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Qp","$2","$1","gaq",2,2,21,22,23,24],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"u3","$2","$1","gaq",2,2,21,22,23,24],
 OH:function(a){var z
 if(a==null);else{z=J.x(a)
 if(!!z.$isb8){if(!!z.$isGc){z=a.Gv
@@ -5536,7 +5666,7 @@
 return z},Vu:function(a,b,c){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
 return z},k3:function(a,b){b.swG(!0)
-a.Rx(new P.U7(b),new P.vr(b))},A9:function(a,b){b.swG(!0)
+a.Rx(new P.U7(b),new P.VL(b))},A9:function(a,b){b.swG(!0)
 if(a.Gv>=4)P.HZ(a,b)
 else a.au(b)},yE:function(a,b){var z
 do{z=b.gBQ()
@@ -5594,8 +5724,8 @@
 "^":"TpZ:12;a",
 $1:[function(a){this.a.R8(a)},"$1",null,2,0,null,20,"call"],
 $isEH:true},
-vr:{
-"^":"TpZ:119;b",
+VL:{
+"^":"TpZ:122;b",
 $2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,22,23,24,"call"],
 $isEH:true},
 cX:{
@@ -5611,7 +5741,7 @@
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"TpZ:120;b,d,e,f",
+"^":"TpZ:123;b,d,e,f",
 $0:function(){var z,y,x,w
 try{this.b.c=this.f.FI(this.d.gO1(),this.e)
 return!0}catch(x){w=H.Ru(x)
@@ -5678,10 +5808,10 @@
 $isEH:true},
 jZ:{
 "^":"TpZ:12;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,121,"call"],
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,124,"call"],
 $isEH:true},
 FZ:{
-"^":"TpZ:119;a,mG",
+"^":"TpZ:122;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isGc){y=P.Dt(null)
@@ -5693,8 +5823,8 @@
 Ki:function(a){return this.FR.$0()}},
 wS:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"bp",ret:P.wS,args:[{func:"Pw",args:[a]}]}},this.$receiver,"wS")},122],
-lM:[function(a,b){return H.VM(new P.AE(b,this),[H.ip(this,"wS",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"xv",ret:P.wS,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},122],
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"bp",ret:P.wS,args:[{func:"Pw",args:[a]}]}},this.$receiver,"wS")},125],
+lM:[function(a,b){return H.VM(new P.AE(b,this),[H.ip(this,"wS",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"xv",ret:P.wS,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},125],
 tg:function(a,b){var z,y
 z={}
 y=P.Dt(P.a2)
@@ -5707,7 +5837,7 @@
 z.a=null
 z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gaq())
 return y},
-ou:function(a,b){var z,y
+Vr:function(a,b){var z,y
 z={}
 y=P.Dt(P.a2)
 z.a=null
@@ -5730,6 +5860,9 @@
 y=P.Dt([P.xu,H.ip(this,"wS",0)])
 this.KR(new P.oY(this,z),!0,new P.yZ(z,y),y.gaq())
 return y},
+eR:function(a,b){var z=H.VM(new P.pt(b,this),[null])
+z.U6(this,b,null)
+return z},
 grZ:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"wS",0))
@@ -5743,7 +5876,7 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.zE(new P.Oh(this.c,a),new P.jvH(z,y),P.TB(z.a,y))},"$1",null,2,0,null,123,"call"],
+P.FE(new P.Oh(this.c,a),new P.jvH(z,y),P.TB(z.a,y))},"$1",null,2,0,null,126,"call"],
 $isEH:true,
 $signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 Oh:{
@@ -5751,7 +5884,7 @@
 $0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
 jvH:{
-"^":"TpZ:124;a,UI",
+"^":"TpZ:127;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 tG:{
@@ -5760,7 +5893,7 @@
 $isEH:true},
 lz:{
 "^":"TpZ;a,b,c,d",
-$1:[function(a){P.zE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,123,"call"],
+$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,126,"call"],
 $isEH:true,
 $signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 Rl:{
@@ -5780,7 +5913,7 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.zE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,123,"call"],
+P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,126,"call"],
 $isEH:true,
 $signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 WN:{
@@ -5788,7 +5921,7 @@
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 XPB:{
-"^":"TpZ:124;a,UI",
+"^":"TpZ:127;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 Ia:{
@@ -5813,7 +5946,7 @@
 $isEH:true},
 oY:{
 "^":"TpZ;a,b",
-$1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,113,"call"],
+$1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,116,"call"],
 $isEH:true,
 $signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
 yZ:{
@@ -5866,7 +5999,7 @@
 this.Gv=(z+128|4)>>>0
 if(b!=null)b.YM(this.gDQ(this))
 if(z<128&&this.Ri!=null)this.Ri.IO()
-if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,22,126],
+if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,128,22,129],
 QE:[function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
@@ -5961,7 +6094,7 @@
 this.fm(0,b)
 this.Bd=z.Al(c==null?P.v3():c)},
 $isyX:true,
-static:{"^":"Xx,kMJ,nS,Ir9,nav,Dr,JAK,vo,Pj",T6:function(a,b,c,d,e){var z,y
+static:{"^":"Xx,kMJ,nS,Ir9,nav,lkp,JAK,vo,Pj",T6:function(a,b,c,d,e){var z,y
 z=$.X3
 y=d?1:0
 y=H.VM(new P.KA(null,null,null,z,y,null,null),[e])
@@ -5974,15 +6107,15 @@
 y=z.Gv
 if((y&8)!==0&&(y&16)===0)return
 z.Gv=(y|32)>>>0
-y=z.Lj
-if(!y.fC($.X3))$.X3.hk(this.b,this.c)
-else{x=z.o7
-w=H.G3()
-w=H.KT(w,[w,w]).BD(x)
-v=z.o7
-u=this.b
-if(w)y.z8(v,u,this.c)
-else y.m1(v,u)}z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
+y=z.o7
+x=H.G3()
+x=H.KT(x,[x,x]).BD(y)
+w=z.Lj
+v=this.b
+u=z.o7
+if(x)w.z8(u,v,this.c)
+else w.m1(u,v)
+z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
 qB:{
 "^":"TpZ:17;a",
@@ -5999,7 +6132,7 @@
 KR:function(a,b,c,d){return this.ht(a,d,c,!0===b)},
 yI:function(a){return this.KR(a,null,null,null)},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
-ht:function(a,b,c,d){return P.T6(a,b,c,d,H.Oq(this,0))}},
+ht:function(a,b,c,d){return P.T6(a,b,c,d,H.u3(this,0))}},
 ti:{
 "^":"a;aw@"},
 fZ:{
@@ -6054,7 +6187,7 @@
 this.Gv=(this.Gv|2)>>>0},
 fm:function(a,b){},
 Fv:[function(a,b){this.Gv+=4
-if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,22,126],
+if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,128,22,129],
 QE:[function(a){var z=this.Gv
 if(z>=4){z-=4
 this.Gv=z
@@ -6073,7 +6206,7 @@
 $0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"TpZ:127;a,b",
+"^":"TpZ:130;a,b",
 $2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
 QX:{
@@ -6111,8 +6244,8 @@
 tA:function(){var z=this.Ee
 if(z!=null){this.Ee=null
 z.ed()}return},
-vx:[function(a){this.KQ.kM(a,this)},"$1","gOa",2,0,function(){return H.IGs(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},113],
-xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,128,23,24],
+vx:[function(a){this.KQ.kM(a,this)},"$1","gOa",2,0,function(){return H.IGs(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},116],
+xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,131,23,24],
 TE:[function(){this.Qj()},"$0","gH1",0,0,17],
 Xa:function(a,b,c,d,e,f,g){var z,y
 z=this.gOa()
@@ -6122,10 +6255,10 @@
 $asyX:function(a,b){return[b]}},
 nO:{
 "^":"og;ZP,Sb",
-Dr:function(a){return this.ZP.$1(a)},
+wW:function(a){return this.ZP.$1(a)},
 kM:function(a,b){var z,y,x,w,v
 z=null
-try{z=this.Dr(a)}catch(w){v=H.Ru(w)
+try{z=this.wW(a)}catch(w){v=H.Ru(w)
 y=v
 x=new H.oP(w,null)
 b.oJ(y,x)
@@ -6151,28 +6284,36 @@
 y=w
 x=new H.oP(v,null)
 b.oJ(y,x)}}},
-Xa:{
+pt:{
+"^":"og;Em,Sb",
+kM:function(a,b){var z=this.Em
+if(z>0){this.Em=z-1
+return}b.Rg(0,a)},
+U6:function(a,b,c){if(b<0)throw H.b(P.u(b))},
+$asog:function(a){return[a,a]},
+$aswS:null},
+kWp:{
 "^":"a;"},
 fM:{
-"^":"a;M5,ig>"},
+"^":"a;JR,ig>"},
 n7:{
 "^":"a;"},
 yQ:{
-"^":"a;E2,hY,U1,jH,Ka,Xp,at,rb,Zq,NW,mp,xk",
+"^":"a;E2,hY,U1,eoY,Ka,Xp,at,rb,Zq,NW,JS,xk",
 hk:function(a,b){return this.E2.$2(a,b)},
 Gr:function(a){return this.hY.$1(a)},
 FI:function(a,b){return this.U1.$2(a,b)},
-mg:function(a,b,c){return this.jH.$3(a,b,c)},
+mg:function(a,b,c){return this.eoY.$3(a,b,c)},
 Al:function(a){return this.Ka.$1(a)},
 wY:function(a){return this.Xp.$1(a)},
 O8:function(a){return this.at.$1(a)},
 wr:function(a){return this.rb.$1(a)},
 RK:function(a,b){return this.rb.$2(a,b)},
 uN:function(a,b){return this.Zq.$2(a,b)},
-Ch:function(a,b){return this.mp.$1(b)},
-qp:function(a){return this.xk.$1$specification(a)},
+Ch:function(a,b){return this.JS.$1(b)},
+iT:function(a){return this.xk.$1$specification(a)},
 $isyQ:true},
-e4y:{
+AN:{
 "^":"a;"},
 dl:{
 "^":"a;"},
@@ -6180,20 +6321,20 @@
 "^":"a;Fu",
 RK:function(a,b){var z,y
 z=this.Fu.gwe()
-y=z.M5
+y=z.JR
 z.ig.$4(y,P.HM(y),a,b)}},
 m0:{
 "^":"a;",
 fC:function(a){return this.gF7()===a.gF7()},
 $ism0:true},
 FQ:{
-"^":"m0;rA<,X2<,n8<,z0<,MQ<,CK<,we<,PN<,WB<,TL<,Pf<,Zo<,l5,eT>,Se<",
+"^":"m0;rA<,X2<,n8<,z0<,MQ<,CK<,we<,PN<,WB<,TL<,DK<,Zo<,l5,eT>,Se<",
 gQc:function(){var z=this.l5
 if(z!=null)return z
 z=new P.Id(this)
 this.l5=z
 return z},
-gF7:function(){return this.Zo.M5},
+gF7:function(){return this.Zo.JR},
 bH:function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
@@ -6233,58 +6374,58 @@
 return w}return},
 hk:function(a,b){var z,y,x
 z=this.Zo
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$5(y,x,this,a,b)},
 uI:function(a,b){var z,y,x
-z=this.Pf
-y=z.M5
+z=this.DK
+y=z.JR
 x=P.HM(y)
 return z.ig.$5(y,x,this,a,b)},
-qp:function(a){return this.uI(a,null)},
+iT:function(a){return this.uI(a,null)},
 Gr:function(a){var z,y,x
 z=this.X2
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$4(y,x,this,a)},
 FI:function(a,b){var z,y,x
 z=this.rA
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$5(y,x,this,a,b)},
 mg:function(a,b,c){var z,y,x
 z=this.n8
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$6(y,x,this,a,b,c)},
 Al:function(a){var z,y,x
 z=this.z0
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$4(y,x,this,a)},
 wY:function(a){var z,y,x
 z=this.MQ
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$4(y,x,this,a)},
 O8:function(a){var z,y,x
 z=this.CK
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$4(y,x,this,a)},
 wr:function(a){var z,y,x
 z=this.we
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$4(y,x,this,a)},
 uN:function(a,b){var z,y,x
 z=this.PN
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$5(y,x,this,a,b)},
 Ch:function(a,b){var z,y,x
 z=this.TL
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$4(y,x,this,b)},
 UE:function(a,b,c){var z
@@ -6300,7 +6441,7 @@
 this.PN=this.eT.gPN()
 this.WB=this.eT.gWB()
 this.TL=this.eT.gTL()
-this.Pf=this.eT.gPf()
+this.DK=this.eT.gDK()
 this.Zo=this.eT.gZo()}},
 OJ:{
 "^":"TpZ:74;a,b",
@@ -6348,10 +6489,10 @@
 gPN:function(){return C.Sq},
 gWB:function(){return C.NA},
 gTL:function(){return C.uo},
-gPf:function(){return C.mc},
+gDK:function(){return C.mc},
 gZo:function(){return C.Rt},
 geT:function(a){return},
-gSe:function(){return $.wb()},
+gSe:function(){return $.OL()},
 gQc:function(){var z=$.Sk
 if(z!=null)return z
 z=new P.Id(this)
@@ -6390,7 +6531,7 @@
 t:function(a,b){return},
 hk:function(a,b){return P.CK(null,null,this,a,b)},
 uI:function(a,b){return P.E1(null,null,this,a,b)},
-qp:function(a){return this.uI(a,null)},
+iT:function(a){return this.uI(a,null)},
 Gr:function(a){if($.X3===C.NU)return a.$0()
 return P.T8(null,null,this,a)},
 FI:function(a,b){if($.X3===C.NU)return a.$1(b)
@@ -6427,7 +6568,7 @@
 dM:{
 "^":"TpZ:79;c,d",
 $2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
-$isEH:true}}],["dart.collection","dart:collection",,P,{
+$isEH:true}}],["","",,P,{
 "^":"",
 EF:function(a,b,c){return H.B7(a,H.VM(new P.YB(0,null,null,null,null,null,0),[b,c]))},
 Fl:function(a,b){return H.VM(new P.YB(0,null,null,null,null,null,0),[a,b])},
@@ -6520,8 +6661,8 @@
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
-gvc:function(a){return H.VM(new P.fG(this),[H.Oq(this,0)])},
-gUQ:function(a){return H.K1(H.VM(new P.fG(this),[H.Oq(this,0)]),new P.oi(this),H.Oq(this,0),H.Oq(this,1))},
+gvc:function(a){return H.VM(new P.fG(this),[H.u3(this,0)])},
+gUQ:function(a){return H.fR(H.VM(new P.fG(this),[H.u3(this,0)]),new P.oi(this),H.u3(this,0),H.u3(this,1))},
 x4:function(a,b){var z,y
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
@@ -6623,7 +6764,7 @@
 return z}}},
 oi:{
 "^":"TpZ:12;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,129,"call"],
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,132,"call"],
 $isEH:true},
 DJ:{
 "^":"TpZ;a",
@@ -6696,8 +6837,8 @@
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
-gvc:function(a){return H.VM(new P.i5(this),[H.Oq(this,0)])},
-gUQ:function(a){return H.K1(H.VM(new P.i5(this),[H.Oq(this,0)]),new P.a1(this),H.Oq(this,0),H.Oq(this,1))},
+gvc:function(a){return H.VM(new P.i5(this),[H.u3(this,0)])},
+gUQ:function(a){return H.fR(H.VM(new P.i5(this),[H.u3(this,0)]),new P.a1(this),H.u3(this,0),H.u3(this,1))},
 x4:function(a,b){var z,y
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)return!1
@@ -6811,13 +6952,13 @@
 return z}}},
 a1:{
 "^":"TpZ:12;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,129,"call"],
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,132,"call"],
 $isEH:true},
 pk:{
 "^":"TpZ;a",
 $2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,77,20,"call"],
 $isEH:true,
-$signature:function(){return H.IGs(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
+$signature:function(){return H.IGs(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"YB")}},
 db:{
 "^":"a;kh>,cA@,DG@,zQ@"},
 i5:{
@@ -6850,7 +6991,7 @@
 this.zq=this.zq.gDG()
 return!0}}}},
 jg:{
-"^":"u3T;X5,vv,OX,OB,DM",
+"^":"u3T;X5,vv,OX,OB,CQ",
 Ys:function(){var z=new P.jg(0,null,null,null,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
@@ -6893,13 +7034,13 @@
 x=y}return this.jn(x,b)}else return this.NZ(0,b)},
 NZ:function(a,b){var z,y,x
 z=this.OB
-if(z==null){z=P.Ym()
+if(z==null){z=P.V5()
 this.OB=z}y=this.nm(b)
 x=z[y]
 if(x==null)z[y]=[b]
 else{if(this.aH(x,b)>=0)return!1
 x.push(b)}++this.X5
-this.DM=null
+this.CQ=null
 return!0},
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(0,z.gl())},
@@ -6912,16 +7053,16 @@
 y=z[this.nm(a)]
 x=this.aH(y,a)
 if(x<0)return!1;--this.X5
-this.DM=null
+this.CQ=null
 y.splice(x,1)
 return!0},
-V1:function(a){if(this.X5>0){this.DM=null
+V1:function(a){if(this.X5>0){this.CQ=null
 this.OB=null
 this.OX=null
 this.vv=null
 this.X5=0}},
 Zl:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.DM
+z=this.CQ
 if(z!=null)return z
 y=Array(this.X5)
 y.fixed$length=init
@@ -6937,14 +7078,14 @@
 v=w.length
 for(t=0;t<v;++t){q=r[w[t]]
 p=q.length
-for(o=0;o<p;++o){y[u]=q[o];++u}}}this.DM=y
+for(o=0;o<p;++o){y[u]=q[o];++u}}}this.CQ=y
 return y},
 jn:function(a,b){if(a[b]!=null)return!1
 a[b]=0;++this.X5
-this.DM=null
+this.CQ=null
 return!0},
 Nv:function(a,b){if(a!=null&&a[b]!=null){delete a[b];--this.X5
-this.DM=null
+this.CQ=null
 return!0}else return!1},
 nm:function(a){return J.v1(a)&0x3ffffff},
 aH:function(a,b){var z,y
@@ -6956,18 +7097,18 @@
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{Ym:function(){var z=Object.create(null)
+static:{V5:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
 return z}}},
 cN:{
-"^":"a;O2,DM,zi,fD",
+"^":"a;O2,CQ,zi,fD",
 gl:function(){return this.fD},
 G:function(){var z,y,x
-z=this.DM
+z=this.CQ
 y=this.zi
 x=this.O2
-if(z!==x.DM)throw H.b(P.a4(x))
+if(z!==x.CQ)throw H.b(P.a4(x))
 else if(y>=z.length){this.fD=null
 return!1}else{this.fD=z[y]
 this.zi=y+1
@@ -7126,9 +7267,9 @@
 return z}},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"Uy",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},30],
+ez:[function(a,b){return H.fR(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"Uy",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},30],
 ad:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"RS",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},30],
+lM:[function(a,b){return H.VM(new H.oA(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"Gba",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},30],
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
 return!1},
@@ -7138,13 +7279,12 @@
 z=this.gA(this)
 if(!z.G())return""
 y=P.p9("")
-if(b==="")do{x=H.d(z.gl())
-y.vM+=x}while(z.G())
-else{y.KF(H.d(z.gl()))
+if(b===""){do{x=H.d(z.gl())
+y.vM+=x}while(z.G())}else{y.KF(H.d(z.gl()))
 for(;z.G();){y.vM+=b
 x=H.d(z.gl())
 y.vM+=x}}return y.vM},
-ou:function(a,b){var z
+Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
 return!1},
 tt:function(a,b){return P.F(this,b,H.ip(this,"mW",0))},
@@ -7158,6 +7298,7 @@
 return y},
 gl0:function(a){return!this.gA(this).G()},
 gor:function(a){return this.gl0(this)!==!0},
+eR:function(a,b){return H.ke(this,b,H.ip(this,"mW",0))},
 grZ:function(a){var z,y
 z=this.gA(this)
 if(!z.G())throw H.b(H.DU())
@@ -7198,7 +7339,7 @@
 z=this.gB(a)
 for(y=0;y<this.gB(a);++y){if(J.xC(this.t(a,y),b))return!0
 if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
-ou:function(a,b){var z,y
+Vr:function(a,b){var z,y
 z=this.gB(a)
 for(y=0;y<z;++y){if(b.$1(this.t(a,y))===!0)return!0
 if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
@@ -7209,7 +7350,7 @@
 return z.vM},
 ad:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
 ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"fQO",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},30],
-lM:[function(a,b){return H.VM(new H.oA(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"Gba",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},30],
+lM:[function(a,b){return H.VM(new H.oA(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"PAJ",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},30],
 eR:function(a,b){return H.c1(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
@@ -7227,7 +7368,7 @@
 this.sB(a,z+1)
 this.u(a,z,b)},
 FV:function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Oq(b,0)]);z.G();){y=z.lo
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.G();){y=z.lo
 x=this.gB(a)
 this.sB(a,x+1)
 this.u(a,x,y)}},
@@ -7277,7 +7418,7 @@
 if(c>=this.gB(a))return-1
 for(z=c;z<this.gB(a);++z)if(J.xC(this.t(a,z),b))return z
 return-1},
-kJ:function(a,b){return this.XU(a,b,0)},
+Mw:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){var z
 c=this.gB(a)-1
 for(z=c;z>=0;--z)if(J.xC(this.t(a,z),b))return z
@@ -7307,6 +7448,37 @@
 $isyN:true,
 $isQV:true,
 $asQV:null},
+KPM:{
+"^":"a;",
+u:function(a,b,c){throw H.b(P.f("Cannot modify unmodifiable map"))},
+FV:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
+V1:function(a){throw H.b(P.f("Cannot modify unmodifiable map"))},
+Rz:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
+$isZ0:true,
+$asZ0:null},
+Pnf:{
+"^":"a;",
+t:function(a,b){return this.Fb.t(0,b)},
+u:function(a,b,c){this.Fb.u(0,b,c)},
+FV:function(a,b){this.Fb.FV(0,b)},
+V1:function(a){this.Fb.V1(0)},
+x4:function(a,b){return this.Fb.x4(0,b)},
+aN:function(a,b){this.Fb.aN(0,b)},
+gl0:function(a){return this.Fb.X5===0},
+gor:function(a){return this.Fb.X5!==0},
+gB:function(a){return this.Fb.X5},
+gvc:function(a){var z=this.Fb
+return H.VM(new P.i5(z),[H.u3(z,0)])},
+Rz:function(a,b){return this.Fb.Rz(0,b)},
+bu:[function(a){return P.vW(this.Fb)},"$0","gAY",0,0,71],
+gUQ:function(a){var z=this.Fb
+return z.gUQ(z)},
+$isZ0:true,
+$asZ0:null},
+A2:{
+"^":"Pnf+KPM;Fb",
+$isZ0:true,
+$asZ0:null},
 W0:{
 "^":"TpZ:79;a,b",
 $2:[function(a,b){var z=this.a
@@ -7315,7 +7487,7 @@
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,130,66,"call"],
+z.KF(b)},"$2",null,4,0,null,133,66,"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -7340,10 +7512,10 @@
 if(y<0||y>=x)return H.e(z,y)
 return z[y]},
 tt:function(a,b){var z,y
-if(b){z=H.VM([],[H.Oq(this,0)])
+if(b){z=H.VM([],[H.u3(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
-z=H.VM(y,[H.Oq(this,0)])}this.Ix(z)
+z=H.VM(y,[H.u3(this,0)])}this.Ix(z)
 return z},
 br:function(a){return this.tt(a,!0)},
 h:function(a,b){this.NZ(0,b)},
@@ -7357,7 +7529,7 @@
 if(typeof u!=="number")return H.s(u)
 w=Array(u)
 w.fixed$length=init
-t=H.VM(w,[H.Oq(this,0)])
+t=H.VM(w,[H.u3(this,0)])
 this.eZ=this.Ix(t)
 this.v5=t
 this.av=0
@@ -7437,7 +7609,7 @@
 M9:function(){var z,y,x,w
 z=Array(this.v5.length*2)
 z.fixed$length=init
-y=H.VM(z,[H.Oq(this,0)])
+y=H.VM(z,[H.u3(this,0)])
 z=this.v5
 x=this.av
 w=z.length-x
@@ -7493,41 +7665,41 @@
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(0,z.gl())},
 Ex:function(a){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Oq(a,0)]);z.G();)this.Rz(0,z.lo)},
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)this.Rz(0,z.lo)},
 Nk:function(a,b){var z,y,x
 z=[]
 for(y=this.gA(this);y.G();){x=y.gl()
 if(b.$1(x)===!0)z.push(x)}this.Ex(z)},
 tt:function(a,b){var z,y,x,w,v
-if(b){z=H.VM([],[H.Oq(this,0)])
+if(b){z=H.VM([],[H.u3(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
-z=H.VM(y,[H.Oq(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
+z=H.VM(y,[H.u3(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
 v=x+1
 if(x>=z.length)return H.e(z,x)
 z[x]=w}return z},
 br:function(a){return this.tt(a,!0)},
-ez:[function(a,b){return H.VM(new H.xy(this,b),[H.Oq(this,0),null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"xPo",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},30],
+ez:[function(a,b){return H.VM(new H.xy(this,b),[H.u3(this,0),null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"xPo",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},30],
 bu:[function(a){return P.WE(this,"{","}")},"$0","gAY",0,0,71],
 ad:function(a,b){var z=new H.U5(this,b)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.Oq(this,0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"PAJ",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},30],
+lM:[function(a,b){return H.VM(new H.oA(this,b),[H.u3(this,0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"Rdf",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},30],
 aN:function(a,b){var z
 for(z=this.gA(this);z.G();)b.$1(z.gl())},
 zV:function(a,b){var z,y,x
 z=this.gA(this)
 if(!z.G())return""
 y=P.p9("")
-if(b==="")do{x=H.d(z.gl())
-y.vM+=x}while(z.G())
-else{y.KF(H.d(z.gl()))
+if(b===""){do{x=H.d(z.gl())
+y.vM+=x}while(z.G())}else{y.KF(H.d(z.gl()))
 for(;z.G();){y.vM+=b
 x=H.d(z.gl())
 y.vM+=x}}return y.vM},
-ou:function(a,b){var z
+Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
 return!1},
+eR:function(a,b){return H.ke(this,b,H.u3(this,0))},
 grZ:function(a){var z,y
 z=this.gA(this)
 if(!z.G())throw H.b(H.DU())
@@ -7557,7 +7729,7 @@
 if(u.D(v,0)){u=z.Bb
 if(u==null)break
 v=this.yV(u.G3,a)
-if(J.z8(v,0)){t=z.Bb
+if(J.xZ(v,0)){t=z.Bb
 z.Bb=t.T8
 t.T8=z
 if(t.Bb==null){z=t
@@ -7628,7 +7800,7 @@
 gl0:function(a){return this.aY==null},
 gor:function(a){return this.aY!=null},
 aN:function(a,b){var z,y,x
-z=H.Oq(this,0)
+z=H.u3(this,0)
 y=H.VM(new P.HW(this,H.VM([],[P.oz]),this.qT,this.bb,null),[z])
 y.Qf(this,[P.oz,z])
 for(;y.G();){x=y.gl()
@@ -7638,7 +7810,7 @@
 V1:function(a){this.aY=null
 this.J0=0;++this.qT},
 x4:function(a,b){return this.Xy(b)===!0&&J.xC(this.vh(b),0)},
-gvc:function(a){return H.VM(new P.nF(this),[H.Oq(this,0)])},
+gvc:function(a){return H.VM(new P.nF(this),[H.u3(this,0)])},
 gUQ:function(a){var z=new P.ro(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
@@ -7660,7 +7832,7 @@
 "^":"TpZ;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
-$signature:function(){return H.IGs(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"Ba")}},
+$signature:function(){return H.IGs(function(a,b){return{func:"vPt",args:[a,b]}},this.a,"Ba")}},
 S6B:{
 "^":"a;",
 gl:function(){var z=this.ya
@@ -7692,7 +7864,7 @@
 z=this.lT
 y=new P.DN(z,H.VM([],[P.oz]),z.qT,z.bb,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qf(z,H.Oq(this,0))
+y.Qf(z,H.u3(this,0))
 return y},
 $isyN:true},
 ro:{
@@ -7703,7 +7875,7 @@
 z=this.Fb
 y=new P.ZM(z,H.VM([],[P.oz]),z.qT,z.bb,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qf(z,H.Oq(this,1))
+y.Qf(z,H.u3(this,1))
 return y},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
@@ -7718,7 +7890,7 @@
 HW:{
 "^":"S6B;lT,Jt,qT,bb,ya",
 Wb:function(a){return a},
-$asS6B:function(a){return[[P.oz,a]]}}}],["dart.convert","dart:convert",,P,{
+$asS6B:function(a){return[[P.oz,a]]}}}],["","",,P,{
 "^":"",
 VQ:function(a,b){return b.$2(null,new P.f1(b).$1(a))},
 KH:function(a){var z
@@ -7733,44 +7905,55 @@
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}if(b==null)return P.KH(z)
+throw H.b(P.cD(String(y),null,null))}if(b==null)return P.KH(z)
 else return P.VQ(z,b)},
 tp:[function(a){return a.Lt()},"$1","Jn",2,0,52,0],
 f1:{
 "^":"TpZ:12;a",
-$1:function(a){var z,y,x,w,v,u,t
+$1:function(a){var z,y,x,w,v,u
 if(a==null||typeof a!="object")return a
 if(Object.getPrototypeOf(a)===Array.prototype){for(z=this.a,y=0;y<a.length;++y)a[y]=z.$2(y,this.$1(a[y]))
 return a}z=Object.create(null)
 x=new P.r4(a,z,null)
 w=x.KN()
-for(v=J.U6(w),u=this.a,y=0;y<v.gB(w);++y){t=v.t(w,y)
-z[t]=u.$2(t,this.$1(a[t]))}x.rm=z
+for(v=this.a,y=0;y<w.length;++y){u=w[y]
+z[u]=v.$2(u,this.$1(a[u]))}x.rm=z
 return x},
 $isEH:true},
 r4:{
-"^":"a;rm,tk,zK",
+"^":"a;rm,cC,zK",
 t:function(a,b){var z,y
-z=this.tk
-if(z==null)return J.UQ(this.zK,b)
+z=this.cC
+if(z==null)return this.zK.t(0,b)
 else if(typeof b!=="string")return
 else{y=z[b]
 return typeof y=="undefined"?this.KH(b):y}},
-gB:function(a){return this.tk==null?J.q8(this.zK):J.q8(this.KN())},
-gl0:function(a){return(this.tk==null?J.q8(this.zK):J.q8(this.KN()))===0},
-gor:function(a){return(this.tk==null?J.q8(this.zK):J.q8(this.KN()))>0},
-gvc:function(a){if(this.tk==null)return J.iY(this.zK)
-return J.Ld(this.KN(),0)},
-gUQ:function(a){if(this.tk==null)return J.U8(this.zK)
-return H.K1(this.KN(),new P.FE(this),null,null)},
+gB:function(a){var z
+if(this.cC==null){z=this.zK
+z=z.gB(z)}else z=this.KN().length
+return z},
+gl0:function(a){var z
+if(this.cC==null){z=this.zK
+z=z.gB(z)}else z=this.KN().length
+return z===0},
+gor:function(a){var z
+if(this.cC==null){z=this.zK
+z=z.gB(z)}else z=this.KN().length
+return z>0},
+gvc:function(a){var z
+if(this.cC==null){z=this.zK
+return z.gvc(z)}return H.c1(this.KN(),0,null,null)},
+gUQ:function(a){var z
+if(this.cC==null){z=this.zK
+return z.gUQ(z)}return H.fR(this.KN(),new P.A5(this),null,null)},
 u:function(a,b,c){var z,y
-if(this.tk==null)J.kW(this.zK,b,c)
-else if(this.x4(0,b)){z=this.tk
+if(this.cC==null)this.zK.u(0,b,c)
+else if(this.x4(0,b)){z=this.cC
 z[b]=c
 y=this.rm
-if(y==null?z!=null:y!==z)y[b]=null}else J.kW(this.Ad(),b,c)},
+if(y==null?z!=null:y!==z)y[b]=null}else this.Ad().u(0,b,c)},
 FV:function(a,b){H.bQ(b,new P.E5(this))},
-x4:function(a,b){if(this.tk==null)return J.w4(this.zK,b)
+x4:function(a,b){if(this.cC==null)return this.zK.x4(0,b)
 if(typeof b!=="string")return!1
 return Object.prototype.hasOwnProperty.call(this.rm,b)},
 to:function(a,b,c){var z
@@ -7778,61 +7961,61 @@
 z=c.$0()
 this.u(0,b,z)
 return z},
-Rz:function(a,b){if(this.tk!=null&&!this.x4(0,b))return
-return J.V1(this.Ad(),b)},
+Rz:function(a,b){if(this.cC!=null&&!this.x4(0,b))return
+return this.Ad().Rz(0,b)},
 V1:function(a){var z
-if(this.tk==null)J.Z8(this.zK)
+if(this.cC==null)this.zK.V1(0)
 else{z=this.zK
 if(z!=null)J.Z8(z)
-this.tk=null
+this.cC=null
 this.rm=null
 this.zK=P.Fl(null,null)}},
-aN:function(a,b){var z,y,x,w,v
-if(this.tk==null)return J.Me(this.zK,b)
+aN:function(a,b){var z,y,x,w
+if(this.cC==null)return this.zK.aN(0,b)
 z=this.KN()
-for(y=J.U6(z),x=0;x<y.gB(z);++x){w=y.t(z,x)
-v=this.tk[w]
-if(typeof v=="undefined"){v=P.KH(this.rm[w])
-this.tk[w]=v}b.$2(w,v)
+for(y=0;y<z.length;++y){x=z[y]
+w=this.cC[x]
+if(typeof w=="undefined"){w=P.KH(this.rm[x])
+this.cC[x]=w}b.$2(x,w)
 if(z!==this.zK)throw H.b(P.a4(this))}},
 bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
 KN:function(){var z=this.zK
 if(z==null){z=Object.keys(this.rm)
 this.zK=z}return z},
 Ad:function(){var z,y,x,w,v
-if(this.tk==null)return this.zK
+if(this.cC==null)return this.zK
 z=P.Fl(null,null)
 y=this.KN()
-for(x=J.U6(y),w=0;w<x.gB(y);++w){v=x.t(y,w)
-z.u(0,v,this.t(0,v))}if(x.gl0(y))x.h(y,null)
-else x.V1(y)
-this.tk=null
+for(x=0;w=y.length,x<w;++x){v=y[x]
+z.u(0,v,this.t(0,v))}if(w===0)y.push(null)
+else C.Nm.sB(y,0)
+this.cC=null
 this.rm=null
 this.zK=z
 return z},
 KH:function(a){var z
 if(!Object.prototype.hasOwnProperty.call(this.rm,a))return
 z=P.KH(this.rm[a])
-return this.tk[a]=z},
+return this.cC[a]=z},
 $isFo:true,
 $asFo:function(){return[null,null]},
 $isZ0:true,
 $asZ0:function(){return[null,null]}},
-FE:{
+A5:{
 "^":"TpZ:12;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,129,"call"],
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,132,"call"],
 $isEH:true},
 E5:{
 "^":"TpZ:79;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
-Uk:{
+Ukr:{
 "^":"a;"},
 wIe:{
 "^":"a;"},
 Ziv:{
-"^":"Uk;",
-$asUk:function(){return[P.qU,[P.WO,P.KN]]}},
+"^":"Ukr;",
+$asUkr:function(){return[P.qU,[P.WO,P.KN]]}},
 AJ:{
 "^":"XS;Pc,FN",
 bu:[function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
@@ -7843,15 +8026,15 @@
 bu:[function(a){return"Cyclic error in JSON stringify"},"$0","gAY",0,0,71],
 static:{ko:function(a){return new P.K8(a,null)}}},
 byg:{
-"^":"Uk;qa<,ma",
-pW:function(a,b){return P.jc(a,this.gP1().qa)},
-kV:function(a){return this.pW(a,null)},
+"^":"Ukr;qa<,q4",
+cW:function(a,b){return P.jc(a,this.gP1().qa)},
+kV:function(a){return this.cW(a,null)},
 Q0:function(a,b){var z=this.gZE()
 return P.Vg(a,z.SI,z.UM)},
 KP:function(a){return this.Q0(a,null)},
 gZE:function(){return C.cb},
 gP1:function(){return C.A3},
-$asUk:function(){return[P.a,P.qU]}},
+$asUkr:function(){return[P.a,P.qU]}},
 ojF:{
 "^":"wIe;UM,SI",
 $aswIe:function(){return[P.a,P.qU]}},
@@ -7859,8 +8042,8 @@
 "^":"wIe;qa<",
 $aswIe:function(){return[P.qU,P.a]}},
 Sh:{
-"^":"a;ma,cP,ol",
-iY:function(a){return this.ma.$1(a)},
+"^":"a;q4,cP,ol",
+iY:function(a){return this.q4.$1(a)},
 Ip:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=z.gB(a)
@@ -7922,7 +8105,7 @@
 throw H.b(P.Gy(a,y))}}},
 Jc:function(a){var z,y,x,w
 z={}
-if(typeof a==="number"){if(!C.CD.gzr(a))return!1
+if(typeof a==="number"){if(!C.CD.gx8(a))return!1
 this.cP.KF(C.CD.bu(a))
 return!0}else if(a===!0){this.cP.KF("true")
 return!0}else if(a===!1){this.cP.KF("false")
@@ -7950,7 +8133,7 @@
 pg:function(a){var z=this.ol
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"Gsm,hyY,Ta6,Jyf,NoV,HVe,vk,BLm,KQz,Ho,mrt,NXu,CE,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
+static:{"^":"Gsm,hyY,Ta6,Jyf,NoV,HVe,vk,BLm,KQz,Ho,mrt,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
 b=P.Jn()
 z=P.p9("")
 P.xl(z,b,c).C7(a)
@@ -7982,40 +8165,40 @@
 y=H.VM(y,[P.KN])
 x=new P.Rw(0,0,y)
 if(x.rw(a,0,z.gB(a))!==z.gB(a))x.I7(z.j(a,J.Hn(z.gB(a),1)),0)
-return C.Nm.aM(y,0,x.L8)},
+return C.Nm.aM(y,0,x.mJ)},
 $aswIe:function(){return[P.qU,[P.WO,P.KN]]}},
 Rw:{
-"^":"a;So,L8,IT",
+"^":"a;So,mJ,IT",
 I7:function(a,b){var z,y,x,w,v
 z=this.IT
-y=this.L8
+y=this.mJ
 if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
 w=y+1
-this.L8=w
+this.mJ=w
 v=z.length
 if(y>=v)return H.e(z,y)
 z[y]=(240|x>>>18)>>>0
 y=w+1
-this.L8=y
+this.mJ=y
 if(w>=v)return H.e(z,w)
 z[w]=128|x>>>12&63
 w=y+1
-this.L8=w
+this.mJ=w
 if(y>=v)return H.e(z,y)
 z[y]=128|x>>>6&63
-this.L8=w+1
+this.mJ=w+1
 if(w>=v)return H.e(z,w)
 z[w]=128|x&63
 return!0}else{w=y+1
-this.L8=w
+this.mJ=w
 v=z.length
 if(y>=v)return H.e(z,y)
 z[y]=224|a>>>12
 y=w+1
-this.L8=y
+this.mJ=y
 if(w>=v)return H.e(z,w)
 z[w]=128|a>>>6&63
-this.L8=y+1
+this.mJ=y+1
 if(y>=v)return H.e(z,y)
 z[y]=128|a&63
 return!1}},
@@ -8027,29 +8210,29 @@
 x=J.rY(a)
 w=b
 for(;w<c;++w){v=x.j(a,w)
-if(v<=127){u=this.L8
+if(v<=127){u=this.mJ
 if(u>=y)break
-this.L8=u+1
-z[u]=v}else if((v&64512)===55296){if(this.L8+3>=y)break
+this.mJ=u+1
+z[u]=v}else if((v&64512)===55296){if(this.mJ+3>=y)break
 t=w+1
-if(this.I7(v,x.j(a,t)))w=t}else if(v<=2047){u=this.L8
+if(this.I7(v,x.j(a,t)))w=t}else if(v<=2047){u=this.mJ
 s=u+1
 if(s>=y)break
-this.L8=s
+this.mJ=s
 if(u>=y)return H.e(z,u)
 z[u]=192|v>>>6
-this.L8=s+1
-z[s]=128|v&63}else{u=this.L8
+this.mJ=s+1
+z[s]=128|v&63}else{u=this.mJ
 if(u+2>=y)break
 s=u+1
-this.L8=s
+this.mJ=s
 if(u>=y)return H.e(z,u)
 z[u]=224|v>>>12
 u=s+1
-this.L8=u
+this.mJ=u
 if(s>=y)return H.e(z,s)
 z[s]=128|v>>>6&63
-this.L8=u+1
+this.mJ=u+1
 if(u>=y)return H.e(z,u)
 z[u]=128|v&63}}return w},
 static:{"^":"Jf4"}},
@@ -8065,7 +8248,7 @@
 tz:{
 "^":"a;IW,ZB,AX,FU,kN,NY",
 xO:function(a){this.fZ()},
-fZ:function(){if(this.kN>0){if(this.IW!==!0)throw H.b(P.cD("Unfinished UTF-8 octet sequence"))
+fZ:function(){if(this.kN>0){if(this.IW!==!0)throw H.b(P.cD("Unfinished UTF-8 octet sequence",null,null))
 this.ZB.KF(H.mx(65533))
 this.FU=0
 this.kN=0
@@ -8083,7 +8266,7 @@
 $loop$0:for(u=this.ZB,t=this.IW!==!0,s=J.U6(a),r=b;!0;r=o){$multibyte$2:{if(x>0){do{if(r===c)break $loop$0
 q=s.t(a,r)
 p=J.Wx(q)
-if(p.i(q,192)!==128){if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16)))
+if(p.i(q,192)!==128){if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
 this.AX=!1
 p=H.mx(65533)
 u.vM+=p
@@ -8091,17 +8274,17 @@
 break $multibyte$2}else{y=(y<<6|p.i(q,63))>>>0;--x;++r}}while(x>0)
 p=w-1
 if(p<0||p>=4)return H.e(C.Gb,p)
-if(y<=C.Gb[p]){if(t)throw H.b(P.cD("Overlong encoding of 0x"+C.jn.WZ(y,16)))
+if(y<=C.Gb[p]){if(t)throw H.b(P.cD("Overlong encoding of 0x"+C.jn.WZ(y,16),null,null))
 y=65533
 x=0
-w=0}if(y>1114111){if(t)throw H.b(P.cD("Character outside valid Unicode range: 0x"+C.jn.WZ(y,16)))
+w=0}if(y>1114111){if(t)throw H.b(P.cD("Character outside valid Unicode range: 0x"+C.jn.WZ(y,16),null,null))
 y=65533}if(!this.AX||y!==65279){p=H.mx(y)
 u.vM+=p}this.AX=!1}}for(;r<c;r=o){o=r+1
 q=s.t(a,r)
 p=J.Wx(q)
 if(p.C(q,0)){n=z.a
 if(n>0){m=o-1
-v.$2(m-n,m)}if(t)throw H.b(P.cD("Negative UTF-8 code unit: -0x"+C.CD.WZ(p.J(q),16)))
+v.$2(m-n,m)}if(t)throw H.b(P.cD("Negative UTF-8 code unit: -0x"+C.CD.WZ(p.J(q),16),null,null))
 p=H.mx(65533)
 u.vM+=p}else if(p.E(q,127)){this.AX=!1;++z.a}else{n=z.a
 if(n>0){m=o-1
@@ -8114,7 +8297,7 @@
 continue $loop$0}if(p.i(q,248)===240&&p.C(q,245)){y=p.i(q,7)
 x=3
 w=3
-continue $loop$0}if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16)))
+continue $loop$0}if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
 this.AX=!1
 p=H.mx(65533)
 u.vM+=p
@@ -8127,15 +8310,15 @@
 this.NY=w}},
 static:{"^":"ADi"}},
 zC:{
-"^":"TpZ:131;a,b,c,d,e",
+"^":"TpZ:134;a,b,c,d,e",
 $2:function(a,b){var z,y,x
 z=a===0&&b===J.q8(this.c)
 y=this.b
 x=this.c
-if(z)y.ZB.KF(P.Qe(x))
-else y.ZB.KF(P.Qe(J.Fd(x,a,b)))
+if(z)y.ZB.KF(P.nB(x))
+else y.ZB.KF(P.nB(J.Fd(x,a,b)))
 this.a.a=0},
-$isEH:true}}],["dart.core","dart:core",,P,{
+$isEH:true}}],["","",,P,{
 "^":"",
 Te:function(a){return},
 Wc:[function(a,b){return J.FW(a,b)},"$2","n4",4,0,53,49,50],
@@ -8171,13 +8354,13 @@
 y=$.oK
 if(y==null)H.qw(z)
 else y.$1(z)},
-Qe:function(a){return H.LY(a.constructor!==Array?P.F(a,!0,null):a)},
+nB:function(a){return H.LY(a.constructor!==Array?P.F(a,!0,null):a)},
 Y25:{
 "^":"TpZ:79;a",
 $2:function(a,b){this.a.u(0,a.gfN(a),b)},
 $isEH:true},
 CL:{
-"^":"TpZ:132;a",
+"^":"TpZ:135;a",
 $2:function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
@@ -8212,7 +8395,7 @@
 EK:function(){H.o2(this)},
 RM:function(a,b){if(J.yH(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"bS,Vp,Eu,p2W,h2,KL,EQe,NXt,tp1,Gio,Fz,cR,E03,KeL,Cgd,NrX,LD,o4I,T3F,f8,yfk,fQ",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+static:{"^":"Oj2,Vp,Eu,p2W,h2,KL,EQe,NXt,tp1,Gio,zM3,cR,E03,KeL,Cgd,NrX,LD,o4I,T3F,f8,yfk,lme",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
 if(z!=null){y=new P.MF()
 x=z.QK
@@ -8246,7 +8429,7 @@
 if(typeof l!=="number")return H.s(l)
 s=J.Hn(s,n*l)}k=!0}else k=!1
 j=H.fu(w,v,u,t,s,r,q,k)
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},Wu:function(a,b){var z=new P.iP(a,b)
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD("Invalid date format",a,null))},Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
 return z},Gq:function(a){var z,y
 z=Math.abs(a)
@@ -8259,12 +8442,12 @@
 return"00"+a},h0:function(a){if(a>=10)return""+a
 return"0"+a}}},
 MF:{
-"^":"TpZ:133;",
+"^":"TpZ:136;",
 $1:function(a){if(a==null)return 0
 return H.BU(a,null,null)},
 $isEH:true},
 Rq:{
-"^":"TpZ:134;",
+"^":"TpZ:137;",
 $1:function(a){if(a==null)return 0
 return H.RR(a,null)},
 $isEH:true},
@@ -8369,7 +8552,7 @@
 if(z==null)return"Concurrent modification during iteration."
 return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"$0","gAY",0,0,71],
 static:{a4:function(a){return new P.UV(a)}}},
-qn:{
+k5C:{
 "^":"a;",
 bu:[function(a){return"Out of Memory"},"$0","gAY",0,0,71],
 gI4:function(){return},
@@ -8389,9 +8572,48 @@
 if(z==null)return"Exception"
 return"Exception: "+H.d(z)},"$0","gAY",0,0,71]},
 oe:{
-"^":"a;G1>",
-bu:[function(a){return"FormatException: "+H.d(this.G1)},"$0","gAY",0,0,71],
-static:{cD:function(a){return new P.oe(a)}}},
+"^":"a;G1>,FF,bM",
+bu:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+z=this.G1
+y=z!=null&&""!==z?"FormatException: "+H.d(z):"FormatException"
+x=this.bM
+w=this.FF
+if(typeof w!=="string")return x!=null?y+(" (at position "+H.d(x)+")"):y
+if(x!=null)if(!(x<0)){z=J.q8(w)
+if(typeof z!=="number")return H.s(z)
+z=x>z}else z=!0
+else z=!1
+if(z)x=null
+if(x==null){z=J.U6(w)
+if(J.xZ(z.gB(w),78))w=z.Nj(w,0,75)+"..."
+return y+"\n"+H.d(w)}for(z=J.U6(w),v=1,u=0,t=null,s=0;s<x;++s){r=z.j(w,s)
+if(r===10){if(u!==s||t!==!0)++v
+u=s+1
+t=!1}else if(r===13){++v
+u=s+1
+t=!0}}y=v>1?y+(" (at line "+v+", character "+(x-u+1)+")\n"):y+(" (at character "+(x+1)+")\n")
+q=z.gB(w)
+s=x
+while(!0){p=z.gB(w)
+if(typeof p!=="number")return H.s(p)
+if(!(s<p))break
+r=z.j(w,s)
+if(r===10||r===13){q=s
+break}++s}p=J.Wx(q)
+if(J.xZ(p.W(q,u),78))if(x-u<75){o=u+75
+n=u
+m=""
+l="..."}else{if(J.u6(p.W(q,x),75)){n=p.W(q,75)
+o=q
+l=""}else{n=x-36
+o=x+36
+l="..."}m="..."}else{o=q
+n=u
+m=""
+l=""}k=z.Nj(w,n,o)
+if(typeof n!=="number")return H.s(n)
+return y+m+k+l+"\n"+C.xB.U(" ",x-n+m.length)+"^\n"},"$0","gAY",0,0,71],
+static:{cD:function(a,b,c){return new P.oe(a,b,c)}}},
 eV:{
 "^":"a;",
 bu:[function(a){return"IntegerDivisionByZeroException"},"$0","gAY",0,0,71],
@@ -8400,11 +8622,11 @@
 "^":"a;oc>",
 bu:[function(a){return"Expando:"+H.d(this.oc)},"$0","gAY",0,0,71],
 t:function(a,b){var z=H.of(b,"expando$values")
-return z==null?null:H.of(z,this.J4())},
+return z==null?null:H.of(z,this.YV())},
 u:function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
-H.wV(b,"expando$values",z)}H.wV(z,this.J4(),c)},
-J4:function(){var z,y
+H.wV(b,"expando$values",z)}H.wV(z,this.YV(),c)},
+YV:function(){var z,y
 z=H.of(this,"expando$key")
 if(z==null){y=$.Km
 $.Km=y+1
@@ -8501,9 +8723,8 @@
 We:function(a,b){var z,y
 z=J.mY(a)
 if(!z.G())return
-if(b.length===0)do{y=z.gl()
-this.vM+=typeof y==="string"?y:H.d(y)}while(z.G())
-else{this.KF(z.gl())
+if(b.length===0){do{y=z.gl()
+this.vM+=typeof y==="string"?y:H.d(y)}while(z.G())}else{this.KF(z.gl())
 for(;z.G();){this.vM+=b
 y=z.gl()
 this.vM+=typeof y==="string"?y:H.d(y)}}},
@@ -8521,7 +8742,7 @@
 "^":"a;",
 $isuq:true},
 q5:{
-"^":"a;Bo,IE,pO,Fi,ux,Ev,bM,hO,lH",
+"^":"a;Bo,IE,pO,Fi,ux,Ev,D6,hO,lH",
 gJf:function(a){var z=this.Bo
 if(z==null)return""
 if(J.rY(z).nC(z,"["))return C.xB.Nj(z,1,z.length-1)
@@ -8533,11 +8754,11 @@
 yM:function(a,b){if(a==="")return"/"+b
 return C.xB.Nj(a,0,C.xB.cn(a,"/")+1)+b},
 K2:function(a){if(a.length>0&&C.xB.j(a,0)===58)return!0
-return C.xB.kJ(a,"/.")!==-1},
+return C.xB.Mw(a,"/.")!==-1},
 KO:function(a){var z,y,x,w,v
 if(!this.K2(a))return a
 z=[]
-for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]),x=!1;y.G();){w=y.lo
+for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!1;y.G();){w=y.lo
 if(J.xC(w,"..")){v=z.length
 if(v!==0)if(v===1){if(0>=v)return H.e(z,0)
 v=!J.xC(z[0],"")}else v=!0
@@ -8562,7 +8783,7 @@
 z.KF(y)}}z.KF(this.pO)
 y=this.Ev
 if(y!=null){z.KF("?")
-z.KF(y)}y=this.bM
+z.KF(y)}y=this.D6
 if(y!=null){z.KF("#")
 z.KF(y)}return z.vM},"$0","gAY",0,0,71],
 n:function(a,b){var z,y,x,w
@@ -8578,9 +8799,9 @@
 x=b.Ev
 w=x==null
 if(!y===!w){if(y)z=""
-if(z==null?(w?"":x)==null:z===(w?"":x)){z=this.bM
+if(z==null?(w?"":x)==null:z===(w?"":x)){z=this.D6
 y=z==null
-x=b.bM
+x=b.D6
 w=x==null
 if(!y===!w){if(y)z=""
 z=z==null?(w?"":x)==null:z===(w?"":x)}else z=!1}else z=!1}else z=!1}else z=!1
@@ -8594,10 +8815,10 @@
 x=this.gtp(this)
 w=this.Ev
 if(w==null)w=""
-v=this.bM
+v=this.D6
 return z.$2(this.Fi,z.$2(this.ux,z.$2(y,z.$2(x,z.$2(this.pO,z.$2(w,z.$2(v==null?"":v,1)))))))},
 $isq5:true,
-static:{"^":"QqF,q7,tvi,uCX,wm7,ilf,Imi,GpR,Q5W,XrJ,G9,pkL,lM,FsP,j3,dRC,u0I,TGN,Yk,Qxt,Vho,WTp,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,iTk,Uo,yw1,SQU,rvM,fbQ",bG:function(a){if(a==="http")return 80
+static:{"^":"QqF,q7,tvi,uCX,wm7,ilf,Imi,GpR,Q5W,XrJ,G9,pkL,lM,FsP,qfW,dRC,u0I,TGN,OP,Qxt,Vho,WTp,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,iTk,Uo,yw1,SQU,rvM,fbQ",bG:function(a){if(a==="http")return 80
 if(a==="https")return 443
 return 0},hK:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z={}
@@ -8651,27 +8872,16 @@
 n=P.o6(a,p+1,w)}}else{n=s===35?P.o6(a,z.e+1,w):null
 o=null}w=z.a
 s=z.b
-return new P.q5(z.c,z.d,q,w,s,o,n,null,null)},iV:function(a,b,c){var z,y,x,w,v
-z=a.length
-if(b===z)c+=" at end of input."
-else{c+=" at position "+b+".\n"
-if(z>78){y=b-10
-if(y<0)y=0
-x=y+72
-if(x>z){y=z-72
-x=z}w=y!==0?"...":""
-v=x!==z?"...":""}else{y=0
-w=""
-v=""}c=c+w+J.Nj(a,y,z)+v+"\n"+C.xB.U(" ",w.length+b-y)+"^"}throw H.b(P.cD(c))},JF:function(a,b){if(a!=null&&a===P.bG(b))return
+return new P.q5(z.c,z.d,q,w,s,o,n,null,null)},iV:function(a,b,c){throw H.b(P.cD(c,a,b))},JF:function(a,b){if(a!=null&&a===P.bG(b))return
 return a},L7:function(a,b,c,d){var z,y
 if(a==null)return
 if(b===c)return""
 if(C.xB.j(a,b)===91){z=c-1
 if(C.xB.j(a,z)!==93)P.iV(a,b,"Missing end `]` to match `[` in host")
-P.Uw(a,b+1,z)
+P.RD(a,b+1,z)
 return C.xB.Nj(a,b,c).toLowerCase()}if(!d)for(z=a.length,y=b;y<c;++y){if(y<0)H.vh(P.N(y))
 if(y>=z)H.vh(P.N(y))
-if(a.charCodeAt(y)===58){P.Uw(a,b,c)
+if(a.charCodeAt(y)===58){P.RD(a,b,c)
 return"["+a+"]"}}return P.WU(a,b,c)},WU:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 for(z=b,y=z,x=null,w=!0;z<c;){a.toString
 if(z<0)H.vh(P.N(z))
@@ -8737,7 +8947,7 @@
 if(!s)P.iV(a,u,"Illegal scheme character")
 if(w&&v)x=!1}a=J.Nj(a,0,b)
 return!x?a.toLowerCase():a},ua:function(a,b,c){if(a==null)return""
-return P.Xc(a,b,c,C.to)},qd:function(a,b,c,d,e){var z,y
+return P.Xc(a,b,c,C.MM)},qd:function(a,b,c,d,e){var z,y
 z=a==null
 if(z&&!0)return""
 z=!z
@@ -8837,9 +9047,9 @@
 z=new P.JV()
 y=a.split(".")
 if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.Nw(z)),[null,null]).br(0)},Uw:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+return H.VM(new H.A8(y,new P.to(z)),[null,null]).br(0)},RD:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 if(c==null)c=J.q8(a)
-z=new P.x8()
+z=new P.x8(a)
 y=new P.JT(a,z)
 if(J.q8(a)<2)z.$1("address is too short")
 x=[]
@@ -8860,14 +9070,14 @@
 s.toString
 if(u<0)H.vh(P.N(u))
 if(u>=J.q8(s))H.vh(P.N(u))
-if(s.charCodeAt(u)!==58)z.$1("invalid start colon.")
-w=u}if(u===w){if(t)z.$1("only one wildcard `::` is allowed")
+if(s.charCodeAt(u)!==58)z.$2("invalid start colon.",u)
+w=u}if(u===w){if(t)z.$2("only one wildcard `::` is allowed",u)
 J.bi(x,-1)
 t=!0}else J.bi(x,y.$2(w,u))
 w=u+1}++u}if(J.q8(x)===0)z.$1("too few parts")
 q=J.xC(w,c)
 p=J.xC(J.uY(x),-1)
-if(q&&!p)z.$1("expected a part after last `:`")
+if(q&&!p)z.$2("expected a part after last `:`",c)
 if(!q)try{J.bi(x,y.$2(w,c))}catch(o){H.Ru(o)
 try{v=P.Dy(J.Nj(a,w,c))
 s=J.lf(J.UQ(v,0),8)
@@ -8878,7 +9088,7 @@
 s=J.UQ(v,3)
 if(typeof s!=="number")return H.s(s)
 J.bi(x,(r|s)>>>0)}catch(o){H.Ru(o)
-z.$1("invalid end of IPv6 address.")}}if(t){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
+z.$2("invalid end of IPv6 address.",w)}}if(t){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
 n=Array(16)
 n.$builtinTypeInfo=[P.KN]
 u=0
@@ -8944,7 +9154,7 @@
 else u.push(v);++x}}t=b.IW
 return new P.GY(t).WJ(u)}}},
 hP2:{
-"^":"TpZ:135;",
+"^":"TpZ:138;",
 $1:function(a){a.C(0,128)
 return!1},
 $isEH:true},
@@ -8998,14 +9208,14 @@
 z.KF(P.jW(C.B2,b,C.xM,!0))},
 $isEH:true},
 Wf:{
-"^":"TpZ:136;",
+"^":"TpZ:139;",
 $2:function(a,b){return b*31+J.v1(a)&1073741823},
 $isEH:true},
 qz:{
 "^":"TpZ:79;a",
 $2:function(a,b){var z,y,x,w
 z=J.U6(b)
-y=z.kJ(b,"=")
+y=z.Mw(b,"=")
 if(y===-1){if(!z.n(b,""))J.kW(a,P.pE(b,this.a,!0),"")}else if(y!==0){x=z.Nj(b,0,y)
 w=z.yn(b,y+1)
 z=this.a
@@ -9013,27 +9223,28 @@
 $isEH:true},
 JV:{
 "^":"TpZ:44;",
-$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},
+$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a,null,null))},
 $isEH:true},
-Nw:{
+to:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,137,"call"],
+return z},"$1",null,2,0,null,140,"call"],
 $isEH:true},
 x8:{
-"^":"TpZ:44;",
-$1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
+"^":"TpZ:141;a",
+$2:function(a,b){throw H.b(P.cD("Illegal IPv6 address, "+a,this.a,b))},
+$1:function(a){return this.$2(a,null)},
 $isEH:true},
 JT:{
-"^":"TpZ:96;a,b",
+"^":"TpZ:98;b,c",
 $2:function(a,b){var z,y
-if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
-z=H.BU(J.Nj(this.a,a,b),16,null)
+if(b-a>4)this.c.$2("an IPv6 part can only contain a maximum of 4 hex digits",a)
+z=H.BU(J.Nj(this.b,a,b),16,null)
 y=J.Wx(z)
-if(y.C(z,0)||y.D(z,65535))this.b.$1("each part must be in the range of `0x0..0xFFFF`")
+if(y.C(z,0)||y.D(z,65535))this.c.$2("each part must be in the range of `0x0..0xFFFF`",a)
 return z},
 $isEH:true},
 rI:{
@@ -9041,9 +9252,9 @@
 $2:function(a,b){var z=J.Wx(a)
 b.KF(H.mx(C.xB.j("0123456789ABCDEF",z.m(a,4))))
 b.KF(H.mx(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
-$isEH:true}}],["dart.dom.html","dart:html",,W,{
+$isEH:true}}],["","",,W,{
 "^":"",
-Q8:function(a,b,c,d){var z,y,x
+H9:function(a,b,c,d){var z,y,x
 z=document.createEvent("CustomEvent")
 J.QD(z,d)
 if(!J.x(d).$isWO)if(!J.x(d).$isZ0){y=d
@@ -9062,9 +9273,9 @@
 x=new XMLHttpRequest()
 C.W3.eo(x,"GET",a,!0)
 z=H.VM(new W.RO(x,C.LF.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(new W.bU(y,x)),z.Sg),[H.Oq(z,0)]).Zz()
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new W.bU(y,x)),z.Sg),[H.u3(z,0)]).Zz()
 z=H.VM(new W.RO(x,C.JN.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Oq(z,0)]).Zz()
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(y.gYJ()),z.Sg),[H.u3(z,0)]).Zz()
 x.send()
 return y.MM},
 ED:function(a){var z,y
@@ -9094,16 +9305,16 @@
 Pd:function(a){if(!!J.x(a).$isYN)return a
 return P.o7(a,!0)},
 v8:function(a,b){return new W.zZ(a,b)},
-w6:[function(a){return J.N1(a)},"$1","l9",2,0,12,56],
+z9:[function(a){return J.N1(a)},"$1","b4",2,0,12,56],
 Hx:[function(a){return J.qq(a)},"$1","Z6",2,0,12,56],
-Hw:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","SN",8,0,57,56,58,59,60],
+Hw:[function(a,b,c,d){return J.L1(a,b,c,d)},"$4","SN",8,0,57,56,58,59,60],
 Ct:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
 z=J.Xr(d)
 if(z==null)throw H.b(P.u(d))
 y=z.prototype
 x=J.KE(d,"created")
 if(x==null)throw H.b(P.u(H.d(d)+" has no constructor called 'created'"))
-J.aN(W.r3("article",null))
+J.Dx(W.r3("article",null))
 w=z.$nativeSuperclassTag
 if(w==null)throw H.b(P.u(d))
 v=e==null
@@ -9111,7 +9322,7 @@
 u=a[w]
 t={}
 t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.v8(x,y),1))}
-t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.l9(),1))}
+t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.b4(),1))}
 t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.Z6(),1))}
 t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.SN(),4))}
 s=Object.create(u.prototype,t)
@@ -9127,7 +9338,7 @@
 return $.X3.cl(a,!0)},
 Bo:{
 "^":"h4;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;re|TR0|xc|LPc|hV|Xfs|uL|tu|G6|Vfx|xI|eW|Dsd|eo|tuj|ak|VY|Vct|Be|SaM|JI|D13|ZP|WZq|nJ|KAf|Eg|i7|pva|Gk|cda|J3|waa|MJ|T53|DK|V9|BS|V10|Vb|V11|Ly|pR|V12|hx|V13|L4|Mb|V14|mO|DE|V15|U1|V16|H8|WS|qh|V17|oF|V18|Q6|uE|V19|Zn|V20|n5|V21|Ma|wN|V22|ds|V23|qM|ZzR|av|V24|uz|V25|kK|oa|V26|St|V27|IW|V28|Qh|V29|Oz|V30|Z4|V31|qk|V32|vj|LU|V33|CX|V34|md|V35|Bm|V36|Ya|V37|Ww|ye|V38|G1|V39|fl|V40|UK|V41|wM|V42|NK|V43|Zx|V44|F1|V45|ov|oEY|kn|V46|fI|V47|zM|V48|Rk|V49|Ti|ImK|CY|V50|nm|V51|uw|V52|Pa|V53|D2|I5|V54|el"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;re|TR0|xc|LPc|hV|Xfs|uL|tu|G6|Vfx|xI|eW|Dsd|eo|tuj|ak|VY|Vct|Be|SaM|JI|D13|ZP|WZq|nJ|KAf|Eg|i7|pva|Gk|cda|J3|waa|MJ|T53|DK|V4|BS|V9|Vb|V10|Ly|pR|V11|hx|V12|L4|Mb|V13|mO|DE|V14|U1|V15|H8|WS|qh|V16|oF|V17|Q6|uE|V18|Zn|V19|n5|V20|Ma|wN|V21|ds|V22|qM|ZzR|av|V23|uz|V24|kK|oa|V25|St|V26|IW|V27|Qh|V28|Oz|V29|Z4|V30|qk|V31|vj|LU|V32|CX|V33|md|V34|Bm|V35|Ya|V36|Ww|ye|V37|G1|V38|fl|V39|UK|V40|wM|V41|NK|V42|Zx|V43|F1|V44|ov|V45|vr|oEY|kn|V46|fI|V47|zM|V48|Rk|V49|Ti|ImK|CY|V50|nm|V51|uw|V52|Pa|V53|D2|I5|V54|el"},
 Yyn:{
 "^":"Gv;",
 $isWO:true,
@@ -9151,7 +9362,7 @@
 "^":"Gv;t5:type=",
 $isO4:true,
 "%":";Blob"},
-Fy:{
+QPB:{
 "^":"Bo;",
 $isPZ:true,
 "%":"HTMLBodyElement"},
@@ -9173,19 +9384,19 @@
 if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
 return}throw H.b(P.u("Incorrect number or type of arguments"))},
 "%":"CanvasRenderingContext2D"},
-nx:{
+JJ:{
 "^":"KV;Rn:data=,B:length=,Wq:nextElementSibling=",
 "%":"Comment;CharacterData"},
 BI:{
 "^":"ea;tT:code=",
 $isBI:true,
 "%":"CloseEvent"},
-di:{
+y4f:{
 "^":"w6O;Rn:data=",
 "%":"CompositionEvent"},
 Rb:{
 "^":"ea;M3:_dartDetail}",
-geyz:function(a){var z=a._dartDetail
+gey:function(a){var z=a._dartDetail
 if(z!=null)return z
 return P.o7(a.detail,!0)},
 dF:function(a,b,c,d,e){return a.initCustomEvent(b,c,d,e)},
@@ -9207,7 +9418,7 @@
 Wk:function(a,b){return a.querySelector(b)},
 gEr:function(a){return H.VM(new W.RO(a,C.U3.Ph,!1),[null])},
 gfs:function(a){return H.VM(new W.RO(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
+gQb:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 $isYN:true,
 "%":"XMLDocument;Document"},
@@ -9260,7 +9471,7 @@
 Wk:function(a,b){return a.querySelector(b)},
 gEr:function(a){return H.VM(new W.mw(a,C.U3.Ph,!1),[null])},
 gfs:function(a){return H.VM(new W.mw(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.mw(a,C.i3.Ph,!1),[null])},
+gQb:function(a){return H.VM(new W.mw(a,C.i3.Ph,!1),[null])},
 gVY:function(a){return H.VM(new W.mw(a,C.Whw.Ph,!1),[null])},
 gf0:function(a){return H.VM(new W.mw(a,C.Kq.Ph,!1),[null])},
 ZL:function(a){},
@@ -9279,11 +9490,11 @@
 gN:function(a){return W.qc(a.target)},
 e6:function(a){return a.preventDefault()},
 $isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event|InputEvent"},
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MediaKeyNeededEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;ClipboardEvent|Event|InputEvent"},
 PZ:{
 "^":"Gv;",
 gI:function(a){return new W.kd(a)},
-Yb:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
+On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
 H2:function(a,b){return a.dispatchEvent(b)},
 Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
 $isPZ:true,
@@ -9301,7 +9512,10 @@
 jH:{
 "^":"Bo;B:length=,oc:name%,N:target%",
 "%":"HTMLFormElement"},
-c4:{
+u9:{
+"^":"Bo;ih:color%",
+"%":"HTMLHRElement"},
+pl:{
 "^":"Gv;B:length=",
 "%":"History"},
 xnd:{
@@ -9330,14 +9544,14 @@
 smk:function(a,b){a.title=b},
 "%":"HTMLDocument"},
 fJ:{
-"^":"rk;il:responseText=,pf:status=",
+"^":"waV;il:responseText=,pf:status=",
 gbA:function(a){return W.Pd(a.response)},
-R3:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
+Yh:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
 eo:function(a,b,c,d){return a.open(b,c,d)},
 wR:function(a,b){return a.send(b)},
 $isfJ:true,
 "%":"XMLHttpRequest"},
-rk:{
+waV:{
 "^":"PZ;",
 "%":";XMLHttpRequestEventTarget"},
 tbE:{
@@ -9406,13 +9620,16 @@
 D80:{
 "^":"PZ;jO:id=,ph:label=",
 "%":"MediaStream"},
+VhH:{
+"^":"ea;vq:stream=",
+"%":"MediaStreamEvent"},
 Hy:{
 "^":"ea;",
 gRn:function(a){return P.o7(a.data,!0)},
 $isHy:true,
 "%":"MessageEvent"},
 EeC:{
-"^":"Bo;jb:content=,oc:name%",
+"^":"Bo;q1:content=,oc:name%",
 "%":"HTMLMetaElement"},
 QbE:{
 "^":"Bo;P:value%",
@@ -9426,7 +9643,7 @@
 "%":"MIDIMessageEvent"},
 bnE:{
 "^":"Imr;",
-EZ:function(a,b,c){return a.send(b,c)},
+FY:function(a,b,c){return a.send(b,c)},
 wR:function(a,b){return a.send(b)},
 "%":"MIDIOutput"},
 Imr:{
@@ -9445,7 +9662,7 @@
 return H.VM(new P.hL(J.Hh(y.x),J.Hh(y.y)),[null])}},
 $isAjY:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
-H9:{
+x76:{
 "^":"Gv;",
 je:function(a){return a.disconnect()},
 jh:function(a,b,c,d,e,f,g,h,i){var z,y
@@ -9469,8 +9686,8 @@
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
 KV:{
-"^":"PZ;PZ:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,By:parentNode=,a4:textContent%",
-gyT:function(a){return new W.wi(a)},
+"^":"PZ;lb:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,By:parentNode=,a4:textContent%",
+gUN:function(a){return new W.wi(a)},
 wg:function(a){var z=a.parentNode
 if(z!=null)z.removeChild(a)},
 Tk:function(a,b){var z,y
@@ -9517,7 +9734,7 @@
 G77:{
 "^":"Bo;Rn:data=,MB:form=,fg:height%,oc:name%,t5:type%,R:width}",
 "%":"HTMLObjectElement"},
-qW:{
+l9:{
 "^":"Bo;ph:label%",
 "%":"HTMLOptGroupElement"},
 Qlt:{
@@ -9534,11 +9751,11 @@
 "^":"ea;",
 $isf5:true,
 "%":"PopStateEvent"},
-MR:{
+j6:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"PositionError"},
-Qls:{
-"^":"nx;N:target=",
+qW:{
+"^":"JJ;N:target=",
 "%":"ProcessingInstruction"},
 KR:{
 "^":"Bo;P:value%",
@@ -9565,10 +9782,10 @@
 yNV:{
 "^":"Bo;t5:type%",
 "%":"HTMLSourceElement"},
-Hd:{
+zD9:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
-r5:{
+y0:{
 "^":"ea;Cf:results=",
 "%":"SpeechRecognitionEvent"},
 vKL:{
@@ -9626,12 +9843,12 @@
 "^":"Bo;",
 gvp:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
 "%":"HTMLTableSectionElement"},
-OH:{
-"^":"Bo;jb:content=",
-$isOH:true,
-"%":";HTMLTemplateElement;GLL|wc|q6"},
+fX:{
+"^":"Bo;q1:content=",
+$isfX:true,
+"%":";HTMLTemplateElement;GLL|k5d|q6"},
 bm:{
-"^":"nx;",
+"^":"JJ;",
 $isbm:true,
 "%":"CDATASection|Text"},
 HR:{
@@ -9660,7 +9877,7 @@
 wR:function(a,b){return a.send(b)},
 "%":"WebSocket"},
 K5:{
-"^":"PZ;jY:history=,oc:name%,pf:status%",
+"^":"PZ;bq:history=,oc:name%,pf:status%",
 oB:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
 pl:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return;(function(b){var z=['ms','moz','webkit','o']
 for(var y=0;y<z.length&&!b.requestAnimationFrame;++y){b.requestAnimationFrame=b[z[y]+'RequestAnimationFrame']
@@ -9669,12 +9886,12 @@
 b.cancelAnimationFrame=function(c){clearTimeout(c)}})(a)},
 geT:function(a){return W.Pv(a.parent)},
 xO:function(a){return a.close()},
-kr:function(a,b,c,d){a.postMessage(P.pf(b),c)
+xc:function(a,b,c,d){a.postMessage(P.pf(b),c)
 return},
-X6:function(a,b,c){return this.kr(a,b,c,null)},
+X6:function(a,b,c){return this.xc(a,b,c,null)},
 bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
 gEr:function(a){return H.VM(new W.RO(a,C.U3.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
+gQb:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
 $isK5:true,
 $isPZ:true,
 "%":"DOMWindow|Window"},
@@ -9770,17 +9987,17 @@
 h:function(a,b){this.MW.appendChild(b)
 return b},
 gA:function(a){var z=this.br(this)
-return H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)])},
+return H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Oq(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},
 GT:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
 Jd:function(a){return this.GT(a,null)},
-Nk:function(a,b){this.Jl(b,!1)},
-Jl:function(a,b){var z,y,x
+Nk:function(a,b){this.zU(b,!1)},
+zU:function(a,b){var z,y,x
 z=this.MW
 if(b){z=J.Mx(z)
 y=z.ad(z,new W.tN(a))}else{z=J.Mx(z)
-y=z.ad(z,a)}for(z=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.Oq(y,0)]),x=z.OI;z.G();)J.Mp(x.gl())},
+y=z.ad(z,a)}for(z=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.u3(y,0)]),x=z.OI;z.G();)J.Mp(x.gl())},
 YW:function(a,b,c,d,e){throw H.b(P.SY(null))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 Rz:function(a,b){var z
@@ -9824,7 +10041,7 @@
 grZ:function(a){return C.t5.grZ(this.Sn)},
 gDD:function(a){return W.or(this.Sc)},
 gEr:function(a){return H.VM(new W.Uc(this,!1,C.U3.Ph),[null])},
-gLm:function(a){return H.VM(new W.Uc(this,!1,C.i3.Ph),[null])},
+gQb:function(a){return H.VM(new W.Uc(this,!1,C.i3.Ph),[null])},
 S8:function(a,b){var z=C.t5.ad(this.Sn,new W.pN())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
 $isWO:true,
@@ -9842,16 +10059,16 @@
 QI:{
 "^":"Gv;"},
 kd:{
-"^":"a;of<",
-t:function(a,b){return H.VM(new W.RO(this.gof(),b,!1),[null])}},
+"^":"a;WK<",
+t:function(a,b){return H.VM(new W.RO(this.gWK(),b,!1),[null])}},
 DM:{
-"^":"kd;of:YO<,of",
+"^":"kd;WK:YO<,WK",
 t:function(a,b){var z,y
-z=$.nn()
+z=$.Cs()
 y=J.rY(b)
 if(z.gvc(z).tg(0,y.hc(b)))if(P.F7()===!0)return H.VM(new W.mw(this.YO,z.t(0,y.hc(b)),!1),[null])
 return H.VM(new W.mw(this.YO,b,!1),[null])},
-static:{"^":"fDX"}},
+static:{"^":"Ha"}},
 RAp:{
 "^":"Gv+lD;",
 $isWO:true,
@@ -9868,7 +10085,7 @@
 $asQV:function(){return[W.KV]}},
 Kx:{
 "^":"TpZ:12;",
-$1:[function(a){return J.lN(a)},"$1",null,2,0,null,138,"call"],
+$1:[function(a){return J.lN(a)},"$1",null,2,0,null,142,"call"],
 $isEH:true},
 bU2:{
 "^":"TpZ:79;a",
@@ -9897,7 +10114,7 @@
 return z},
 h:function(a,b){this.NL.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Oq(b,0)]),y=this.NL;z.G();)y.appendChild(z.lo)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.NL;z.G();)y.appendChild(z.lo)},
 xe:function(a,b,c){var z,y,x
 if(b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=this.NL
@@ -9910,7 +10127,7 @@
 z=this.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},
+J.r5(z,c,y[b])},
 Yj:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
 Rz:function(a,b){var z
 if(!J.x(b).$isKV)return!1
@@ -9918,12 +10135,12 @@
 if(z!==b.parentNode)return!1
 z.removeChild(b)
 return!0},
-Jl:function(a,b){var z,y,x
+zU:function(a,b){var z,y,x
 z=this.NL
 y=z.firstChild
 for(;y!=null;y=x){x=y.nextSibling
 if(J.xC(a.$1(y),b))z.removeChild(y)}},
-Nk:function(a,b){this.Jl(b,!0)},
+Nk:function(a,b){this.zU(b,!0)},
 V1:function(a){J.qv(this.NL)},
 u:function(a,b,c){var z,y
 z=this.NL
@@ -10003,9 +10220,9 @@
 "^":"a;",
 FV:function(a,b){J.Me(b,new W.JO(this))},
 V1:function(a){var z
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)this.Rz(0,z.lo)},
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)this.Rz(0,z.lo)},
 aN:function(a,b){var z,y
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){y=z.lo
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 b.$2(y,this.t(0,y))}},
 gvc:function(a){var z,y,x,w
 z=this.MW.attributes
@@ -10046,9 +10263,9 @@
 return z},
 p5:function(a){var z,y
 z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.N9,y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]);y.G();)J.Pw(y.lo,z)},
+for(y=this.N9,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();)J.Pw(y.lo,z)},
 OS:function(a){this.Kd.aN(0,new W.Jt(a))},
-Rz:function(a,b){return this.Q6(new W.ma(b))},
+Rz:function(a,b){return this.Q6(new W.FcD(b))},
 Q6:function(a){return this.Kd.es(0,!1,new W.hD(a))},
 yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.N9,!0,null),new W.Xw()),[null,null])},
 static:{or:function(a){var z=new W.hZ(a,null)
@@ -10066,7 +10283,7 @@
 "^":"TpZ:12;a",
 $1:function(a){return a.OS(this.a)},
 $isEH:true},
-ma:{
+FcD:{
 "^":"TpZ:12;a",
 $1:function(a){return J.V1(a,this.a)},
 $isEH:true},
@@ -10078,7 +10295,7 @@
 "^":"As3;MW",
 lF:function(){var z,y,x
 z=P.Ls(null,null,null,P.qU)
-for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]);y.G();){x=J.rr(y.lo)
+for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=J.rr(y.lo)
 if(x.length!==0)z.h(0,x)}return z},
 p5:function(a){P.F(a,!0,null)
 J.Pw(this.MW,a.zV(0," "))}},
@@ -10087,15 +10304,15 @@
 DT:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
 LX:function(a){return this.DT(a,!1)}},
 RO:{
-"^":"wS;DK,Ph,Sg",
-KR:function(a,b,c,d){var z=new W.Ov(0,this.DK,this.Ph,W.aF(a),this.Sg)
+"^":"wS;bi,Ph,Sg",
+KR:function(a,b,c,d){var z=new W.Ov(0,this.bi,this.Ph,W.aF(a),this.Sg)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.Zz()
 return z},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)}},
 mw:{
-"^":"RO;DK,Ph,Sg",
+"^":"RO;bi,Ph,Sg",
 WO:function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"wS",0)])
 return H.VM(new P.c9(new W.tS(b),z),[H.ip(z,"wS",0),null])},
 $iswS:true},
@@ -10119,7 +10336,7 @@
 v.$builtinTypeInfo=[null]
 z.h(0,v)}y=z.pY
 y.toString
-return H.VM(new P.Ik(y),[H.Oq(y,0)]).KR(a,b,c,d)},
+return H.VM(new P.Ik(y),[H.u3(y,0)]).KR(a,b,c,d)},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)},
 $iswS:true},
@@ -10133,24 +10350,27 @@
 return a},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Ov:{
-"^":"yX;VP,DK,Ph,u7,Sg",
-ed:function(){if(this.DK==null)return
+"^":"yX;VP,bi,Ph,u7,Sg",
+ed:function(){if(this.bi==null)return
 this.Ns()
-this.DK=null
+this.bi=null
 this.u7=null
 return},
-Fv:[function(a,b){if(this.DK==null)return;++this.VP
+Fv:[function(a,b){if(this.bi==null)return;++this.VP
 this.Ns()
-if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,22,126],
+if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,128,22,129],
 gUF:function(){return this.VP>0},
-QE:[function(a){if(this.DK==null||this.VP<=0)return;--this.VP
+QE:[function(a){if(this.bi==null||this.VP<=0)return;--this.VP
 this.Zz()},"$0","gDQ",0,0,17],
 Zz:function(){var z=this.u7
-if(z!=null&&this.VP<=0)J.V5(this.DK,this.Ph,z,this.Sg)},
+if(z!=null&&this.VP<=0)J.cZ(this.bi,this.Ph,z,this.Sg)},
 Ns:function(){var z=this.u7
-if(z!=null)J.GJ(this.DK,this.Ph,z,this.Sg)}},
+if(z!=null)J.GJ(this.bi,this.Ph,z,this.Sg)}},
 qO:{
 "^":"a;pY,uZ",
+gvq:function(a){var z=this.pY
+z.toString
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
 h:function(a,b){var z,y
 z=this.uZ
 if(z.x4(0,b))return
@@ -10159,7 +10379,7 @@
 Rz:function(a,b){var z=this.uZ.Rz(0,b)
 if(z!=null)z.ed()},
 xO:[function(a){var z,y
-for(z=this.uZ,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Oq(y,0),H.Oq(y,1)]);y.G();)y.lo.ed()
+for(z=this.uZ,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.u3(y,0),H.u3(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
 this.pY.xO(0)},"$0","gQF",0,0,17],
 xd:function(a){this.pY=P.bK(this.gQF(this),null,!0,a)}},
@@ -10203,8 +10423,8 @@
 sB:function(a,b){J.wg(this.xa,b)},
 GT:function(a,b){J.LH(this.xa,b)},
 Jd:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return J.DP(this.xa,b,c)},
-kJ:function(a,b){return this.XU(a,b,0)},
+XU:function(a,b,c){return J.G0(this.xa,b,c)},
+Mw:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){return J.ff(this.xa,b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
 xe:function(a,b,c){return J.Vk(this.xa,b,c)},
@@ -10235,13 +10455,13 @@
 $isEH:true},
 dW:{
 "^":"a;Ui",
-gjY:function(a){return W.zK(this.Ui.history)},
+gbq:function(a){return W.zK(this.Ui.history)},
 geT:function(a){return W.P1(this.Ui.parent)},
 xO:function(a){return this.Ui.close()},
-kr:function(a,b,c,d){this.Ui.postMessage(P.pf(b),c)},
-X6:function(a,b,c){return this.kr(a,b,c,null)},
+xc:function(a,b,c,d){this.Ui.postMessage(P.pf(b),c)},
+X6:function(a,b,c){return this.xc(a,b,c,null)},
 gI:function(a){return H.vh(P.f("You can only attach EventListeners to your own window."))},
-Yb:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
+On:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 Y9:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 $isPZ:true,
 static:{P1:function(a){if(a===window)return a
@@ -10249,12 +10469,12 @@
 VP:{
 "^":"a;IP",
 static:{zK:function(a){if(a===window.history)return a
-else return new W.VP(a)}}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+else return new W.VP(a)}}}}],["","",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
 $ishF:true,
-"%":"IDBKeyRange"}}],["dart.dom.svg","dart:svg",,P,{
+"%":"IDBKeyRange"}}],["","",,P,{
 "^":"",
 Y0Y:{
 "^":"tpr;N:target=,mH:href=",
@@ -10262,7 +10482,7 @@
 ZJQ:{
 "^":"Rc;mH:href=",
 "%":"SVGAltGlyphElement"},
-eG:{
+jwG:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEBlendElement"},
 lvr:{
@@ -10313,7 +10533,7 @@
 HX:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFETileElement"},
-Fu:{
+juM:{
 "^":"d5G;t5:type=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFETurbulenceElement"},
 OE5:{
@@ -10322,7 +10542,7 @@
 l6:{
 "^":"tpr;fg:height=,x=,y=",
 "%":"SVGForeignObjectElement"},
-en:{
+d0D:{
 "^":"tpr;",
 "%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
 tpr:{
@@ -10337,8 +10557,8 @@
 Gr5:{
 "^":"d5G;fg:height=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
-MU:{
-"^":"en;fg:height=,x=,y=",
+fQ:{
+"^":"d0D;fg:height=,x=,y=",
 "%":"SVGRectElement"},
 qIR:{
 "^":"d5G;t5:type%,mH:href=",
@@ -10354,7 +10574,7 @@
 gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
 gEr:function(a){return H.VM(new W.mw(a,C.U3.Ph,!1),[null])},
 gfs:function(a){return H.VM(new W.mw(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.mw(a,C.i3.Ph,!1),[null])},
+gQb:function(a){return H.VM(new W.mw(a,C.i3.Ph,!1),[null])},
 gVY:function(a){return H.VM(new W.mw(a,C.Whw.Ph,!1),[null])},
 gf0:function(a){return H.VM(new W.mw(a,C.Kq.Ph,!1),[null])},
 $isPZ:true,
@@ -10386,20 +10606,20 @@
 z=this.LO.getAttribute("class")
 y=P.Ls(null,null,null,P.qU)
 if(z==null)return y
-for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Oq(x,0)]);x.G();){w=J.rr(x.lo)
+for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=J.rr(x.lo)
 if(w.length!==0)y.h(0,w)}return y},
-p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{
+p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["","",,P,{
 "^":"",
 QmI:{
 "^":"Gv;tT:code=,G1:message=",
-"%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
+"%":"SQLError"}}],["","",,P,{
 "^":"",
 hq:{
 "^":"a;",
 $ishq:true,
-static:{N3:function(){return new H.kuS((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
+static:{N3:function(){return new H.kuS((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["","",,P,{
 "^":"",
-xZ:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
+z8:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
@@ -10407,7 +10627,7 @@
 Dm:function(a,b,c){var z
 if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
 return!0}catch(z){H.Ru(z)}return!1},
-Om:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
+Jk:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
 return},
 wY:[function(a){var z
 if(a==null)return
@@ -10418,7 +10638,7 @@
 else if(!!z.$isE4)return a.eh
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
 else return P.hE(a,"_$dart_jsObject",new P.Hp($.iW()))}},"$1","En",2,0,12,63],
-hE:function(a,b,c){var z=P.Om(a,b)
+hE:function(a,b,c){var z=P.Jk(a,b)
 if(z==null){z=c.$1(a)
 P.Dm(a,b,z)}return z},
 dU:[function(a){var z
@@ -10432,7 +10652,7 @@
 ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
 else return P.iQ(a,$.Iq(),new P.QS())},
-iQ:function(a,b,c){var z=P.Om(a,b)
+iQ:function(a,b,c){var z=P.Jk(a,b)
 if(z==null||!(a instanceof Object)){z=c.$1(a)
 P.Dm(a,b,z)}return z},
 E4:{
@@ -10486,7 +10706,7 @@
 return P.dU(this.eh.apply(z,y))},
 PO:function(a){return this.qP(a,null)},
 $isr7:true,
-static:{mt:function(a){return new P.r7(P.xZ(a,!0))}}},
+static:{mt:function(a){return new P.r7(P.z8(a,!0))}}},
 GD:{
 "^":"WkF;eh",
 t:function(a,b){var z
@@ -10531,7 +10751,7 @@
 $asQV:null},
 DV:{
 "^":"TpZ:12;",
-$1:function(a){var z=P.xZ(a,!1)
+$1:function(a){var z=P.z8(a,!1)
 P.Dm(z,$.Dp(),a)
 return z},
 $isEH:true},
@@ -10550,7 +10770,7 @@
 QS:{
 "^":"TpZ:12;",
 $1:function(a){return new P.E4(a)},
-$isEH:true}}],["dart.math","dart:math",,P,{
+$isEH:true}}],["","",,P,{
 "^":"",
 Zm:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
@@ -10582,7 +10802,7 @@
 return Math.random()*a>>>0}},
 kh:{
 "^":"a;Pd,Ak",
-X9:function(){var z,y,x,w,v,u
+xq:function(){var z,y,x,w,v,u
 z=this.Pd
 y=4294901760*z
 x=(y&4294967295)>>>0
@@ -10595,8 +10815,8 @@
 j1:function(a){var z,y,x
 if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 z=a-1
-if((a&z)===0){this.X9()
-return(this.Pd&z)>>>0}do{this.X9()
+if((a&z)===0){this.xq()
+return(this.Pd&z)>>>0}do{this.xq()
 y=this.Pd
 x=y%a}while(y-x+a>=4294967296)
 return x},
@@ -10630,10 +10850,10 @@
 this.Pd=(t^u)>>>0
 this.Ak=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
 if(this.Ak===0&&this.Pd===0)this.Pd=23063
-this.X9()
-this.X9()
-this.X9()
-this.X9()},
+this.xq()
+this.xq()
+this.xq()
+this.xq()},
 static:{"^":"tgM,PZi,JYU",Nh:function(a){var z=new P.kh(0,0)
 z.qR(a)
 return z}}},
@@ -10714,42 +10934,7 @@
 static:{T7:function(a,b,c,d,e){var z,y
 z=c<0?-c*0:c
 y=d<0?-d*0:d
-return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
-"^":"",
-qp:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
-A2:{
-"^":"mAS;Rp"},
-mAS:{
-"^":"Nx3+B8q;",
-$isZ0:true,
-$asZ0:null},
-B8q:{
-"^":"a;",
-u:function(a,b,c){return Q.qp()},
-FV:function(a,b){return Q.qp()},
-Rz:function(a,b){return Q.qp()},
-V1:function(a){return Q.qp()},
-$isZ0:true,
-$asZ0:null},
-Nx3:{
-"^":"a;",
-t:function(a,b){return this.Rp.t(0,b)},
-u:function(a,b,c){this.Rp.u(0,b,c)},
-FV:function(a,b){this.Rp.FV(0,b)},
-V1:function(a){this.Rp.V1(0)},
-x4:function(a,b){return this.Rp.x4(0,b)},
-aN:function(a,b){this.Rp.aN(0,b)},
-gl0:function(a){return this.Rp.X5===0},
-gor:function(a){return this.Rp.X5!==0},
-gvc:function(a){var z=this.Rp
-return H.VM(new P.i5(z),[H.Oq(z,0)])},
-gB:function(a){return this.Rp.X5},
-Rz:function(a,b){return this.Rp.Rz(0,b)},
-gUQ:function(a){var z=this.Rp
-return z.gUQ(z)},
-bu:[function(a){return P.vW(this.Rp)},"$0","gAY",0,0,71],
-$isZ0:true,
-$asZ0:null}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
+return H.VM(new P.tn(a,b,z,y),[e])}}}}],["","",,H,{
 "^":"",
 m6:function(a){a.toString
 return a},
@@ -10779,22 +10964,22 @@
 zU7:{
 "^":"Dg;",
 gbx:function(a){return C.kq},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.CP]},
-$isAS:true,
 "%":"Float32Array"},
 K8Q:{
 "^":"Dg;",
-gbx:function(a){return C.G0},
+gbx:function(a){return C.Dv},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.CP]},
-$isAS:true,
 "%":"Float64Array"},
 xja:{
 "^":"Pg;",
@@ -10802,12 +10987,12 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Int16Array"},
 dE:{
 "^":"Pg;",
@@ -10815,12 +11000,12 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Int32Array"},
 Zc5:{
 "^":"Pg;",
@@ -10828,12 +11013,12 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Int8Array"},
 pd:{
 "^":"Pg;",
@@ -10841,12 +11026,12 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Uint16Array"},
 Pqh:{
 "^":"Pg;",
@@ -10854,12 +11039,12 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Uint32Array"},
 eEV:{
 "^":"Pg;",
@@ -10868,12 +11053,12 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"CanvasPixelArray|Uint8ClampedArray"},
 V6:{
 "^":"Pg;",
@@ -10882,12 +11067,12 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":";Uint8Array"},
 b0B:{
 "^":"eH;",
@@ -10915,12 +11100,7 @@
 YW:function(a,b,c,d,e){if(!!J.x(d).$isDg){this.oZ(a,b,c,d,e)
 return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-$isDg:true,
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]}},
+$isDg:true},
 Ui:{
 "^":"b0B+lD;",
 $isWO:true,
@@ -10952,16 +11132,16 @@
 $isQV:true,
 $asQV:function(){return[P.KN]}},
 Ipv:{
-"^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
+"^":"ObS+SU7;"}}],["","",,H,{
 "^":"",
 qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
 return}if(typeof console=="object"&&typeof console.log!="undefined"){console.log(a)
 return}if(typeof window=="object")return
 if(typeof print=="function"){print(a)
-return}throw"Unable to print message: "+String(a)}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw"Unable to print message: "+String(a)}}],["","",,F,{
 "^":"",
 ZP:{
-"^":"D13;Py,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"D13;Py,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gkc:function(a){return a.Py},
 skc:function(a,b){a.Py=this.ct(a,C.yh,a.Py,b)},
 static:{Yw:function(a){var z,y
@@ -10969,7 +11149,7 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -10978,10 +11158,10 @@
 return a}}},
 D13:{
 "^":"uL+Pi;",
-$isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
+$isd3:true}}],["","",,L,{
 "^":"",
 nJ:{
-"^":"WZq;a3,Ek,Ln,y4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"WZq;a3,Ek,Ln,y4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 ga4:function(a){return a.a3},
 sa4:function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},
 gdu:function(a){return a.Ek},
@@ -10996,7 +11176,7 @@
 z=this.ct(a,C.eh,a.Ek,z)
 a.Ek=z
 if(J.xC(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gVr",6,0,111,2,102,103],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,113,2,104,105],
 Z1:[function(a,b,c,d){var z,y,x
 J.Kr(b)
 z=a.a3
@@ -11005,10 +11185,10 @@
 x=R.tB(y)
 J.kW(x,"expr",z)
 J.Vk(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,111,2,102,103],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,113,2,104,105],
 o5:[function(a,b){var z=J.bN(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,139,2],
-static:{Rp:function(a){var z,y,x
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,143,2],
+static:{Rpj:function(a){var z,y,x
 z=R.tB([])
 y=P.L5(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -11016,7 +11196,7 @@
 a.Ek="1-line"
 a.y4=z
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=y
 a.ZQ=x
@@ -11028,11 +11208,11 @@
 $isd3:true},
 YW:{
 "^":"TpZ:12;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,140,"call"],
-$isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,144,"call"],
+$isEH:true}}],["","",,R,{
 "^":"",
 Eg:{
-"^":"KAf;fe,l1,bY,jv,oy,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"KAf;fe,l1,bY,jv,oy,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gv8:function(a){return a.fe},
 sv8:function(a,b){a.fe=this.ct(a,C.S4,a.fe,b)},
 gph:function(a){return a.l1},
@@ -11060,7 +11240,7 @@
 a.jv=""
 a.oy=null
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -11071,64 +11251,64 @@
 "^":"xc+Pi;",
 $isd3:true},
 Kz:{
-"^":"TpZ:141;a",
+"^":"TpZ:145;a",
 $1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,92,"call"],
+z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,94,"call"],
 $isEH:true},
 uv:{
 "^":"TpZ:74;b",
 $0:[function(){var z=this.b
 z.fe=J.Q5(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+$isEH:true}}],["","",,D,{
 "^":"",
 i7:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{hSW:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.MC.ZL(a)
 C.MC.XI(a)
-return a}}}}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+return a}}}}],["","",,A,{
 "^":"",
 Gk:{
-"^":"pva;KV,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"pva;KV,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gt0:function(a){return a.KV},
 st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
-SK:[function(a,b){J.cI(a.KV).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.KV).YM(b)},"$1","gvC",2,0,19,100],
 static:{cYO:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.D4.ZL(a)
-C.D4.XI(a)
+C.LTI.ZL(a)
+C.LTI.XI(a)
 return a}}},
 pva:{
 "^":"uL+Pi;",
-$isd3:true}}],["flag_list_element","package:observatory/src/elements/flag_list.dart",,X,{
+$isd3:true}}],["","",,X,{
 "^":"",
 J3:{
-"^":"cda;DC,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"cda;DC,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gpM:function(a){return a.DC},
 spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
-SK:[function(a,b){J.cI(a.DC).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.DC).YM(b)},"$1","gvC",2,0,19,100],
 static:{TsF:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -11139,7 +11319,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 MJ:{
-"^":"waa;Zc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"waa;Zc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gJ6:function(a){return a.Zc},
 sJ6:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
 static:{IfX:function(a){var z,y
@@ -11147,7 +11327,7 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -11156,10 +11336,10 @@
 return a}}},
 waa:{
 "^":"uL+Pi;",
-$isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
+$isd3:true}}],["","",,U,{
 "^":"",
 DK:{
-"^":"T53;lh,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"T53;lh,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gU4:function(a){return a.lh},
 sU4:function(a,b){a.lh=this.ct(a,C.QK,a.lh,b)},
 static:{v9:function(a){var z,y
@@ -11169,7 +11349,7 @@
 a.lh=!0
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -11178,33 +11358,37 @@
 return a}}},
 T53:{
 "^":"xI+Pi;",
-$isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
+$isd3:true}}],["","",,N,{
 "^":"",
 BS:{
-"^":"V9;P6,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V4;P6,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gig:function(a){return a.P6},
 sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
-SK:[function(a,b){J.cI(a.P6).YM(b)},"$1","gvC",2,0,19,98],
-j9:[function(a,b){J.eg(a.P6).YM(b)},"$1","gDX",2,0,19,98],
+SK:[function(a,b){J.cI(a.P6).YM(b)},"$1","gvC",2,0,19,100],
+Ur:[function(a,b){J.eg(a.P6).YM(b)},"$1","gDX",2,0,19,100],
 static:{nz:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.p0.ZL(a)
 C.p0.XI(a)
 return a}}},
-V9:{
+V4:{
 "^":"uL+Pi;",
-$isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
+$isd3:true}}],["","",,O,{
 "^":"",
 Hz:{
 "^":"a;zE,mS",
-PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,142],
+sih:function(a,b){var z=this.mS
+C.yp.zB(J.Qd(this.zE),z,z+4,b)},
+gih:function(a){var z=this.mS
+return C.yp.Mu(J.Qd(this.zE),z,z+4)},
+PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,146],
 gvH:function(a){return C.CD.cU(this.mS,4)},
 static:{"^":"Q0z",x6:function(a,b){var z,y,x
 z=b.gy(b)
@@ -11217,7 +11401,7 @@
 x2:{
 "^":"a;Yu<,tL"},
 Vb:{
-"^":"V10;hi,An,dW,rM,Aj,UL,PA,oj,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V9;hi,An,dW,rM,Aj,UL,PA,oj,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gpf:function(a){return a.PA},
 spf:function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},
 gyw:function(a){return a.oj},
@@ -11227,9 +11411,9 @@
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
 a.hi=z
 z=J.Q9(z)
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gmo(a)),z.Sg),[H.Oq(z,0)]).Zz()
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(this.gmo(a)),z.Sg),[H.u3(z,0)]).Zz()
 z=J.GW(a.hi)
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gJb(a)),z.Sg),[H.Oq(z,0)]).Zz()},
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(this.gJb(a)),z.Sg),[H.u3(z,0)]).Zz()},
 LV:function(a,b){var z,y,x
 for(z=J.mY(b),y=0;z.G();){x=z.lo
 if(typeof x!=="number")return H.s(x)
@@ -11292,9 +11476,9 @@
 w=z.mS
 v=a.UL.t(0,a.Aj.t(0,this.LV(a,C.yp.Mu(J.Qd(z.zE),w,w+4))))
 z=J.xC(v,"")?"-":H.d(v)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,139,143],
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,143,85],
 X7:[function(a,b){var z=J.u1(this.WE(a,J.op(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,139,143],
+window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,143,85],
 My:function(a){var z,y,x,w,v
 z=a.oj
 if(z==null||a.hi==null)return
@@ -11365,9 +11549,9 @@
 P.Iw(new O.R5(a,b),null)},
 SK:[function(a,b){var z=a.oj
 if(z==null)return
-J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).YM(b)},"$1","gvC",2,0,19,98],
-YS7:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,19,59],
-static:{"^":"nK,Os,SoT,WBO",pn:function(a){var z,y,x,w,v
+J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).YM(b)},"$1","gvC",2,0,19,100],
+YS:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,19,59],
+static:{"^":"nK,Os,SoT,WBO",teo:function(a){var z,y,x,w,v
 z=P.Fl(null,null)
 y=P.Fl(null,null)
 x=P.Fl(null,null)
@@ -11378,14 +11562,14 @@
 a.Aj=y
 a.UL=x
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=w
 a.ZQ=v
-C.Cs.ZL(a)
-C.Cs.XI(a)
+C.wc.ZL(a)
+C.wc.XI(a)
 return a}}},
-V10:{
+V9:{
 "^":"uL+Pi;",
 $isd3:true},
 R5:{
@@ -11393,33 +11577,33 @@
 $0:function(){J.fi(this.a,this.b+1)},
 $isEH:true},
 aG:{
-"^":"TpZ:110;a",
+"^":"TpZ:112;a",
 $1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,144,"call"],
+z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 z4:{
 "^":"TpZ:79;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,2,145,"call"],
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,2,148,"call"],
 $isEH:true},
 oc:{
 "^":"TpZ:74;a",
 $0:function(){J.vP(this.a)},
-$isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+$isEH:true}}],["","",,K,{
 "^":"",
 UC:{
 "^":"Vz;oH,vp,zz,pT,jV,AP,fn",
 eE:function(a,b){var z
 if(b===0){z=this.vp
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.O6(J.UQ(J.U8(z[a]),b))}return G.Vz.prototype.eE.call(this,a,b)}},
+return J.O6(J.UQ(J.hI(z[a]),b))}return G.Vz.prototype.eE.call(this,a,b)}},
 Ly:{
-"^":"V11;MF,uY,GQ,I8,Oc,GM,nc,pp,Ol,Sk,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V10;MF,uY,GQ,I8,Oc,GM,Rp,pp,Ol,Sk,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gYt:function(a){return a.MF},
 sYt:function(a,b){a.MF=this.ct(a,C.TN,a.MF,b)},
 gcH:function(a){return a.uY},
 scH:function(a,b){a.uY=this.ct(a,C.Zi,a.uY,b)},
-gLF:function(a){return a.nc},
-sLF:function(a,b){a.nc=this.ct(a,C.kG,a.nc,b)},
+gLF:function(a){return a.Rp},
+sLF:function(a,b){a.Rp=this.ct(a,C.kG,a.Rp,b)},
 gB1:function(a){return a.Ol},
 sB1:function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},
 god:function(a){return a.Sk},
@@ -11443,21 +11627,21 @@
 w.gUY().eC(x.t(y,"new"))
 w.gxQ().eC(x.t(y,"old"))}},
 Yz:function(a){var z,y,x,w,v,u,t,s,r,q
-a.nc.Ai()
+a.Rp.Ai()
 for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=J.UQ(z.gl(),"class")
 if(y==null)continue
-if(y.gJL())continue
-x=y.gUY().gbi().rT
-w=y.gUY().gbi().wf
+if(y.gMp())continue
+x=y.gUY().ghb().rT
+w=y.gUY().ghb().wf
 v=y.gUY().gl().rT
 u=y.gUY().gl().wf
-t=y.gxQ().gbi().rT
-s=y.gxQ().gbi().wf
+t=y.gxQ().ghb().rT
+s=y.gxQ().ghb().wf
 r=y.gxQ().gl().rT
 q=y.gxQ().gl().wf
-J.fD(a.nc,new G.Ni([y,"",x,w,v,u,"",t,s,r,q]))}J.tO(a.nc)},
+J.fD(a.Rp,new G.Ni([y,"",x,w,v,u,"",t,s,r,q]))}J.II(a.Rp)},
 E4:function(a,b,c){var z,y,x,w,v,u
-z=J.UQ(J.TY(a.nc),c)
+z=J.UQ(J.TY(a.Rp),c)
 y=J.RE(b)
 x=J.RE(z)
 J.PP(J.UQ(J.Mx(J.UQ(y.gks(b),0)),0),J.UQ(x.gUQ(z),0))
@@ -11469,13 +11653,13 @@
 u=J.UQ(y.gks(b),w)
 v=J.RE(u)
 v.smk(u,J.AG(J.UQ(x.gUQ(z),w)))
-v.sa4(u,a.nc.Gu(c,w))}++w}},
+v.sa4(u,a.Rp.Gu(c,w))}++w}},
 Jh:function(a){var z,y,x,w,v,u,t,s
 z=J.Mx(a.pp)
-if(z.gB(z)>a.nc.gzz().length){z=J.Mx(a.pp)
-y=z.gB(z)-a.nc.gzz().length
+if(z.gB(z)>a.Rp.gzz().length){z=J.Mx(a.pp)
+y=z.gB(z)-a.Rp.gzz().length
 for(x=0;x<y;++x)J.Mx(a.pp).mv(0)}else{z=J.Mx(a.pp)
-if(z.gB(z)<a.nc.gzz().length){z=a.nc.gzz().length
+if(z.gB(z)<a.Rp.gzz().length){z=a.Rp.gzz().length
 w=J.Mx(a.pp)
 v=z-w.gB(w)
 for(x=0;x<v;++x){u=document.createElement("tr",null)
@@ -11495,28 +11679,28 @@
 z.iF(u,-1)
 z.iF(u,-1)
 z.iF(u,-1)
-J.Mx(a.pp).h(0,u)}}}for(x=0;x<a.nc.gzz().length;++x){z=a.nc.gzz()
+J.Mx(a.pp).h(0,u)}}}for(x=0;x<a.Rp.gzz().length;++x){z=a.Rp.gzz()
 if(x>=z.length)return H.e(z,x)
 s=z[x]
 this.E4(a,J.Mx(a.pp).t(0,x),s)}},
 AE:[function(a,b,c,d){var z,y,x
-if(!!J.x(d).$isv6){z=a.nc.gxp()
+if(!!J.x(d).$isv6){z=a.Rp.gxp()
 y=d.cellIndex
-x=a.nc
+x=a.Rp
 if(z==null?y!=null:z!==y){x.sxp(y)
-a.nc.sT3(!0)}else x.sT3(!x.gT3())
-J.tO(a.nc)
-this.Jh(a)}},"$3","gQq",6,0,101,2,102,103],
+a.Rp.sT3(!0)}else x.sT3(!x.gT3())
+J.II(a.Rp)
+this.Jh(a)}},"$3","gQq",6,0,103,2,104,105],
 SK:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).YM(b)},"$1","gvC",2,0,19,98],
+J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).YM(b)},"$1","gvC",2,0,19,100],
 zT:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).YM(b)},"$1","gyW",2,0,19,98],
+J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).YM(b)},"$1","gyW",2,0,19,100],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).YM(b)},"$1","gNb",2,0,19,98],
-Ed:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,146,147],
+J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).YM(b)},"$1","gNb",2,0,19,100],
+Ed:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,149,150],
 n1:[function(a,b){var z,y,x,w,v
 z=a.Ol
 if(z==null)return
@@ -11528,44 +11712,44 @@
 if(!J.xC(y,0)){z=P.Wu(y,!1).bu(0)
 a.uY=this.ct(a,C.Zi,a.uY,z)}y=H.BU(J.UQ(a.Ol,"dateLastServiceGC"),null,null)
 if(!J.xC(y,0)){z=P.Wu(y,!1).bu(0)
-a.MF=this.ct(a,C.TN,a.MF,z)}z=a.GQ.KJ
+a.MF=this.ct(a,C.TN,a.MF,z)}z=a.GQ.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 x=J.aT(a.Ol)
 z=a.GQ
 w=x.gUY().gSU()
-z=z.KJ
+z=z.Yb
 v=[]
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
 z.V7("addRow",[H.VM(new P.GD(v),[null])])
 v=a.GQ
 z=J.Hn(x.gUY().gCs(),x.gUY().gSU())
-v=v.KJ
+v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
 v.V7("addRow",[H.VM(new P.GD(w),[null])])
 w=a.GQ
 v=x.gUY().gMX()
-w=w.KJ
+w=w.Yb
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
 w.V7("addRow",[H.VM(new P.GD(z),[null])])
-z=a.Oc.KJ
+z=a.Oc.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 z=a.Oc
 w=x.gxQ().gSU()
-z=z.KJ
+z=z.Yb
 v=[]
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
 z.V7("addRow",[H.VM(new P.GD(v),[null])])
 v=a.Oc
 z=J.Hn(x.gxQ().gCs(),x.gxQ().gSU())
-v=v.KJ
+v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
 v.V7("addRow",[H.VM(new P.GD(w),[null])])
 w=a.Oc
 v=x.gxQ().gMX()
-w=w.KJ
+w=w.Yb
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
 w.V7("addRow",[H.VM(new P.GD(z),[null])])
@@ -11582,28 +11766,28 @@
 if(z==null)return""
 y=J.RE(z)
 x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,148,149],
-uW:[function(a,b){var z,y
+return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,151,152],
+NC:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,148,149],
+return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,151,152],
 F9:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.wF((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,148,149],
+return J.wF((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,151,152],
 Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
 a.GQ=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
-a.GQ.KJ.V7("addColumn",["number","Size"])
+a.GQ.Yb.V7("addColumn",["number","Size"])
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 a.Oc=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
-a.Oc.KJ.V7("addColumn",["number","Size"])
+a.Oc.Yb.V7("addColumn",["number","Size"])
 z=H.VM([],[G.Ni])
-z=this.ct(a,C.kG,a.nc,new K.UC([new G.Kt("Class",G.ji()),new G.Kt("",G.ji()),new G.Kt("Accumulated Size (New)",G.Gt()),new G.Kt("Accumulated Instances",G.HH()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.HH()),new G.Kt("",G.ji()),new G.Kt("Accumulator Size (Old)",G.Gt()),new G.Kt("Accumulator Instances",G.HH()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.HH())],z,[],0,!0,null,null))
-a.nc=z
+z=this.ct(a,C.kG,a.Rp,new K.UC([new G.Ktd("Class",G.ji()),new G.Ktd("",G.ji()),new G.Ktd("Accumulated Size (New)",G.Gt()),new G.Ktd("Accumulated Instances",G.HH()),new G.Ktd("Current Size",G.Gt()),new G.Ktd("Current Instances",G.HH()),new G.Ktd("",G.ji()),new G.Ktd("Accumulator Size (Old)",G.Gt()),new G.Ktd("Accumulator Instances",G.HH()),new G.Ktd("Current Size",G.Gt()),new G.Ktd("Current Instances",G.HH())],z,[],0,!0,null,null))
+a.Rp=z
 z.sxp(2)},
 static:{Ut:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -11612,7 +11796,7 @@
 a.MF="---"
 a.uY="---"
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -11620,9 +11804,9 @@
 C.Vc.XI(a)
 C.Vc.Zy(a)
 return a}}},
-V11:{
+V10:{
 "^":"uL+Pi;",
-$isd3:true}}],["html_common","dart:html_common",,P,{
+$isd3:true}}],["","",,P,{
 "^":"",
 pf:function(a){var z,y
 z=[]
@@ -11654,13 +11838,13 @@
 return y},
 $isEH:true},
 rG:{
-"^":"TpZ:150;d",
+"^":"TpZ:153;d",
 $1:function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 fh:{
-"^":"TpZ:151;e",
+"^":"TpZ:154;e",
 $2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
@@ -11718,13 +11902,13 @@
 return y},
 $isEH:true},
 D6:{
-"^":"TpZ:150;c",
+"^":"TpZ:153;c",
 $1:function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 KC:{
-"^":"TpZ:151;d",
+"^":"TpZ:154;d",
 $2:function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
@@ -11743,7 +11927,7 @@
 if(y!=null)return y
 y=P.Fl(null,null)
 this.bK.$2(z,y)
-for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.Oq(x,0)]);x.G();){w=x.lo
+for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.lo
 y.u(0,w,this.$1(a[w]))}return y}if(a instanceof Array){z=this.f.$1(a)
 y=this.UI.$1(z)
 if(y!=null)return y
@@ -11771,12 +11955,12 @@
 aN:function(a,b){this.lF().aN(0,b)},
 zV:function(a,b){return this.lF().zV(0,b)},
 ez:[function(a,b){var z=this.lF()
-return H.VM(new H.xy(z,b),[H.Oq(z,0),null])},"$1","gIr",2,0,152,30],
+return H.VM(new H.xy(z,b),[H.u3(z,0),null])},"$1","gIr",2,0,155,30],
 ad:function(a,b){var z=this.lF()
-return H.VM(new H.U5(z,b),[H.Oq(z,0)])},
+return H.VM(new H.U5(z,b),[H.u3(z,0)])},
 lM:[function(a,b){var z=this.lF()
-return H.VM(new H.oA(z,b),[H.Oq(z,0),null])},"$1","git",2,0,153,30],
-ou:function(a,b){return this.lF().ou(0,b)},
+return H.VM(new H.oA(z,b),[H.u3(z,0),null])},"$1","git",2,0,156,30],
+Vr:function(a,b){return this.lF().Vr(0,b)},
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
 gB:function(a){return this.lF().X5},
@@ -11801,6 +11985,8 @@
 y=z.Ys()
 y.FV(0,z)
 return y},
+eR:function(a,b){var z=this.lF()
+return H.ke(z,b,H.u3(z,0))},
 V1:function(a){this.OS(new P.uQ())},
 OS:function(a){var z,y
 z=this.lF()
@@ -11814,19 +12000,19 @@
 $asQV:function(){return[P.qU]}},
 GE:{
 "^":"TpZ:12;a",
-$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,154,"call"],
+$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,157,"call"],
 $isEH:true},
 rl:{
 "^":"TpZ:12;a",
-$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,154,"call"],
+$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,157,"call"],
 $isEH:true},
 PR:{
 "^":"TpZ:12;a",
-$1:[function(a){return J.rA(a,this.a)},"$1",null,2,0,null,154,"call"],
+$1:[function(a){return J.r8(a,this.a)},"$1",null,2,0,null,157,"call"],
 $isEH:true},
 uQ:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,154,"call"],
+$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,157,"call"],
 $isEH:true},
 D7:{
 "^":"ark;Yn,iz",
@@ -11842,7 +12028,7 @@
 this.UZ(0,b,z)},
 h:function(a,b){this.iz.NL.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Oq(b,0)]),y=this.iz.NL;z.G();)y.appendChild(z.lo)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.iz.NL;z.G();)y.appendChild(z.lo)},
 tg:function(a,b){return!1},
 GT:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
 Jd:function(a){return this.GT(a,null)},
@@ -11858,7 +12044,7 @@
 z=this.iz.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},
+J.r5(z,c,y[b])},
 Rz:function(a,b){var z,y,x
 if(!J.x(b).$ish4)return!1
 for(z=0;z<this.gye().length;++z){y=this.gye()
@@ -11871,7 +12057,7 @@
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 gA:function(a){var z=this.gye()
-return H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)])}},
+return H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])}},
 hT:{
 "^":"TpZ:12;",
 $1:function(a){return!!J.x(a).$ish4},
@@ -11879,10 +12065,10 @@
 GS:{
 "^":"TpZ:12;",
 $1:function(a){return J.Mp(a)},
-$isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
+$isEH:true}}],["","",,B,{
 "^":"",
 pR:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gJp:function(a){var z=a.tY
 if(z!=null)if(J.xC(z.gzS(),"Null"))if(J.xC(J.eS(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
 else if(J.xC(J.eS(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
@@ -11897,14 +12083,14 @@
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,155,156,98],
+c.$0()}},"$2","gus",4,0,158,159,100],
 static:{lu:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -11919,79 +12105,79 @@
 a.sTX(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
 z.tY=y.ct(z,C.kY,z.tY,a)
-y.ct(z,C.kY,0,1)},"$1",null,2,0,null,140,"call"],
-$isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+y.ct(z,C.kY,0,1)},"$1",null,2,0,null,144,"call"],
+$isEH:true}}],["","",,Z,{
 "^":"",
 hx:{
-"^":"V12;Xh,f2,Rr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V11;Xh,f2,Rr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 ghf:function(a){return a.Xh},
 shf:function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},
 gIi:function(a){return a.f2},
 sIi:function(a,b){a.f2=this.ct(a,C.XM,a.f2,b)},
 gCF:function(a){return a.Rr},
 sCF:function(a,b){a.Rr=this.ct(a,C.tg,a.Rr,b)},
-vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
-S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retained")).ml(new Z.wU(a))},"$1","ghN",2,0,107,109],
-Pr:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,107,32],
-SK:[function(a,b){J.cI(a.Xh).YM(b)},"$1","gvC",2,0,19,98],
+vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,107,108],
+S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retained")).ml(new Z.wU(a))},"$1","ghN",2,0,109,111],
+Pr:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,109,32],
+SK:[function(a,b){J.cI(a.Xh).YM(b)},"$1","gvC",2,0,19,100],
 static:{CoW:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Rr=null
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.yKx.ZL(a)
 C.yKx.XI(a)
 return a}}},
-V12:{
+V11:{
 "^":"uL+Pi;",
 $isd3:true},
 wU:{
-"^":"TpZ:110;a",
+"^":"TpZ:112;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.Rr=J.Q5(z,C.tg,z.Rr,y)},"$1",null,2,0,null,92,"call"],
+z.Rr=J.Q5(z,C.tg,z.Rr,y)},"$1",null,2,0,null,94,"call"],
 $isEH:true},
 cL:{
-"^":"TpZ:141;a",
+"^":"TpZ:145;a",
 $1:[function(a){var z=this.a
-z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,92,"call"],
-$isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
+z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,94,"call"],
+$isEH:true}}],["","",,E,{
 "^":"",
 L4:{
-"^":"V13;PM,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V12;PM,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gkm:function(a){return a.PM},
 skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
-SK:[function(a,b){J.cI(a.PM).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.PM).YM(b)},"$1","gvC",2,0,19,100],
 static:{p4t:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.wd.ZL(a)
 C.wd.XI(a)
 return a}}},
-V13:{
+V12:{
 "^":"uL+Pi;",
 $isd3:true},
 Mb:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{RVI:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -11999,34 +12185,34 @@
 C.Ag.XI(a)
 return a}}},
 mO:{
-"^":"V14;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V13;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,100],
 static:{Ch:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.Ie.ZL(a)
 C.Ie.XI(a)
 return a}}},
-V14:{
+V13:{
 "^":"uL+Pi;",
 $isd3:true},
 DE:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{oB:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -12034,13 +12220,13 @@
 C.Ig.XI(a)
 return a}}},
 U1:{
-"^":"V15;yR,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V14;yR,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gql:function(a){return a.yR},
 sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
-SK:[function(a,b){J.cI(a.yR).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.yR).YM(b)},"$1","gvC",2,0,19,100],
 Lg:[function(a){J.cI(a.yR).YM(new E.XB(a))},"$0","gW6",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
+a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gW6(a))},
 dQ:function(a){var z
 Z.uL.prototype.dQ.call(this,a)
 z=a.mZ
@@ -12051,29 +12237,29 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.x4.ZL(a)
-C.x4.XI(a)
+C.VLs.ZL(a)
+C.VLs.XI(a)
 return a}}},
-V15:{
+V14:{
 "^":"uL+Pi;",
 $isd3:true},
 XB:{
 "^":"TpZ:74;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 H8:{
-"^":"V16;vd,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V15;vd,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gPB:function(a){return a.vd},
 sPB:function(a,b){a.vd=this.ct(a,C.yL,a.vd,b)},
-SK:[function(a,b){J.cI(a.vd).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.vd).YM(b)},"$1","gvC",2,0,19,100],
 Lg:[function(a){J.cI(a.vd).YM(new E.uN(a))},"$0","gW6",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
+a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gW6(a))},
 dQ:function(a){var z
 Z.uL.prototype.dQ.call(this,a)
 z=a.mZ
@@ -12084,30 +12270,30 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.GII.ZL(a)
-C.GII.XI(a)
+C.tO.ZL(a)
+C.tO.XI(a)
 return a}}},
-V16:{
+V15:{
 "^":"uL+Pi;",
 $isd3:true},
 uN:{
 "^":"TpZ:74;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 WS:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{jS:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -12115,14 +12301,14 @@
 C.bP.XI(a)
 return a}}},
 qh:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{va:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -12130,54 +12316,54 @@
 C.wK.XI(a)
 return a}}},
 oF:{
-"^":"V17;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V16;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,100],
 static:{UE:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.Tl.ZL(a)
 C.Tl.XI(a)
 return a}}},
-V17:{
+V16:{
 "^":"uL+Pi;",
 $isd3:true},
 Q6:{
-"^":"V18;uv,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V17;uv,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gj4:function(a){return a.uv},
 sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
-SK:[function(a,b){J.cI(a.uv).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.uv).YM(b)},"$1","gvC",2,0,19,100],
 static:{chF:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.rU.ZL(a)
 C.rU.XI(a)
 return a}}},
-V18:{
+V17:{
 "^":"uL+Pi;",
 $isd3:true},
 uE:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{AW:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -12185,74 +12371,74 @@
 C.Rr.XI(a)
 return a}}},
 Zn:{
-"^":"V19;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V18;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,100],
 static:{kf:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.ij.ZL(a)
 C.ij.XI(a)
 return a}}},
-V19:{
+V18:{
 "^":"uL+Pi;",
 $isd3:true},
 n5:{
-"^":"V20;h1,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V19;h1,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gHy:function(a){return a.h1},
 sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
-SK:[function(a,b){J.cI(a.h1).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.h1).YM(b)},"$1","gvC",2,0,19,100],
 static:{iOo:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.aV.ZL(a)
 C.aV.XI(a)
 return a}}},
-V20:{
+V19:{
 "^":"uL+Pi;",
 $isd3:true},
 Ma:{
-"^":"V21;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V20;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,100],
 static:{Ii:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.iR.ZL(a)
 C.iR.XI(a)
 return a}}},
-V21:{
+V20:{
 "^":"uL+Pi;",
 $isd3:true},
 wN:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{ML:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -12260,13 +12446,13 @@
 C.RVQ.XI(a)
 return a}}},
 ds:{
-"^":"V22;wT,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V21;wT,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gMZ:function(a){return a.wT},
 sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
-SK:[function(a,b){J.cI(a.wT).YM(b)},"$1","gvC",2,0,19,98],
-nK:[function(a){J.cI(a.wT).YM(new E.As(a))},"$0","guT",0,0,17],
+SK:[function(a,b){J.cI(a.wT).YM(b)},"$1","gvC",2,0,19,100],
+Po:[function(a){J.cI(a.wT).YM(new E.As(a))},"$0","guT",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
+a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.guT(a))},
 dQ:function(a){var z
 Z.uL.prototype.dQ.call(this,a)
 z=a.mZ
@@ -12277,43 +12463,43 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.wP.ZL(a)
 C.wP.XI(a)
 return a}}},
-V22:{
+V21:{
 "^":"uL+Pi;",
 $isd3:true},
 As:{
 "^":"TpZ:74;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 qM:{
-"^":"V23;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V22;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,100],
 static:{tX:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.lX.ZL(a)
 C.lX.XI(a)
 return a}}},
-V23:{
+V22:{
 "^":"uL+Pi;",
 $isd3:true},
 av:{
-"^":"ZzR;CB,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"ZzR;CB,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gEQ:function(a){return a.CB},
 sEQ:function(a,b){a.CB=this.ct(a,C.pH,a.CB,b)},
 static:{R7:function(a){var z,y
@@ -12323,25 +12509,25 @@
 a.CB=!1
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.Wa.ZL(a)
-C.Wa.XI(a)
+C.OkI.ZL(a)
+C.OkI.XI(a)
 return a}}},
 ZzR:{
 "^":"xI+Pi;",
 $isd3:true},
 uz:{
-"^":"V24;RX,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V23;RX,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gNN:function(a){return a.RX},
 Fn:function(a){return this.gNN(a).$0()},
 sNN:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
-SK:[function(a,b){J.cI(a.RX).YM(b)},"$1","gvC",2,0,19,98],
-nK:[function(a){J.cI(a.RX).YM(new E.Cc(a))},"$0","guT",0,0,17],
+SK:[function(a,b){J.cI(a.RX).YM(b)},"$1","gvC",2,0,19,100],
+Po:[function(a){J.cI(a.RX).YM(new E.Cc(a))},"$0","guT",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
+a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.guT(a))},
 dQ:function(a){var z
 Z.uL.prototype.dQ.call(this,a)
 z=a.mZ
@@ -12352,21 +12538,21 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.bZ.ZL(a)
 C.bZ.XI(a)
 return a}}},
-V24:{
+V23:{
 "^":"uL+Pi;",
 $isd3:true},
 Cc:{
 "^":"TpZ:74;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
-$isEH:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
+if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
+$isEH:true}}],["","",,X,{
 "^":"",
 Se:{
 "^":"Y2;B1>,SF,H,Zn<,vs<,ki<,Vh<,ZX<,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
@@ -12406,7 +12592,7 @@
 z.mW(a,b,c,d)
 return z}}},
 kK:{
-"^":"V25;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,WC,Hm=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V24;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,WC,Hm=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gB1:function(a){return a.oi},
 sB1:function(a,b){a.oi=this.ct(a,C.vb,a.oi,b)},
 gPL:function(a){return a.TH},
@@ -12452,11 +12638,11 @@
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=R.tB([])
-a.Hm=new G.xK(z,null,null)
+a.Hm=new G.iY(z,null,null)
 this.Zb(a)},
 m5:[function(a,b){this.SK(a,null)},"$1","gb6",2,0,19,59],
 SK:[function(a,b){var z="profile?tags="+H.d(a.TM)
-J.aT(a.oi).cv(z).ml(new X.Xy(a)).YM(b)},"$1","gvC",2,0,19,98],
+J.aT(a.oi).cv(z).ml(new X.Xy(a)).YM(b)},"$1","gvC",2,0,19,100],
 Zb:function(a){if(a.oi==null)return
 this.GN(a)},
 GN:function(a){var z,y,x,w,v
@@ -12467,8 +12653,8 @@
 x=new H.oP(w,null)
 N.QM("").wF("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,99,100],
-LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,99,100],
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,101,102],
+ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,101,102],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
@@ -12479,7 +12665,7 @@
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.oP(u,null)
-N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,101,2,102,103],
+N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,103,2,104,105],
 static:{"^":"B6",jD:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12494,40 +12680,40 @@
 a.TM="uv"
 a.WC="#tableTree"
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.kS.ZL(a)
 C.kS.XI(a)
 return a}}},
-V25:{
+V24:{
 "^":"uL+Pi;",
 $isd3:true},
 Xy:{
-"^":"TpZ:110;a",
+"^":"TpZ:112;a",
 $1:[function(a){var z=this.a
-z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,157,"call"],
-$isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
+z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,160,"call"],
+$isEH:true}}],["","",,N,{
 "^":"",
 oa:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{IB:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.LN.ZL(a)
 C.LN.XI(a)
-return a}}}}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+return a}}}}],["","",,D,{
 "^":"",
 St:{
-"^":"V26;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V25;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{N5:function(a){var z,y
@@ -12535,49 +12721,46 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.OoF.ZL(a)
 C.OoF.XI(a)
 return a}}},
-V26:{
+V25:{
 "^":"uL+Pi;",
 $isd3:true},
 IW:{
-"^":"V27;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V26;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.rf(a))},"$1","gX0",2,0,158,13],
-kf:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,158,13],
+Fv:[function(a,b){return J.fp(a.ow)},"$1","gX0",2,0,161,13],
+kf:[function(a,b){$.Kh.x3(a.ow)
+return J.df(a.ow)},"$1","gDQ",2,0,161,13],
+tb:[function(a,b){$.Kh.x3(a.ow)
+return J.aN(a.ow)},"$1","gLc",2,0,161,13],
+jA:[function(a,b){$.Kh.x3(a.ow)
+return J.MU(a.ow)},"$1","gqF",2,0,161,13],
+Cx:[function(a,b){$.Kh.x3(a.ow)
+return J.Fy(a.ow)},"$1","gVX",2,0,161,13],
 static:{zr:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.lk8.ZL(a)
 C.lk8.XI(a)
 return a}}},
-V27:{
+V26:{
 "^":"uL+Pi;",
 $isd3:true},
-rf:{
-"^":"TpZ:12;a",
-$1:[function(a){return J.cI(this.a.ow)},"$1",null,2,0,null,140,"call"],
-$isEH:true},
-r8:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-$.Kh.x3(z.ow)
-return J.cI(z.ow)},"$1",null,2,0,null,140,"call"],
-$isEH:true},
 Qh:{
-"^":"V28;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V27;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{Qj:function(a){var z,y
@@ -12585,18 +12768,18 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.rCJ.ZL(a)
 C.rCJ.XI(a)
 return a}}},
-V28:{
+V27:{
 "^":"uL+Pi;",
 $isd3:true},
 Oz:{
-"^":"V29;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V28;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{TSH:function(a){var z,y
@@ -12604,20 +12787,20 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.Ji.ZL(a)
 C.Ji.XI(a)
 return a}}},
-V29:{
+V28:{
 "^":"uL+Pi;",
 $isd3:true},
 vT:{
 "^":"a;Y0,WL",
 eC:function(a){var z,y,x,w,v,u
-z=this.Y0.KJ
+z=this.Y0.Yb
 if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Name"])
 z.V7("addColumn",["number","Value"])}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 for(y=J.RE(a),x=J.mY(y.gvc(a));x.G();){w=x.gl()
@@ -12629,7 +12812,7 @@
 u.$builtinTypeInfo=[null]
 z.V7("addRow",[u])}}},
 Z4:{
-"^":"V30;wd,iw,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V29;wd,iw,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gXE:function(a){return a.wd},
 sXE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
 ak:[function(a,b){var z,y,x
@@ -12644,31 +12827,31 @@
 if(x==null){x=new G.qu(null,P.L5(null,null,null,null,null))
 x.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
 z.WL=x}x.W2(z.Y0)}},"$1","ghU",2,0,19,59],
-static:{Oll:function(a){var z,y
+static:{d7:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.aXP.ZL(a)
 C.aXP.XI(a)
 return a}}},
-V30:{
+V29:{
 "^":"uL+Pi;",
-$isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
+$isd3:true}}],["","",,L,{
 "^":"",
 EN:{
 "^":"a;Yi,S2",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.Yi.KJ
+z=this.Yi.Yb
 if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
 for(y=J.mY(a.gaf());y.G();){x=y.lo
 if(J.xC(x,"Idle"))continue
 z.V7("addColumn",["number",x])}}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-w=J.et(a.gaf(),"Idle")
+w=J.Wa(a.gaf(),"Idle")
 v=a.gij()
 for(u=0;u<a.glI().length;++u){y=a.glI()
 if(u>=y.length)return H.e(y,u)
@@ -12699,23 +12882,23 @@
 y.$builtinTypeInfo=[null]
 z.V7("addRow",[y])}}},
 qk:{
-"^":"V31;TO,Cn,Fs,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V30;TO,Cn,Fs,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 god:function(a){return a.TO},
 sod:function(a,b){a.TO=this.ct(a,C.rB,a.TO,b)},
 vV:[function(a,b){var z=a.TO
-return z.cv(J.ew(J.eS(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
+return z.cv(J.ew(J.eS(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,107,108],
 tI:[function(a){a.TO.m7().ml(new L.LX(a))},"$0","gCt",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.Cn=P.rT(P.ii(0,0,0,0,0,1),this.gCt(a))},
+a.Cn=P.cH(P.ii(0,0,0,0,0,1),this.gCt(a))},
 dQ:function(a){var z
 Z.uL.prototype.dQ.call(this,a)
 z=a.Cn
 if(z!=null){z.ed()
 a.Cn=null}},
-SK:[function(a,b){J.cI(a.TO).YM(b)},"$1","gvC",2,0,19,98],
-j9:[function(a,b){J.eg(a.TO).YM(b)},"$1","gDX",2,0,19,98],
-Fv:[function(a,b){return a.TO.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,158,13],
-kf:[function(a,b){return a.TO.cv("resume").ml(new L.QY(a))},"$1","gDQ",2,0,158,13],
+SK:[function(a,b){J.cI(a.TO).YM(b)},"$1","gvC",2,0,19,100],
+Ur:[function(a,b){J.eg(a.TO).YM(b)},"$1","gDX",2,0,19,100],
+Fv:[function(a,b){return a.TO.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,161,13],
+kf:[function(a,b){return a.TO.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,161,13],
 static:{Qtp:function(a){var z,y,x
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -12723,14 +12906,14 @@
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
 a.Fs=new L.EN(new G.Kf(z),null)
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=y
 a.ZQ=x
 C.Xe.ZL(a)
 C.Xe.XI(a)
 return a}}},
-V31:{
+V30:{
 "^":"uL+Pi;",
 $isd3:true},
 LX:{
@@ -12746,16 +12929,16 @@
 y.S2=v
 w.u(0,"isStacked",!0)
 y.S2.bG.u(0,"connectSteps",!1)
-y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.W2(y.Yi)}if(z.Cn!=null)z.Cn=P.rT(P.ii(0,0,0,0,0,1),J.J7(z))},"$1",null,2,0,null,159,"call"],
+y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.W2(y.Yi)}if(z.Cn!=null)z.Cn=P.cH(P.ii(0,0,0,0,0,1),J.J7(z))},"$1",null,2,0,null,162,"call"],
 $isEH:true},
 CV:{
 "^":"TpZ:12;a",
-$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,140,"call"],
+$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,144,"call"],
 $isEH:true},
-QY:{
+Vq:{
 "^":"TpZ:12;a",
-$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,140,"call"],
-$isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,144,"call"],
+$isEH:true}}],["","",,Z,{
 "^":"",
 xh:{
 "^":"a;ue,GO",
@@ -12808,7 +12991,7 @@
 u=x.vM+=typeof v==="string"?v:H.d(v)
 x.vM=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":"V32;Ly,cs,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V31;Ly,cs,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gIr:function(a){return a.Ly},
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:function(a,b){a.Ly=this.ct(a,C.SR,a.Ly,b)},
@@ -12829,55 +13012,55 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.Yt.ZL(a)
 C.Yt.XI(a)
 return a}}},
-V32:{
+V31:{
 "^":"uL+Pi;",
-$isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
+$isd3:true}}],["","",,R,{
 "^":"",
 LU:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
-static:{V4:function(a){var z,y
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
+static:{rA:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.Z3.ZL(a)
 C.Z3.XI(a)
-return a}}}}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+return a}}}}],["","",,M,{
 "^":"",
 CX:{
-"^":"V33;iI,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V32;iI,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gHt:function(a){return a.iI},
 sHt:function(a,b){a.iI=this.ct(a,C.EV,a.iI,b)},
-vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.eS(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
-SK:[function(a,b){J.cI(a.iI).YM(b)},"$1","gvC",2,0,19,98],
-j9:[function(a,b){J.eg(a.iI).YM(b)},"$1","gDX",2,0,19,98],
-static:{SP:function(a){var z,y
+vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.eS(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,107,108],
+SK:[function(a,b){J.cI(a.iI).YM(b)},"$1","gvC",2,0,19,100],
+Ur:[function(a,b){J.eg(a.iI).YM(b)},"$1","gDX",2,0,19,100],
+static:{as:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.MG.ZL(a)
 C.MG.XI(a)
 return a}}},
-V33:{
+V32:{
 "^":"uL+Pi;",
-$isd3:true}}],["logging","package:logging/logging.dart",,N,{
+$isd3:true}}],["","",,N,{
 "^":"",
 TJ:{
 "^":"a;oc>,eT>,n2,Cj>,ks>,Gs",
@@ -12896,7 +13079,9 @@
 gSZ:function(){return this.tQ()},
 mL:function(a){return a.P>=this.gOR().P},
 Y6:function(a,b,c,d){var z,y,x,w,v
-if(a.P>=this.gOR().P){z=this.gB8()
+if(a.P>=this.gOR().P){if(!!J.x(b).$isEH)b=b.$0()
+if(typeof b!=="string")b=J.AG(b)
+z=this.gB8()
 y=new P.iP(Date.now(),!1)
 y.EK()
 x=$.xO
@@ -12907,7 +13092,7 @@
 Z8:function(a,b,c){return this.Y6(C.D8,a,b,c)},
 kS:function(a){return this.Z8(a,null,null)},
 dL:function(a,b,c){return this.Y6(C.t4,a,b,c)},
-Ny:function(a){return this.dL(a,null,null)},
+J4:function(a){return this.dL(a,null,null)},
 ZG:function(a,b,c){return this.Y6(C.IF,a,b,c)},
 To:function(a){return this.ZG(a,null,null)},
 wF:function(a,b,c){return this.Y6(C.nT,a,b,c)},
@@ -12917,7 +13102,7 @@
 tQ:function(){if($.RL||this.eT==null){var z=this.Gs
 if(z==null){z=P.bK(null,null,!0,N.HV)
 this.Gs=z}z.toString
-return H.VM(new P.Ik(z),[H.Oq(z,0)])}else return N.QM("").tQ()},
+return H.VM(new P.Ik(z),[H.u3(z,0)])}else return N.QM("").tQ()},
 cB:function(a){var z=this.Gs
 if(z!=null){if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)}},
@@ -12934,7 +13119,7 @@
 if(y===-1)x=z!==""?N.QM(""):null
 else{x=N.QM(C.xB.Nj(z,0,y))
 z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.TJ)
-v=new N.TJ(z,x,null,w,H.VM(new Q.A2(w),[null,null]),null)
+v=new N.TJ(z,x,null,w,H.VM(new P.A2(w),[null,null]),null)
 v.QL(z,x,w)
 return v},
 $isEH:true},
@@ -12963,39 +13148,39 @@
 static:{"^":"V7K,tmj,Enk,LkO,tY,kH8,hlK,MHK,Uu,lDu,uxc"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,fi,kc>,I4<",
-bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},"$0","gAY",0,0,71],
+bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"$0","gAY",0,0,71],
 $isHV:true,
-static:{"^":"xO"}}}],["","main.dart",,F,{
+static:{"^":"xO"}}}],["","",,F,{
 "^":"",
 E2:function(){var z,y
 N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.e447())
+N.QM("").gSZ().yI(new F.e461())
 N.QM("").To("Starting Observatory")
 N.QM("").To("Loading Google Charts API")
 z=J.UQ($.Si(),"google")
 y=$.Ib()
 z.V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
-$.Ib().MM.ml(G.vN()).ml(new F.e448())},
-e447:{
-"^":"TpZ:161;",
+$.Ib().MM.ml(G.vN()).ml(new F.e462())},
+e461:{
+"^":"TpZ:164;",
 $1:[function(a){var z
 if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
 if(J.co(z.gG1(a),"Error evaluating expression"))z=J.x5(z.gG1(a),"Can't assign to null: ")===!0||J.x5(z.gG1(a),"Expression is not assignable: ")===!0
 else z=!1}else z=!1
 if(z)return
-P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,160,"call"],
+P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,163,"call"],
 $isEH:true},
-e448:{
+e462:{
 "^":"TpZ:12;",
 $1:[function(a){var z,y,x
 N.QM("").To("Initializing Polymer")
 try{A.YK()}catch(y){x=H.Ru(y)
 z=x
 N.QM("").YX("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,13,"call"],
-$isEH:true}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
+$isEH:true}}],["","",,A,{
 "^":"",
 md:{
-"^":"V34;i4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V33;i4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 giC:function(a){return a.i4},
 siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
 static:{DCi:function(a){var z,y
@@ -13004,18 +13189,18 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.i4=!0
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.kD.ZL(a)
 C.kD.XI(a)
 return a}}},
-V34:{
+V33:{
 "^":"uL+Pi;",
 $isd3:true},
 Bm:{
-"^":"V35;KU,V4,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V34;KU,V4,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gdU:function(a){return a.V4},
@@ -13030,18 +13215,18 @@
 a.V4="---"
 a.Jo=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.IG.ZL(a)
 C.IG.XI(a)
 return a}}},
-V35:{
+V34:{
 "^":"uL+Pi;",
 $isd3:true},
 Ya:{
-"^":"V36;KU,V4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V35;KU,V4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gdU:function(a){return a.V4},
@@ -13053,18 +13238,18 @@
 a.KU="#"
 a.V4="---"
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.Nk.ZL(a)
-C.Nk.XI(a)
+C.nn.ZL(a)
+C.nn.XI(a)
 return a}}},
-V36:{
+V35:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":"V37;rU,SB,z2,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V36;rU,SB,z2,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gFR:function(a){return a.rU},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
@@ -13076,7 +13261,7 @@
 Kp:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,111,2,102,103],
+if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,113,2,104,105],
 wY6:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,17],
 static:{ZC:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -13085,32 +13270,32 @@
 a.SB=!1
 a.z2="Refresh"
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.Y6.ZL(a)
 C.Y6.XI(a)
 return a}}},
-V37:{
+V36:{
 "^":"uL+Pi;",
 $isd3:true},
 ye:{
-"^":"uL;tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"uL;tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{W1:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.pl.ZL(a)
-C.pl.XI(a)
+C.br.ZL(a)
+C.br.XI(a)
 return a}}},
 G1:{
-"^":"V38;Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V37;Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 static:{J8:function(a){var z,y
@@ -13119,23 +13304,23 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Jo=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.lx.ZL(a)
-C.lx.XI(a)
+C.OKl.ZL(a)
+C.OKl.XI(a)
 return a}}},
-V38:{
+V37:{
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":"V39;Jo,iy,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V38;Jo,iy,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 god:function(a){return a.iy},
 sod:function(a,b){a.iy=this.ct(a,C.rB,a.iy,b)},
-GU:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,19,59],
+vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,19,59],
 gu6:function(a){var z=a.iy
 if(z!=null)return J.Ds(z)
 else return""},
@@ -13146,18 +13331,18 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Jo=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.RRl.ZL(a)
 C.RRl.XI(a)
 return a}}},
-V39:{
+V38:{
 "^":"uL+Pi;",
 $isd3:true},
 UK:{
-"^":"V40;VW,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V39;VW,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gHt:function(a){return a.VW},
 sHt:function(a,b){a.VW=this.ct(a,C.EV,a.VW,b)},
 grZ:function(a){return a.Jo},
@@ -13168,18 +13353,18 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Jo=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.ct.ZL(a)
 C.ct.XI(a)
 return a}}},
-V40:{
+V39:{
 "^":"uL+Pi;",
 $isd3:true},
 wM:{
-"^":"V41;Au,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V40;Au,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gRu:function(a){return a.Au},
 sRu:function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},
 grZ:function(a){return a.Jo},
@@ -13190,18 +13375,18 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Jo=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.ic.ZL(a)
 C.ic.XI(a)
 return a}}},
-V41:{
+V40:{
 "^":"uL+Pi;",
 $isd3:true},
 NK:{
-"^":"V42;rv,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V41;rv,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gRk:function(a){return a.rv},
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
 static:{Xii:function(a){var z,y
@@ -13209,41 +13394,49 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.Mn.ZL(a)
 C.Mn.XI(a)
 return a}}},
-V42:{
+V41:{
 "^":"uL+Pi;",
 $isd3:true},
 Zx:{
-"^":"V43;rv,Wx,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V42;rv,Wx,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gRk:function(a){return a.rv},
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
 gBk:function(a){return a.Wx},
 sBk:function(a,b){a.Wx=this.ct(a,C.p8,a.Wx,b)},
-cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,162,2,102,103],
-static:{Ow:function(a){var z,y
+kf:[function(a,b){$.Kh.x3(J.aT(a.Wx))
+return J.df(J.aT(a.Wx))},"$1","gDQ",2,0,161,13],
+tb:[function(a,b){$.Kh.x3(J.aT(a.Wx))
+return J.aN(J.aT(a.Wx))},"$1","gLc",2,0,161,13],
+jA:[function(a,b){$.Kh.x3(J.aT(a.Wx))
+return J.MU(J.aT(a.Wx))},"$1","gqF",2,0,161,13],
+Cx:[function(a,b){$.Kh.x3(J.aT(a.Wx))
+return J.Fy(J.aT(a.Wx))},"$1","gVX",2,0,161,13],
+cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,165,2,104,105],
+static:{yno:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.L8.ZL(a)
 C.L8.XI(a)
 return a}}},
-V43:{
+V42:{
 "^":"uL+Pi;",
-$isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
+$isd3:true}}],["","",,V,{
 "^":"",
 F1:{
-"^":"V44;qC,i6=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V43;qC,i6=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gzj:function(a){return a.qC},
 szj:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
 Es:function(a){var z,y,x
@@ -13253,29 +13446,29 @@
 a.i6=z}else{z=H.VM([],[G.OS])
 y=Q.ch(null,D.Mk)
 x=new G.nD(new G.ut("targetManager"),Q.ch(null,null),null,null,null,null)
-x.XA()
+x.Ff()
 y=new G.mL(z,null,new G.ng("/vm",null,null,null,null,null),null,x,null,a,null,y,null,null)
 y.Ty(a)
 a.i6=y}},
-static:{fv:function(a){var z,y
+static:{Lu:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.qC=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.YpE.ZL(a)
 C.YpE.XI(a)
 return a}}},
-V44:{
+V43:{
 "^":"uL+Pi;",
-$isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
+$isd3:true}}],["","",,Z,{
 "^":"",
 uL:{
-"^":"Xfs;tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"Xfs;tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gi6:function(a){return $.Kh},
 gKw:function(a){return J.pP(this.gi6(a).Ef)},
 Es:function(a){A.zs.prototype.Es.call(this,a)
@@ -13293,7 +13486,7 @@
 if(a.tB==null)return
 z=a.kR
 if(z!=null)z.ed()
-a.kR=P.rT(a.tB,this.gwZ(a))},
+a.kR=P.cH(a.tB,this.gwZ(a))},
 Q4:function(a){var z=a.kR
 if(z!=null)z.ed()
 a.kR=null},
@@ -13301,31 +13494,31 @@
 this.yY(a)
 z=a.tB
 if(z==null){this.Q4(a)
-return}a.kR=P.rT(z,this.gwZ(a))},"$0","gwZ",0,0,17],
-cD:[function(a,b,c,d){this.gi6(a).Z6.WV(b,c,d)},"$3","gRh",6,0,162,143,102,103],
-If:[function(a,b){this.gi6(a).Z6
-return"#"+H.d(b)},"$1","gn0",2,0,163,164],
-a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,165,166],
+return}a.kR=P.cH(z,this.gwZ(a))},"$0","gwZ",0,0,17],
+jN:[function(a,b,c,d){this.gi6(a).Z6.Cz(b,c,d)},"$3","gRh",6,0,165,85,104,105],
+Gxe:[function(a,b){this.gi6(a).Z6
+return"#"+H.d(b)},"$1","gn0",2,0,166,167],
+a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,168,169],
 Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,14,15],
-B3:[function(a,b){return H.BU(b,null,null)},"$1","gXr",2,0,133,20],
-uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,167,168],
-MI:[function(a,b){return J.xC(b,"Error")},"$1","gc9",2,0,167,168],
+Kq:[function(a,b){return H.BU(b,null,null)},"$1","gXr",2,0,136,20],
+z4:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,170,171],
+MI:[function(a,b){return J.xC(b,"Error")},"$1","gc9",2,0,170,171],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,167,168],
-RU:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,167,168],
-KJa:[function(a,b){return J.xC(b,"String")},"$1","gO0",2,0,167,168],
-wm:[function(a,b){return J.xC(b,"Instance")},"$1","gnD",2,0,167,168],
-JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,167,168],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,170,171],
+RU:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,170,171],
+ff:[function(a,b){return J.xC(b,"String")},"$1","gO0",2,0,170,171],
+wm:[function(a,b){return J.xC(b,"Instance")},"$1","gnD",2,0,170,171],
+JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,170,171],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,167,168],
-tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,167,168],
-Dz:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,167,168],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,170,171],
+tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,170,171],
+Dz:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,170,171],
 static:{EE:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -13334,12 +13527,12 @@
 return a}}},
 Xfs:{
 "^":"xc+Pi;",
-$isd3:true}}],["observe.src.bindable","package:observe/src/bindable.dart",,A,{
+$isd3:true}}],["","",,A,{
 "^":"",
 OC:{
 "^":"a;",
 sP:function(a,b){},
-$isOC:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+$isOC:true}}],["","",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -13347,9 +13540,9 @@
 if(z==null){z=this.gqw(a)
 z=P.bK(this.gym(a),z,!0,null)
 a.AP=z}z.toString
-return H.VM(new P.Ik(z),[H.Oq(z,0)])},
-k0:[function(a){},"$0","gqw",0,0,17],
-Yd:[function(a){a.AP=null},"$0","gym",0,0,17],
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
+Tr:[function(a){},"$0","gqw",0,0,17],
+NB:[function(a){a.AP=null},"$0","gym",0,0,17],
 HC:[function(a){var z,y,x
 z=a.fn
 a.fn=null
@@ -13357,7 +13550,7 @@
 x=H.VM(new P.Yp(z),[T.yj])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,120],
+return!0}return!1},"$0","gDx",0,0,123],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
@@ -13367,7 +13560,7 @@
 nq:function(a,b){if(!this.gnz(a))return
 if(a.fn==null){a.fn=[]
 P.rb(this.gDx(a))}a.fn.push(b)},
-$isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
+$isd3:true}}],["","",,T,{
 "^":"",
 yj:{
 "^":"a;",
@@ -13375,7 +13568,7 @@
 qI:{
 "^":"yj;WA>,oc>,jL,zZ",
 bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gAY",0,0,71],
-$isqI:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
+$isqI:true}}],["","",,O,{
 "^":"",
 N0:function(){var z,y,x,w,v,u,t,s,r,q
 if($.Td)return
@@ -13395,7 +13588,7 @@
 v=!0}$.Oo.push(t)}}}while(z<1000&&v)
 if(w&&v){w=$.S5()
 w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(s=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]);s.G();){r=s.lo
+for(s=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);s.G();){r=s.lo
 q=J.U6(r)
 w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.ax=$.Oo.length
 $.Td=!1},
@@ -13404,7 +13597,7 @@
 z=new O.YC(z)
 return new P.yQ(null,null,null,null,new O.zI(z),new O.hw(z),null,null,null,null,null,null)},
 YC:{
-"^":"TpZ:169;a",
+"^":"TpZ:172;a",
 $2:function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
@@ -13426,7 +13619,7 @@
 return this.f.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 hw:{
-"^":"TpZ:170;UI",
+"^":"TpZ:173;UI",
 $4:[function(a,b,c,d){if(d==null)return d
 return new O.iu(this.UI,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
 $isEH:true},
@@ -13434,7 +13627,7 @@
 "^":"TpZ:12;bK,Gq,Rm,w3",
 $1:[function(a){this.bK.$2(this.Gq,this.Rm)
 return this.w3.$1(a)},"$1",null,2,0,null,67,"call"],
-$isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
+$isEH:true}}],["","",,G,{
 "^":"",
 B5:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=f-e+1
@@ -13577,7 +13770,7 @@
 z=J.RE(b)
 y=z.gWA(b)
 z=z.gvH(b)
-x=J.qA(b.gem())
+x=J.Nd(b.gem())
 w=b.gNg()
 if(w==null)w=0
 v=new P.Yp(x)
@@ -13605,7 +13798,7 @@
 z=z.Mu(z,0,J.Hn(q.Ft,u.Ft))
 o.toString
 if(typeof o!=="object"||o===null||!!o.fixed$length)H.vh(P.f("insertAll"))
-H.IC(o,0,z)}if(J.z8(J.ew(u.Ft,u.VD.G4.length),J.ew(q.Ft,q.Ld))){z=u.VD
+H.IC(o,0,z)}if(J.xZ(J.ew(u.Ft,u.VD.G4.length),J.ew(q.Ft,q.Ld))){z=u.VD
 J.bj(o,z.Mu(z,J.Hn(J.ew(q.Ft,q.Ld),u.Ft),u.VD.G4.length))}u.em=o
 u.VD=q.VD
 if(J.u6(q.Ft,u.Ft))u.Ft=q.Ft
@@ -13617,12 +13810,12 @@
 t=!0}else t=!1}if(!t)a.push(u)},
 hs:function(a,b){var z,y
 z=H.VM([],[G.DA])
-for(y=H.VM(new H.a7(b,b.length,0,null),[H.Oq(b,0)]);y.G();)G.m1(z,y.lo)
+for(y=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);y.G();)G.m1(z,y.lo)
 return z},
 Qi:function(a,b){var z,y,x,w,v,u
 if(b.length<=1)return b
 z=[]
-for(y=G.hs(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]),x=a.ao;y.G();){w=y.lo
+for(y=G.hs(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=a.XH;y.G();){w=y.lo
 if(J.xC(w.gNg(),1)&&w.gRt().G4.length===1){v=w.gRt().G4
 if(0>=v.length)return H.e(v,0)
 v=v[0]
@@ -13653,12 +13846,12 @@
 if(c==null)c=0
 z=new P.Yp(d)
 z.$builtinTypeInfo=[null]
-return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
+return new G.DA(a,z,d,b,c)}}}}],["","",,K,{
 "^":"",
 nd:{
 "^":"a;"},
 vly:{
-"^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
+"^":"a;"}}],["","",,F,{
 "^":"",
 kM:[function(){return O.N0()},"$0","Jy",0,0,17],
 Wi:function(a,b,c,d){var z=J.RE(a)
@@ -13670,7 +13863,7 @@
 if(this.gR9(a)==null){z=this.gFW(a)
 this.sR9(a,P.bK(this.gkk(a),z,!0,null))}z=this.gR9(a)
 z.toString
-return H.VM(new P.Ik(z),[H.Oq(z,0)])},
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
 gnz:function(a){var z,y
 if(this.gR9(a)!=null){z=this.gR9(a)
 y=z.iE
@@ -13682,11 +13875,11 @@
 $.Oo=z}z.push(a)
 $.ax=$.ax+1
 y=P.L5(null,null,null,P.IN,P.a)
-for(z=this.gbx(a),z=$.mX().Me(0,z,new A.Wq(!0,!1,!0,C.AP,!1,!1,C.Cd,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){x=J.O6(z.lo)
+for(z=this.gbx(a),z=$.mX().Me(0,z,new A.Wq(!0,!1,!0,C.AP,!1,!1,C.Cd,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=J.O6(z.lo)
 w=$.cp().eA.t(0,x)
 if(w==null)H.vh(O.lA("getter \""+H.d(x)+"\" in "+this.bu(a)))
 y.u(0,x,w.$1(a))}this.sV2(a,y)},"$0","gFW",0,0,17],
-L5:[function(a){if(this.gV2(a)!=null)this.sV2(a,null)},"$0","gkk",0,0,17],
+B0:[function(a){if(this.gV2(a)!=null)this.sV2(a,null)},"$0","gkk",0,0,17],
 HC:function(a){var z,y
 z={}
 if(this.gV2(a)==null||!this.gnz(a))return!1
@@ -13715,23 +13908,23 @@
 x=v}else x=w
 x.push(H.VM(new T.qI(z,a,b,y),[null]))
 J.iy(z).u(0,a,y)}},
-$isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
+$isEH:true}}],["","",,A,{
 "^":"",
 xhq:{
 "^":"Pi;",
 gP:function(a){return this.ra},
 sP:function(a,b){this.ra=F.Wi(this,C.ls,this.ra,b)},
-bu:[function(a){return"#<"+H.d(new H.cu(H.wO(this),null))+" value: "+H.d(this.ra)+">"},"$0","gAY",0,0,71]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
+bu:[function(a){return"#<"+H.d(new H.cu(H.wO(this),null))+" value: "+H.d(this.ra)+">"},"$0","gAY",0,0,71]}}],["","",,Q,{
 "^":"",
 wn:{
-"^":"er;b3@,iT,ao,AP,fn",
-gQV:function(){var z=this.iT
+"^":"er;SE@,vZ,XH,AP,fn",
+gQV:function(){var z=this.vZ
 if(z==null){z=P.bK(new Q.xb(this),null,!0,null)
-this.iT=z}z.toString
-return H.VM(new P.Ik(z),[H.Oq(z,0)])},
-gB:function(a){return this.ao.length},
+this.vZ=z}z.toString
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
+gB:function(a){return this.XH.length},
 sB:function(a,b){var z,y,x,w,v
-z=this.ao
+z=this.XH
 y=z.length
 if(y===b)return
 this.ct(this,C.Wn,y,b)
@@ -13739,7 +13932,7 @@
 w=b===0
 this.ct(this,C.ai,x,w)
 this.ct(this,C.nZ,!x,!w)
-x=this.iT
+x=this.vZ
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x)if(b<y){if(b<0||b>z.length)H.vh(P.TE(b,0,z.length))
@@ -13752,24 +13945,24 @@
 x=x.br(0)
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,x,b,0))}else{v=[]
+this.tk(new G.DA(this,w,x,b,0))}else{v=[]
 x=new P.Yp(v)
 x.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,x,v,y,b-y))}C.Nm.sB(z,b)},
-t:function(a,b){var z=this.ao
+this.tk(new G.DA(this,x,v,y,b-y))}C.Nm.sB(z,b)},
+t:function(a,b){var z=this.XH
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 u:function(a,b,c){var z,y,x,w
-z=this.ao
+z=this.XH
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 y=z[b]
-x=this.iT
+x=this.vZ
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x){x=[y]
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
+this.tk(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
 z[b]=c},
 gl0:function(a){return P.lD.prototype.gl0.call(this,this)},
 gor:function(a){return P.lD.prototype.gor.call(this,this)},
@@ -13777,41 +13970,41 @@
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.iT
+z=this.vZ
 if(z!=null){x=z.iE
 z=x==null?z!=null:x!==z}else z=!1
-if(z&&y>0){z=this.ao
+if(z&&y>0){z=this.XH
 H.xF(z,b,y)
-this.iH(G.K6(this,b,y,H.c1(z,b,y,null).br(0)))}H.h8(this.ao,b,c)},
+this.tk(G.K6(this,b,y,H.c1(z,b,y,null).br(0)))}H.h8(this.XH,b,c)},
 h:function(a,b){var z,y,x,w
-z=this.ao
+z=this.XH
 y=z.length
-this.On(y,y+1)
-x=this.iT
+this.Dr(y,y+1)
+x=this.vZ
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
-if(x)this.iH(G.K6(this,y,1,null))
+if(x)this.tk(G.K6(this,y,1,null))
 C.Nm.h(z,b)},
 FV:function(a,b){var z,y,x,w
-z=this.ao
+z=this.XH
 y=z.length
 C.Nm.FV(z,b)
-this.On(y,z.length)
+this.Dr(y,z.length)
 x=z.length-y
-z=this.iT
+z=this.vZ
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&x>0)this.iH(G.K6(this,y,x,null))},
+if(z&&x>0)this.tk(G.K6(this,y,x,null))},
 Rz:function(a,b){var z,y
-for(z=this.ao,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.UZ(0,y,y+1)
+for(z=this.XH,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.UZ(0,y,y+1)
 return!0}return!1},
 UZ:function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
-if(!z||b>this.ao.length)H.vh(P.TE(b,0,this.gB(this)))
+if(!z||b>this.XH.length)H.vh(P.TE(b,0,this.gB(this)))
 y=c>=b
-if(!y||c>this.ao.length)H.vh(P.TE(c,b,this.gB(this)))
+if(!y||c>this.XH.length)H.vh(P.TE(c,b,this.gB(this)))
 x=c-b
-w=this.ao
+w=this.XH
 v=w.length
 u=v-x
 this.ct(this,C.Wn,v,u)
@@ -13819,7 +14012,7 @@
 u=u===0
 this.ct(this,C.ai,t,u)
 this.ct(this,C.nZ,!t,!u)
-u=this.iT
+u=this.vZ
 if(u!=null){t=u.iE
 u=t==null?u!=null:t!==u}else u=!1
 if(u&&x>0){if(!z||b>w.length)H.vh(P.TE(b,0,w.length))
@@ -13832,64 +14025,64 @@
 z=z.br(0)
 y=new P.Yp(z)
 y.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
+this.tk(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
 oF:function(a,b,c){var z,y,x,w
-if(b<0||b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
+if(b<0||b>this.XH.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.ao
+z=this.XH
 x=z.length
 C.Nm.sB(z,x+y)
 w=z.length
 H.qG(z,b+y,w,this,b)
 H.h8(z,b,c)
-this.On(x,z.length)
-z=this.iT
+this.Dr(x,z.length)
+z=this.vZ
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&y>0)this.iH(G.K6(this,b,y,null))},
+if(z&&y>0)this.tk(G.K6(this,b,y,null))},
 xe:function(a,b,c){var z,y,x
-if(b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.ao
+if(b>this.XH.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.XH
 y=z.length
 if(b===y){this.h(0,c)
 return}C.Nm.sB(z,y+1)
 y=z.length
 H.qG(z,b+1,y,this,b)
 y=z.length
-this.On(y-1,y)
-y=this.iT
+this.Dr(y-1,y)
+y=this.vZ
 if(y!=null){x=y.iE
 y=x==null?y!=null:x!==y}else y=!1
-if(y)this.iH(G.K6(this,b,1,null))
+if(y)this.tk(G.K6(this,b,1,null))
 if(b>=z.length)return H.e(z,b)
 z[b]=c},
-iH:function(a){var z,y
-z=this.iT
+tk:function(a){var z,y
+z=this.vZ
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
-if(this.b3==null){this.b3=[]
-P.rb(this.gL6())}this.b3.push(a)},
-On:function(a,b){var z,y
+if(this.SE==null){this.SE=[]
+P.rb(this.gL6())}this.SE.push(a)},
+Dr:function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
 y=b===0
 this.ct(this,C.ai,z,y)
 this.ct(this,C.nZ,!z,!y)},
 Ju:[function(){var z,y,x
-z=this.b3
+z=this.SE
 if(z==null)return!1
 y=G.Qi(this,z)
-this.b3=null
-z=this.iT
+this.SE=null
+z=this.vZ
 if(z!=null){x=z.iE
 x=x==null?z!=null:x!==z}else x=!1
 if(x&&y.length!==0){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,120],
+return!0}return!1},"$0","gL6",0,0,123],
 $iswn:true,
 static:{ch:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])},Y5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -13927,8 +14120,8 @@
 $isd3:true},
 xb:{
 "^":"TpZ:74;a",
-$0:function(){this.a.iT=null},
-$isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
+$0:function(){this.a.vZ=null},
+$isEH:true}}],["","",,V,{
 "^":"",
 ya:{
 "^":"yj;G3>,jL,zZ,aC,w5",
@@ -14000,37 +14193,37 @@
 "^":"TpZ;a",
 $2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,77,20,"call"],
 $isEH:true,
-$signature:function(){return H.IGs(function(a,b){return{func:"lb",args:[a,b]}},this.a,"qC")}},
+$signature:function(){return H.IGs(function(a,b){return{func:"VfV",args:[a,b]}},this.a,"qC")}},
 Lo:{
 "^":"TpZ:79;a",
 $2:function(a,b){var z=this.a
 z.nq(z,H.VM(new V.ya(a,b,null,!1,!0),[null,null]))},
-$isEH:true}}],["observe.src.observer_transform","package:observe/src/observer_transform.dart",,Y,{
+$isEH:true}}],["","",,Y,{
 "^":"",
 Qw:{
-"^":"OC;BS,Or,HM,cS,h5",
-Jy:function(a){return this.Or.$1(a)},
-Kv:function(a){return this.cS.$1(a)},
+"^":"OC;Tw,Hc,pJ,nn,ic",
+HF:function(a){return this.Hc.$1(a)},
+Yc:function(a){return this.nn.$1(a)},
 TR:function(a,b){var z
-this.cS=b
-z=this.Jy(J.mu(this.BS,this.gjr()))
-this.h5=z
+this.nn=b
+z=this.HF(J.mu(this.Tw,this.gRV()))
+this.ic=z
 return z},
-EJ:[function(a){var z=this.Jy(a)
-if(J.xC(z,this.h5))return
-this.h5=z
-return this.Kv(z)},"$1","gjr",2,0,12,60],
-xO:function(a){var z=this.BS
+ab:[function(a){var z=this.HF(a)
+if(J.xC(z,this.ic))return
+this.ic=z
+return this.Yc(z)},"$1","gRV",2,0,12,60],
+xO:function(a){var z=this.Tw
 if(z!=null)J.yd(z)
-this.BS=null
-this.Or=null
-this.HM=null
-this.cS=null
-this.h5=null},
-gP:function(a){var z=this.Jy(J.Vm(this.BS))
-this.h5=z
+this.Tw=null
+this.Hc=null
+this.pJ=null
+this.nn=null
+this.ic=null},
+gP:function(a){var z=this.HF(J.Vm(this.Tw))
+this.ic=z
 return z},
-sP:function(a,b){J.ta(this.BS,b)}}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
+sP:function(a,b){J.ta(this.Tw,b)}}}],["","",,L,{
 "^":"",
 Hj:function(a,b){var z,y,x,w,v
 if(a==null)return
@@ -14048,7 +14241,7 @@
 z=x.$1(z)
 return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.Lm(a)
 v=$.mX().F1(z,C.OV)
-if(!(v!=null&&v.fY===C.hU&&!v.Fo))throw w}else throw w}}z=$.Nd()
+if(!(v!=null&&v.fY===C.hU&&!v.Fo))throw w}else throw w}}z=$.YLt()
 if(z.mL(C.D8))z.kS("can't get "+H.d(b)+" in "+H.d(a))
 return},
 EX:function(a,b,c){var z,y,x
@@ -14063,7 +14256,7 @@
 if(z){J.kW(a,$.Mg().ep.t(0,b),c)
 return!0}try{$.cp().Cq(a,b,c)
 return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.Lm(a)
-if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.Nd()
+if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.YLt()
 if(z.mL(C.D8))z.kS("can't set "+H.d(b)+" in "+H.d(a))
 return!1},
 cB:function(a){a=J.rr(a)
@@ -14072,13 +14265,13 @@
 if(a[0]===".")return!1
 return $.B8().zD(a)},
 WR:{
-"^":"AR;HS,XF,xE,cX,GX,vA,Wf",
+"^":"lg;HS,XF,xE,cX,GX,D2,Wf",
 gqc:function(){return this.HS==null},
 sP:function(a,b){var z=this.HS
 if(z!=null)z.rL(this.XF,b)
 this.hQ(!0)},
 gIn:function(){return 2},
-TR:function(a,b){return L.AR.prototype.TR.call(this,this,b)},
+TR:function(a,b){return L.lg.prototype.TR.call(this,this,b)},
 NJ:function(a){this.xE=L.SE(this,this.XF)
 this.hQ(!0)},
 kH:function(){this.Wf=null
@@ -14094,7 +14287,7 @@
 return!0},
 tF:function(){return this.hQ(!1)},
 $isOC:true},
-Tv:{
+Zl:{
 "^":"a;OK",
 gB:function(a){return this.OK.length},
 gl0:function(a){return this.OK.length===0},
@@ -14104,7 +14297,7 @@
 n:function(a,b){var z,y,x,w,v
 if(b==null)return!1
 if(this===b)return!0
-if(!J.x(b).$isTv)return!1
+if(!J.x(b).$isZl)return!1
 if(this.gPu()!==b.gPu())return!1
 z=this.OK
 y=z.length
@@ -14125,7 +14318,7 @@
 return 536870911&x+((16383&x)<<15>>>0)},
 Tl:function(a){var z,y
 if(!this.gPu())return
-for(z=this.OK,z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){y=z.lo
+for(z=this.OK,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 if(a==null)return
 a=L.Hj(a,y)}return a},
 rL:function(a,b){var z,y,x
@@ -14145,28 +14338,28 @@
 w=x+1
 if(x>=z.length)return H.e(z,x)
 a=L.Hj(a,z[x])}},
-$isTv:true,
+$isZl:true,
 static:{hk:function(a){var z,y,x,w,v,u,t,s
 if(!!J.x(a).$isWO){z=P.F(a,!1,null)
 y=new H.a7(z,z.length,0,null)
-y.$builtinTypeInfo=[H.Oq(z,0)]
+y.$builtinTypeInfo=[H.u3(z,0)]
 for(;y.G();){x=y.lo
-if((typeof x!=="number"||Math.floor(x)!==x)&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints and Symbols"))}return new L.Tv(z)}if(a==null)a=""
+if((typeof x!=="number"||Math.floor(x)!==x)&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints and Symbols"))}return new L.Zl(z)}if(a==null)a=""
 w=$.hW().t(0,a)
 if(w!=null)return w
 if(!L.cB(a))return $.Js()
 v=[]
 y=J.rr(a).split(".")
 u=new H.a7(y,y.length,0,null)
-u.$builtinTypeInfo=[H.Oq(y,0)]
+u.$builtinTypeInfo=[H.u3(y,0)]
 for(;u.G();){x=u.lo
 if(J.xC(x,""))continue
 t=H.BU(x,10,new L.oq())
-v.push(t!=null?t:$.Mg().Nz.t(0,x))}w=new L.Tv(C.Nm.tt(v,!1))
+v.push(t!=null?t:$.Mg().Nz.t(0,x))}w=new L.Zl(C.Nm.tt(v,!1))
 y=$.hW()
 if(y.X5>=100){y.toString
 u=new P.i5(y)
-u.$builtinTypeInfo=[H.Oq(y,0)]
+u.$builtinTypeInfo=[H.u3(y,0)]
 s=u.gA(u)
 if(!s.G())H.vh(H.DU())
 y.Rz(0,s.gl())}y.u(0,a,w)
@@ -14177,10 +14370,10 @@
 $isEH:true},
 f7:{
 "^":"TpZ:12;",
-$1:[function(a){return!!J.x(a).$isIN?$.Mg().ep.t(0,a):a},"$1",null,2,0,null,154,"call"],
+$1:[function(a){return!!J.x(a).$isIN?$.Mg().ep.t(0,a):a},"$1",null,2,0,null,157,"call"],
 $isEH:true},
 TV:{
-"^":"Tv;OK",
+"^":"Zl;OK",
 gPu:function(){return!1},
 static:{"^":"qa"}},
 DOe:{
@@ -14188,14 +14381,14 @@
 $0:function(){return new H.VR("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},
 $isEH:true},
 ww:{
-"^":"AR;xE,TV,cX,GX,vA,Wf",
-gqc:function(){return this.TV==null},
+"^":"lg;xE,VZ,cX,GX,D2,Wf",
+gqc:function(){return this.VZ==null},
 gIn:function(){return 3},
-TR:function(a,b){return L.AR.prototype.TR.call(this,this,b)},
+TR:function(a,b){return L.lg.prototype.TR.call(this,this,b)},
 NJ:function(a){var z,y,x,w
 this.hQ(!0)
-for(z=this.TV,y=z.length,x=0;x<y;x+=2){w=z[x]
-if(w!==C.dV){z=$.xG
+for(z=this.VZ,y=z.length,x=0;x<y;x+=2){w=z[x]
+if(w!==C.aZ){z=$.xG
 if(z!=null){y=z.kTd
 y=y==null?w!=null:y!==w}else y=!0
 if(y){z=new L.zG(w,P.GV(null,null,null,null),null,null,!1)
@@ -14205,40 +14398,40 @@
 break}}},
 kH:function(){var z,y,x,w
 this.Wf=null
-for(z=0;y=this.TV,x=y.length,z<x;z+=2)if(y[z]===C.dV){w=z+1
+for(z=0;y=this.VZ,x=y.length,z<x;z+=2)if(y[z]===C.aZ){w=z+1
 if(w>=x)return H.e(y,w)
-J.yd(y[w])}this.TV=null},
+J.yd(y[w])}this.VZ=null},
 yN:function(a,b){var z
-if(this.GX!=null||this.TV==null)throw H.b(P.w("Cannot add paths once started."))
-if(!J.x(b).$isTv)b=L.hk(b)
-z=this.TV
+if(this.GX!=null||this.VZ==null)throw H.b(P.w("Cannot add paths once started."))
+if(!J.x(b).$isZl)b=L.hk(b)
+z=this.VZ
 z.push(a)
 z.push(b)},
-U2:function(a){return this.yN(a,null)},
+ti:function(a){return this.yN(a,null)},
 Qs:function(a){var z
-if(this.GX!=null||this.TV==null)throw H.b(P.w("Cannot add observers once started."))
+if(this.GX!=null||this.VZ==null)throw H.b(P.w("Cannot add observers once started."))
 J.mu(a,new L.Zu(this))
-z=this.TV
-z.push(C.dV)
+z=this.VZ
+z.push(C.aZ)
 z.push(a)},
 nf:function(a){var z,y,x,w,v
-for(z=0;y=this.TV,x=y.length,z<x;z+=2){w=y[z]
-if(w!==C.dV){v=z+1
+for(z=0;y=this.VZ,x=y.length,z<x;z+=2){w=y[z]
+if(w!==C.aZ){v=z+1
 if(v>=x)return H.e(y,v)
-H.Go(y[v],"$isTv").VV(w,a)}}},
+H.Go(y[v],"$isZl").VV(w,a)}}},
 hQ:function(a){var z,y,x,w,v,u,t,s,r
-J.wg(this.Wf,C.jn.cU(this.TV.length,2))
-for(z=!1,y=null,x=0;w=this.TV,v=w.length,x<v;x+=2){u=x+1
+J.wg(this.Wf,C.jn.cU(this.VZ.length,2))
+for(z=!1,y=null,x=0;w=this.VZ,v=w.length,x<v;x+=2){u=x+1
 if(u>=v)return H.e(w,u)
 t=w[u]
 s=w[x]
-if(s===C.dV){H.Go(t,"$isOC")
-r=t.gP(t)}else r=H.Go(t,"$isTv").Tl(s)
+if(s===C.aZ){H.Go(t,"$isOC")
+r=t.gP(t)}else r=H.Go(t,"$isZl").Tl(s)
 if(a){J.kW(this.Wf,C.jn.cU(x,2),r)
 continue}w=this.Wf
 v=C.jn.cU(x,2)
 if(J.xC(r,J.UQ(w,v)))continue
-w=this.vA
+w=this.D2
 if(typeof w!=="number")return w.F()
 if(w>=2){if(y==null)y=P.L5(null,null,null,null,null)
 y.u(0,v,J.UQ(this.Wf,v))}J.kW(this.Wf,v,r)
@@ -14254,17 +14447,17 @@
 $isEH:true},
 iNc:{
 "^":"a;"},
-AR:{
+lg:{
 "^":"OC;cX<",
-CC:function(){return this.GX.$0()},
+c8:function(){return this.GX.$0()},
 K0:function(a){return this.GX.$1(a)},
-cF:function(a,b){return this.GX.$2(a,b)},
-Mm:function(a,b,c){return this.GX.$3(a,b,c)},
+rF:function(a,b){return this.GX.$2(a,b)},
+uC:function(a,b,c){return this.GX.$3(a,b,c)},
 ga8:function(){return this.GX!=null},
 TR:function(a,b){if(this.GX!=null||this.gqc())throw H.b(P.w("Observer has already been opened."))
-if(X.fy(b)>this.gIn())throw H.b(P.u("callback should take "+this.gIn()+" or fewer arguments"))
+if(X.Cz(b)>this.gIn())throw H.b(P.u("callback should take "+this.gIn()+" or fewer arguments"))
 this.GX=b
-this.vA=P.J(this.gIn(),X.RI(b))
+this.D2=P.J(this.gIn(),X.RI(b))
 this.NJ(0)
 return this.Wf},
 gP:function(a){this.hQ(!0)
@@ -14276,13 +14469,13 @@
 SG:function(){var z=0
 while(!0){if(!(z<1000&&this.tF()))break;++z}return z>0},
 Aw:function(a,b,c){var z,y,x,w
-try{switch(this.vA){case 0:this.CC()
+try{switch(this.D2){case 0:this.c8()
 break
 case 1:this.K0(a)
 break
-case 2:this.cF(a,b)
+case 2:this.rF(a,b)
 break
-case 3:this.Mm(a,b,c)
+case 3:this.uC(a,b,c)
 break}}catch(x){w=H.Ru(x)
 z=w
 y=new H.oP(x,null)
@@ -14294,7 +14487,7 @@
 b.nf(this.gTT(this))},
 dt:[function(a,b){var z=J.x(b)
 if(!!z.$iswn)this.wq(b.gQV())
-if(!!z.$isd3)this.wq(z.gqh(b))},"$1","gTT",2,0,171,92],
+if(!!z.$isd3)this.wq(z.gqh(b))},"$1","gTT",2,0,174,94],
 wq:function(a){var z,y
 if(this.rS==null)this.rS=P.YM(null,null,null,null,null)
 z=this.HN
@@ -14307,37 +14500,37 @@
 if(z==null)z=P.YM(null,null,null,null,null)
 this.HN=this.rS
 this.rS=z
-for(y=this.JD,y=H.VM(new P.ro(y),[H.Oq(y,0),H.Oq(y,1)]),x=y.Fb,w=H.Oq(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.oz]),x.qT,x.bb,null),[H.Oq(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
-if(v.ga8())v.nf(this.gTT(this))}for(y=this.HN,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Oq(y,0),H.Oq(y,1)]);y.G();)y.lo.ed()
+for(y=this.JD,y=H.VM(new P.ro(y),[H.u3(y,0),H.u3(y,1)]),x=y.Fb,w=H.u3(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.oz]),x.qT,x.bb,null),[H.u3(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
+if(v.ga8())v.nf(this.gTT(this))}for(y=this.HN,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.u3(y,0),H.u3(y,1)]);y.G();)y.lo.ed()
 this.HN=null},"$0","gTh",0,0,17],
 F5:[function(a){var z,y
-for(z=this.JD,z=H.VM(new P.ro(z),[H.Oq(z,0),H.Oq(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){y=z.lo
+for(z=this.JD,z=H.VM(new P.ro(z),[H.u3(z,0),H.u3(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 if(y.ga8())y.tF()}this.op=!0
-P.rb(this.gTh(this))},"$1","gCP",2,0,19,172],
+P.rb(this.gTh(this))},"$1","gCP",2,0,19,175],
 static:{"^":"xG",SE:function(a,b){var z,y
 z=$.xG
 if(z!=null){y=z.kTd
 y=y==null?b!=null:y!==b}else y=!0
 if(y){z=new L.zG(b,P.GV(null,null,null,null),null,null,!1)
 $.xG=z}z.JD.u(0,a.cX,a)
-a.nf(z.gTT(z))}}}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
+a.nf(z.gTT(z))}}}}],["","",,R,{
 "^":"",
 tB:[function(a){var z,y,x
 z=J.x(a)
 if(!!z.$isd3)return a
 if(!!z.$isZ0){y=V.AB(a,null,null)
-z.aN(a,new R.yx(y))
+z.aN(a,new R.Qe(y))
 return y}if(!!z.$isQV){z=z.ez(a,R.Ft())
 x=Q.ch(null,null)
 x.FV(0,z)
 return x}return a},"$1","Ft",2,0,12,20],
-yx:{
+Qe:{
 "^":"TpZ:79;a",
-$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,130,66,"call"],
-$isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
+$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,133,66,"call"],
+$isEH:true}}],["","",,A,{
 "^":"",
-YG:function(a,b,c){if(a==null||$.AM()==null)return
-$.AM().V7("shimStyling",[a,b,c])},
+Eo:function(a,b,c){if(a==null||$.lx()==null)return
+$.lx().V7("shimStyling",[a,b,c])},
 q3:function(a){var z,y,x,w,v
 if(a==null)return""
 if($.UG)return""
@@ -14351,7 +14544,7 @@
 return w}catch(v){w=H.Ru(v)
 if(!!J.x(w).$isBK){y=w
 x=new H.oP(v,null)
-$.QJ().Ny("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
+$.QJ().J4("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
 return""}else throw v}},
 M8:[function(a){var z,y
 z=$.Mg().ep.t(0,a)
@@ -14372,7 +14565,7 @@
 if(b===document.head){w=W.vD(document.head.querySelectorAll("style[element]"),null)
 if(w.gor(w))x=J.QP(C.t5.grZ(w.Sn))}b.insertBefore(z,x)},
 YK:function(){if($.UG){A.X1($.M6,!0)
-return $.X3}var z=$.X3.qp(O.Ht())
+return $.X3}var z=$.X3.iT(O.Ht())
 z.Gr(new A.mS())
 return z},
 X1:function(a,b){var z,y
@@ -14386,7 +14579,7 @@
 z.setAttribute("name","auto-binding-dart")
 z.setAttribute("extends","template")
 J.UQ($.XX(),"init").qP([],z)
-for(y=H.VM(new H.a7(a,78,0,null),[H.Oq(a,0)]);y.G();)y.lo.$0()},
+for(y=H.VM(new H.a7(a,79,0,null),[H.u3(a,0)]);y.G();)y.lo.$0()},
 JP:function(){var z,y,x,w
 z=$.Si()
 if(J.UQ(z,"Platform")==null)throw H.b(P.w("platform.js, dart_support.js must be loaded at the top of your application, before any other scripts or HTML imports that use polymer. Putting these two script tags at the top of your <head> element should address this issue: <script src=\"packages/web_components/platform.js\"></script> and  <script src=\"packages/web_components/dart_support.js\"></script>."))
@@ -14398,10 +14591,10 @@
 if(w==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
 J.kW($.XX(),"register",P.mt(new A.k2(x,w)))},
 XP:{
-"^":"a;FL>,t5>,Xj<,oc>,Q7<,NF<,cK>,kK<,Bj<,Qk,q5,Uj>,PS<,Ve,t4",
+"^":"a;FL>,t5>,Xj<,oc>,Q7<,NF<,cK>,kK<,Bj<,Qk,q5,Uj>,PS<,kX,t4",
 gZf:function(){var z,y
 z=J.Eh(this.FL,"template")
-if(z!=null)y=J.NQ(!!J.x(z).$isvy?z:M.SB(z))
+if(z!=null)y=J.Xu(!!J.x(z).$isvy?z:M.SB(z))
 else y=null
 return y},
 Ba:function(a){var z,y,x
@@ -14421,7 +14614,7 @@
 this.Bj=y}}z=this.t5
 this.pI(z)
 x=J.Vs(this.FL).MW.getAttribute("attributes")
-if(x!=null)for(y=C.xB.Fr(x,$.wm()),y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
+if(x!=null)for(y=C.xB.Fr(x,$.wm()),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
 if(v==="")continue
 u=$.Mg().Nz.t(0,v)
 t=L.hk([u])
@@ -14435,7 +14628,7 @@
 if(s==null){s=P.Fl(null,null)
 this.Q7=s}s.u(0,t,r)}},
 pI:function(a){var z,y,x,w
-for(z=$.mX().Me(0,a,C.aj),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){y=z.lo
+for(z=$.mX().Me(0,a,C.aj),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 x=J.RE(y)
 if(x.gV5(y)===!0)continue
 w=this.Q7
@@ -14443,7 +14636,7 @@
 this.Q7=w}w.u(0,L.hk([x.goc(y)]),y)
 w=new H.U5(y.gDv(),new A.Zd())
 w.$builtinTypeInfo=[null]
-if(w.ou(0,new A.Da())){w=this.Bj
+if(w.Vr(0,new A.Da())){w=this.Bj
 if(w==null){w=P.Ls(null,null,null,null)
 this.Bj=w}x=x.goc(y)
 w.h(0,$.Mg().ep.t(0,x))}}},
@@ -14456,22 +14649,22 @@
 W3:function(a){J.Vs(this.FL).aN(0,new A.BO(a))},
 Mi:function(){var z=this.Bg("link[rel=stylesheet]")
 this.Qk=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.Mp(z.lo)},
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.lo)},
 f6:function(){var z=this.Bg("style[polymer-scope]")
 this.q5=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.Mp(z.lo)},
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.lo)},
 OL:function(){var z,y,x,w,v,u,t,s
 z=this.Qk
 z.toString
 y=H.VM(new H.U5(z,new A.ZG()),[null])
 x=this.gZf()
 if(x!=null){w=P.p9("")
-for(z=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.Oq(y,0)]),v=z.OI;z.G();){u=A.q3(v.gl())
+for(z=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.u3(y,0)]),v=z.OI;z.G();){u=A.q3(v.gl())
 t=w.vM+=typeof u==="string"?u:H.d(u)
 w.vM=t+"\n"}if(w.vM.length>0){s=J.Do(this.FL).createElement("style",null)
 J.t3(s,H.d(w))
 z=J.RE(x)
-z.mK(x,s,z.gPZ(x))}}},
+z.mK(x,s,z.glb(x))}}},
 oP:function(a,b){var z,y,x
 z=J.Vj(this.FL,a)
 y=z.br(z)
@@ -14482,9 +14675,9 @@
 kO:function(a){var z,y,x,w,v,u
 z=P.p9("")
 y=new A.Vi("[polymer-scope="+a+"]")
-for(x=this.Qk,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.vG(J.mY(x.l6),x.T6),[H.Oq(x,0)]),w=x.OI;x.G();){v=A.q3(w.gl())
+for(x=this.Qk,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.vG(J.mY(x.l6),x.T6),[H.u3(x,0)]),w=x.OI;x.G();){v=A.q3(w.gl())
 u=z.vM+=typeof v==="string"?v:H.d(v)
-z.vM=u+"\n\n"}for(x=this.q5,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.Oq(y,0)]),x=y.OI;y.G();){v=J.dY(x.gl())
+z.vM=u+"\n\n"}for(x=this.q5,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.u3(y,0)]),x=y.OI;y.G();){v=J.dY(x.gl())
 w=z.vM+=typeof v==="string"?v:H.d(v)
 z.vM=w+"\n\n"}return z.vM},
 J3:function(a,b){var z
@@ -14494,7 +14687,7 @@
 z.setAttribute("element",H.d(this.oc)+"-"+b)
 return z},
 rH:function(){var z,y,x,w,v
-for(z=$.Sz(),z=$.mX().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){y=z.lo
+for(z=$.Sz(),z=$.mX().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 if(this.cK==null)this.cK=P.YM(null,null,null,null,null)
 x=J.RE(y)
 w=x.goc(y)
@@ -14503,9 +14696,9 @@
 v=w.Nj(v,0,J.Hn(w.gB(v),7))
 this.cK.u(0,L.hk(v),[x.goc(y)])}},
 I9:function(){var z,y,x
-for(z=$.mX().Me(0,this.t5,C.Tb),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){y=z.lo.gDv()
+for(z=$.mX().Me(0,this.t5,C.Tb),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo.gDv()
 x=new H.a7(y,y.length,0,null)
-x.$builtinTypeInfo=[H.Oq(y,0)]
+x.$builtinTypeInfo=[H.u3(y,0)]
 for(;x.G();)continue}},
 Yl:function(a){var z=P.L5(null,null,null,P.qU,null)
 a.aN(0,new A.Tj(z))
@@ -14528,7 +14721,7 @@
 "^":"TpZ:79;a",
 $2:function(a,b){var z,y,x
 z=J.rY(a)
-if(z.nC(a,"on-")){y=J.U6(b).kJ(b,"{{")
+if(z.nC(a,"on-")){y=J.U6(b).Mw(b,"{{")
 x=C.xB.cn(b,"}}")
 if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},
 $isEH:true},
@@ -14540,16 +14733,16 @@
 "^":"TpZ:12;a",
 $1:function(a){return J.Uv(a,this.a)},
 $isEH:true},
-XUG:{
+eM:{
 "^":"TpZ:74;",
 $0:function(){return[]},
 $isEH:true},
 Tj:{
-"^":"TpZ:173;a",
+"^":"TpZ:176;a",
 $2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
 Li:{
-"^":"BG9;Mn,cJ",
+"^":"BG9;Mn,DP",
 US:function(a,b,c){if(J.co(b,"on-"))return this.CZ(a,b,c)
 return this.Mn.US(a,b,c)}},
 BG9:{
@@ -14557,7 +14750,7 @@
 d23:{
 "^":"a;",
 XB:function(a){var z
-for(;z=J.RE(a),z.gBy(a)!=null;){if(!!z.$iszs&&J.UQ(a.SD,"eventController")!=null)return J.UQ(z.gXG(a),"eventController")
+for(;z=J.RE(a),z.gBy(a)!=null;){if(!!z.$iszs&&J.UQ(a.SD,"eventController")!=null)return J.UQ(z.gV6(a),"eventController")
 a=z.gBy(a)}return!!z.$isI0?a.host:null},
 Y2:function(a,b,c){var z={}
 z.a=a
@@ -14579,22 +14772,22 @@
 if(y==null||!J.x(y).$iszs){x=this.b.XB(this.c)
 z.a=x
 y=x}if(!!J.x(y).$iszs){y=J.x(a)
-if(!!y.$isRb){w=y.geyz(a)
+if(!!y.$isRb){w=y.gey(a)
 if(w==null)w=J.UQ(P.XY(a),"detail")}else w=null
 y=y.gSd(a)
 z=z.a
 J.bH(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 na:{
-"^":"TpZ:177;a,b,c",
+"^":"TpZ:180;a,b,c",
 $3:[function(a,b,c){var z,y,x,w
 z=this.c
 y=this.b.Y2(null,b,z)
 x=J.Ei(b).t(0,this.a.a)
-w=H.VM(new W.Ov(0,x.DK,x.Ph,W.aF(y),x.Sg),[H.Oq(x,0)])
+w=H.VM(new W.Ov(0,x.bi,x.Ph,W.aF(y),x.Sg),[H.u3(x,0)])
 w.Zz()
 if(c===!0)return
-return new A.d6(w,z)},"$3",null,6,0,null,174,175,176,"call"],
+return new A.d6(w,z)},"$3",null,6,0,null,177,178,179,"call"],
 $isEH:true},
 d6:{
 "^":"OC;Jq,ED",
@@ -14607,14 +14800,14 @@
 "^":"nd;vn<",
 $ishG:true},
 xc:{
-"^":"TR0;AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"TR0;AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 XI:function(a){this.Pa(a)},
 static:{G7:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -14622,7 +14815,7 @@
 C.Ki.XI(a)
 return a}}},
 re:{
-"^":"Bo+zs;XG:SD=",
+"^":"Bo+zs;V6:SD=",
 $iszs:true,
 $isvy:true,
 $isd3:true,
@@ -14633,7 +14826,7 @@
 "^":"re+Pi;",
 $isd3:true},
 zs:{
-"^":"a;XG:SD=",
+"^":"a;V6:SD=",
 gFL:function(a){return a.IX},
 gUj:function(a){return},
 gRT:function(a){var z,y
@@ -14659,12 +14852,12 @@
 z=a.Wz
 if(z!=null){y=this.gUc(a)
 z.toString
-L.AR.prototype.TR.call(J.x(z),z,y)}if(a.IX.gQ7()!=null)this.gqh(a).yI(this.gGi(a))
+L.lg.prototype.TR.call(J.x(z),z,y)}if(a.IX.gQ7()!=null)this.gqh(a).yI(this.gGi(a))
 this.Z2(a)
 this.fk(a)
 this.qb(a)},
-rf:function(a){if(a.q1)return
-a.q1=!0
+rf:function(a){if(a.Ap)return
+a.Ap=!0
 this.Oh(a,a.IX)
 this.gQg(a).Rz(0,"unresolved")
 this.e1(a)},
@@ -14672,7 +14865,7 @@
 Es:function(a){if(a.IX==null)throw H.b(P.w("polymerCreated was not called for custom element "+H.d(this.gRT(a))+", this should normally be done in the .created() if Polymer is used as a mixin."))
 this.oW(a)
 if(!a.oG){a.oG=!0
-this.rW(a,new A.bl(a))}},
+this.Gy(a,new A.bl(a))}},
 dQ:function(a){this.d9(a)},
 Oh:function(a,b){if(b!=null){this.Oh(a,b.gXj())
 this.aI(a,J.nq(b))}},
@@ -14688,9 +14881,9 @@
 z=this.er(a)
 y=this.gUj(a)
 x=!!J.x(b).$isvy?b:M.SB(b)
-w=J.MO(x,a,y==null&&J.fx(x)==null?J.du(a.IX):y)
+w=J.MO(x,a,y==null&&J.qy(x)==null?J.du(a.IX):y)
 v=$.vH().t(0,w)
-u=v!=null?v.gu2():v
+u=v!=null?v.gmD():v
 a.Cc.push(u)
 z.appendChild(w)
 this.lj(a,z)
@@ -14717,7 +14910,7 @@
 x=J.x(v)
 u=Z.Zh(c,w,(x.n(v,C.AP)||x.n(v,C.wG))&&w!=null?J.Lm(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","ghW",4,0,178],
+$.cp().Cq(a,y,u)}},"$2","ghW",4,0,181],
 B2:function(a,b){var z=a.IX.gNF()
 if(z==null)return
 return z.t(0,b)},
@@ -14725,7 +14918,7 @@
 if(typeof b==="boolean")return b?"":null
 else if(typeof b==="string"||typeof b==="number")return H.d(b)
 return},
-JY:function(a,b){var z,y,x
+QH:function(a,b){var z,y,x
 z=L.hk(b).Tl(a)
 y=this.TW(a,z)
 if(y!=null)this.gQg(a).MW.setAttribute(b,y)
@@ -14737,8 +14930,8 @@
 if(z==null)return J.FS(M.SB(a),b,c,d)
 else{y=J.RE(z)
 x=y.goc(z)
-w=$.zB()
-if(w.mL(C.t4))w.Ny("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gRT(a))+"].["+H.d(x)+"]")
+w=$.fv()
+if(w.mL(C.t4))w.J4("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gRT(a))+"].["+H.d(x)+"]")
 w=J.RE(c)
 if(w.gP(c)==null)w.sP(c,$.cp().jD(a,x))
 v=new A.lK(a,x,c,null,null)
@@ -14750,7 +14943,7 @@
 J.nC(M.SB(a),x)}J.kW(J.QE(M.SB(a)),b,v)}u=a.IX.gBj()
 y=y.goc(z)
 t=$.Mg().ep.t(0,y)
-if(u!=null&&u.tg(0,t))this.JY(a,t)
+if(u!=null&&u.tg(0,t))this.QH(a,t)
 return v}},
 Vz:function(a){return this.rf(a)},
 gCd:function(a){return J.QE(M.SB(a))},
@@ -14758,20 +14951,20 @@
 gmSA:function(a){return J.Zz(M.SB(a))},
 d9:function(a){var z,y
 if(a.Uk===!0)return
-$.iX().Ny("["+H.d(this.gRT(a))+"] asyncUnbindAll")
+$.iX().J4("["+H.d(this.gRT(a))+"] asyncUnbindAll")
 z=a.oq
 y=this.gJg(a)
 if(z==null)z=new A.FT(null,null,null)
 z.t6(0,y,null)
 a.oq=z},
 BM:[function(a){if(a.Uk===!0)return
-H.bQ(a.Cc,this.ghb(a))
+H.bQ(a.Cc,this.gMA(a))
 a.Cc=[]
 this.Uq(a)
 a.Uk=!0},"$0","gJg",0,0,17],
 oW:function(a){var z
 if(a.Uk===!0){$.iX().j2("["+H.d(this.gRT(a))+"] already unbound, cannot cancel unbindAll")
-return}$.iX().Ny("["+H.d(this.gRT(a))+"] cancelUnbindAll")
+return}$.iX().J4("["+H.d(this.gRT(a))+"] cancelUnbindAll")
 z=a.oq
 if(z!=null){z.nY(0)
 a.oq=null}},
@@ -14783,26 +14976,26 @@
 x.Wf=[]
 a.Wz=x
 a.Cc.push([x])
-for(y=H.VM(new P.fG(z),[H.Oq(z,0)]),w=y.Fb,y=H.VM(new P.EQ(w,w.Ig(),0,null),[H.Oq(y,0)]);y.G();){v=y.fD
+for(y=H.VM(new P.fG(z),[H.u3(z,0)]),w=y.Fb,y=H.VM(new P.EQ(w,w.Ig(),0,null),[H.u3(y,0)]);y.G();){v=y.fD
 x.yN(a,v)
 this.rJ(a,v,v.Tl(a),null)}}},
-FQ:[function(a,b,c,d){J.Me(c,new A.N4(a,b,c,d,J.JR(a.IX),P.Rd(null,null,null,null)))},"$3","gUc",6,0,179],
+FQ:[function(a,b,c,d){J.Me(c,new A.N4(a,b,c,d,J.JR(a.IX),P.Rd(null,null,null,null)))},"$3","gUc",6,0,182],
 HT:[function(a,b){var z,y,x,w,v
 for(z=J.mY(b);z.G();){y=z.gl()
 if(!J.x(y).$isqI)continue
 x=y.oc
 w=$.Mg().ep.t(0,x)
 v=a.IX.gBj()
-if(v!=null&&v.tg(0,w))this.JY(a,w)}},"$1","gGi",2,0,180,172],
+if(v!=null&&v.tg(0,w))this.QH(a,w)}},"$1","gGi",2,0,183,175],
 rJ:function(a,b,c,d){var z,y,x,w,v
 z=J.JR(a.IX)
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
 if(!!J.x(d).$iswn){x=$.mj()
-if(x.mL(C.t4))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: unregister "+H.d(b))
+if(x.mL(C.t4))x.J4("["+H.d(this.gRT(a))+"] observeArrayValue: unregister "+H.d(b))
 this.iQ(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.mj()
-if(x.mL(C.t4))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: register "+H.d(b))
+if(x.mL(C.t4))x.J4("["+H.d(this.gRT(a))+"] observeArrayValue: register "+H.d(b))
 w=c.gQV().ht(new A.Y0(a,d,y),null,null,!1)
 x=H.d(b)+"__array"
 v=a.q9
@@ -14810,7 +15003,7 @@
 a.q9=v}v.u(0,x,w)}},
 dvq:[function(a,b){var z,y
 for(z=J.mY(b);z.G();){y=z.gl()
-if(y!=null)J.yd(y)}},"$1","ghb",2,0,181],
+if(y!=null)J.yd(y)}},"$1","gMA",2,0,184],
 iQ:function(a,b){var z=a.q9.Rz(0,b)
 if(z==null)return!1
 z.ed()
@@ -14818,35 +15011,35 @@
 Uq:function(a){var z,y
 z=a.q9
 if(z==null)return
-for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.l6),z.T6),[H.Oq(z,0),H.Oq(z,1)]);z.G();){y=z.lo
+for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.l6),z.T6),[H.u3(z,0),H.u3(z,1)]);z.G();){y=z.lo
 if(y!=null)y.ed()}a.q9.V1(0)
 a.q9=null},
 qb:function(a){var z,y
 z=a.IX.gPS()
 if(z.gl0(z))return
 y=$.ay()
-if(y.mL(C.t4))y.Ny("["+H.d(this.gRT(a))+"] addHostListeners: "+z.bu(0))
+if(y.mL(C.t4))y.J4("["+H.d(this.gRT(a))+"] addHostListeners: "+z.bu(0))
 z.aN(0,new A.SX(a))},
 ea:function(a,b,c,d){var z,y,x,w
 z=$.ay()
 y=z.mL(C.t4)
-if(y)z.Ny(">>> ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))
+if(y)z.J4(">>> ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))
 if(!!J.x(c).$isEH){x=X.RI(c)
 if(x===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
 C.Nm.sB(d,x)
 H.eC(c,d,P.Te(null))}else if(typeof c==="string"){w=$.Mg().Nz.t(0,c)
 $.cp().Ck(b,w,d,!0,null)}else z.j2("invalid callback")
 if(y)z.To("<<< ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))},
-rW:function(a,b){var z
+Gy:function(a,b){var z
 P.rb(F.Jy())
 $.Kc().nQ("flush")
 z=window
 C.ol.pl(z)
 return C.ol.oB(z,W.aF(b))},
-SE:function(a,b,c,d,e,f){var z=W.Q8(b,!0,!0,e)
+KW:function(a,b,c,d,e,f){var z=W.H9(b,!0,!0,e)
 this.H2(a,z)
 return z},
-Tj:function(a,b){return this.SE(a,b,null,null,null,null)},
+te:function(a,b){return this.KW(a,b,null,null,null,null)},
 $iszs:true,
 $isvy:true,
 $isd3:true,
@@ -14884,20 +15077,20 @@
 for(w=J.mY(u),t=this.a,s=J.RE(t),r=this.c,q=this.f;w.G();){p=w.gl()
 if(!q.h(0,p))continue
 s.rJ(t,v,y,b)
-$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,93,59,"call"],
+$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,95,59,"call"],
 $isEH:true},
 Y0:{
 "^":"TpZ:12;a,b,c",
 $1:[function(a){var z,y,x,w
 for(z=J.mY(this.c),y=this.a,x=this.b;z.G();){w=z.gl()
-$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,182,"call"],
+$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,185,"call"],
 $isEH:true},
 SX:{
 "^":"TpZ:79;a",
 $2:function(a,b){var z,y
 z=this.a
 y=J.Ei(z).t(0,a)
-H.VM(new W.Ov(0,y.DK,y.Ph,W.aF(J.du(z.IX).Y2(z,z,b)),y.Sg),[H.Oq(y,0)]).Zz()},
+H.VM(new W.Ov(0,y.bi,y.Ph,W.aF(J.du(z.IX).Y2(z,z,b)),y.Sg),[H.u3(y,0)]).Zz()},
 $isEH:true},
 lK:{
 "^":"OC;I6,iU,q0,Jq,dY",
@@ -14911,7 +15104,7 @@
 v=w.$1(z)
 z=this.dY
 if(z==null?v!=null:z!==v)J.ta(this.q0,v)
-return}}},"$1","gXQ",2,0,180,172],
+return}}},"$1","gXQ",2,0,183,175],
 TR:function(a,b){return J.mu(this.q0,b)},
 gP:function(a){return J.Vm(this.q0)},
 sP:function(a,b){J.ta(this.q0,b)
@@ -14920,7 +15113,7 @@
 if(z!=null){z.ed()
 this.Jq=null}J.yd(this.q0)}},
 FT:{
-"^":"a;jd,ih,lS",
+"^":"a;jd,oK,lS",
 Ws:function(){return this.jd.$0()},
 t6:function(a,b,c){var z
 this.nY(0)
@@ -14933,13 +15126,13 @@
 if(z!=null){y=window
 C.ol.pl(y)
 y.cancelAnimationFrame(z)
-this.lS=null}z=this.ih
+this.lS=null}z=this.oK
 if(z!=null){z.ed()
-this.ih=null}}},
+this.oK=null}}},
 K3:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(z.ih!=null||z.lS!=null){z.nY(0)
+if(z.oK!=null||z.lS!=null){z.nY(0)
 z.Ws()}return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 mS:{
@@ -14954,10 +15147,10 @@
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 k2:{
-"^":"TpZ:185;a,b",
+"^":"TpZ:188;a,b",
 $3:[function(a,b,c){var z=$.Ej().t(0,b)
 if(z!=null)return this.a.Gr(new A.zR(a,b,z,$.vE().t(0,c)))
-return this.b.qP([b,c],a)},"$3",null,6,0,null,183,58,184,"call"],
+return this.b.qP([b,c],a)},"$3",null,6,0,null,186,58,187,"call"],
 $isEH:true},
 zR:{
 "^":"TpZ:74;c,d,e,f",
@@ -14977,7 +15170,7 @@
 t.I9()
 s=J.RE(z)
 r=s.Wk(z,"template")
-if(r!=null)J.vc(!!J.x(r).$isvy?r:M.SB(r),v)
+if(r!=null)J.D4(!!J.x(r).$isvy?r:M.SB(r),v)
 t.Mi()
 t.f6()
 t.OL()
@@ -15009,11 +15202,11 @@
 j=z.Ev
 if(j!=null);else j=null}n=p.ux
 m=p.Bo
-l=p.IE}}i=z.bM
+l=p.IE}}i=z.D6
 if(i!=null);else i=null
 t.t4=new P.q5(m,l,k,o,n,j,i,null,null)
 z=t.gZf()
-A.YG(z,y,w!=null?J.O6(w):null)
+A.Eo(z,y,w!=null?J.O6(w):null)
 if($.mX().n6(x,C.MT))$.cp().Ck(x,C.MT,[t],!1,null)
 t.Ba(y)
 return},"$0",null,0,0,null,"call"],
@@ -15022,31 +15215,31 @@
 "^":"TpZ:74;",
 $0:function(){var z=J.UQ(P.XY(document.createElement("polymer-element",null)),"__proto__")
 return!!J.x(z).$isKV?P.XY(z):z},
-$isEH:true}}],["polymer.auto_binding","package:polymer/auto_binding.dart",,Y,{
+$isEH:true}}],["","",,Y,{
 "^":"",
 q6:{
-"^":"wc;Hf,ro,fb,pt,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"k5d;Hf,ro,fb,pt,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gk8:function(a){return J.ZH(a.Hf)},
-gG5:function(a){return J.fx(a.Hf)},
-sG5:function(a,b){J.vc(a.Hf,b)},
+gA0:function(a){return J.qy(a.Hf)},
+sA0:function(a,b){J.D4(a.Hf,b)},
 V1:function(a){return J.Z8(a.Hf)},
-gUj:function(a){return J.fx(a.Hf)},
+gUj:function(a){return J.qy(a.Hf)},
 ZK:function(a,b,c){return J.MO(a.Hf,b,c)},
 ea:function(a,b,c,d){return A.zs.prototype.ea.call(this,a,b===a?J.ZH(a.Hf):b,c,d)},
 dX:function(a){var z
 this.Pa(a)
 a.Hf=M.SB(a)
 z=T.GF(null,C.qY)
-J.vc(a.Hf,new Y.zp(a,z,null))
+J.D4(a.Hf,new Y.zp(a,z,null))
 $.iF().MM.ml(new Y.lkK(a))},
 $isDT:true,
 $isvy:true,
-static:{Ifw:function(a){var z,y
+static:{zE:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -15054,33 +15247,33 @@
 C.Gkp.dX(a)
 return a}}},
 GLL:{
-"^":"OH+zs;XG:SD=",
+"^":"fX+zs;V6:SD=",
 $iszs:true,
 $isvy:true,
 $isd3:true,
 $ish4:true,
 $isPZ:true,
 $isKV:true},
-wc:{
+k5d:{
 "^":"GLL+d3;R9:ro%,V2:fb%,me:pt%",
 $isd3:true},
 lkK:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 z.setAttribute("bind","")
-J.mI(z,new Y.dv(z))},"$1",null,2,0,null,13,"call"],
+J.rg(z,new Y.Mr(z))},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-dv:{
+Mr:{
 "^":"TpZ:12;b",
 $1:[function(a){var z,y
 z=this.b
 y=J.RE(z)
 y.lj(z,z.parentNode)
-y.Tj(z,"template-bound")},"$1",null,2,0,null,13,"call"],
+y.te(z,"template-bound")},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 zp:{
-"^":"Li;dq,Mn,cJ",
-XB:function(a){return this.dq}}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
+"^":"Li;dq,Mn,DP",
+XB:function(a){return this.dq}}}],["","",,Z,{
 "^":"",
 Zh:function(a,b,c){var z,y,x
 z=$.Rf().t(0,c)
@@ -15122,7 +15315,7 @@
 Lf:{
 "^":"TpZ:12;b",
 $1:function(a){return this.b},
-$isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
+$isEH:true}}],["","",,T,{
 "^":"",
 Rj:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.zg(z.gvc(a),new T.IK(a)).zV(0," ")
@@ -15139,10 +15332,10 @@
 $isEH:true},
 k9:{
 "^":"TpZ:12;a",
-$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,130,"call"],
+$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,133,"call"],
 $isEH:true},
 QB:{
-"^":"VE;VA,jw,iX,WK,cJ",
+"^":"VE;BlM,nF,QA,YH,DP",
 US:function(a,b,c){var z,y,x,w
 z={}
 y=new Y.xv(H.VM([],[Y.qS]),P.p9(""),new P.Kg(a,0,0,null),null)
@@ -15150,22 +15343,22 @@
 x=new T.FX(x,y,null,null)
 y=y.zl()
 x.jQ=y
-x.vi=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)])
+x.R3=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)])
 x.Bp()
 w=x.Te()
 if(M.CF(c)){y=J.x(b)
 y=y.n(b,"bind")||y.n(b,"repeat")}else y=!1
 if(y){z=J.x(w)
-if(!!z.$isb4)return new T.qb(this,w.gxG(),z.gkZ(w))
+if(!!z.$isDI)return new T.qb(this,w.gxG(),z.gkZ(w))
 else return new T.Xyb(this,w)}z.a=null
 y=!!J.x(c).$ish4
 if(y&&J.xC(b,"class"))z.a=T.PG()
 else if(y&&J.xC(b,"style"))z.a=T.Bn()
 return new T.Ddj(z,this,w)},
-CE:function(a){var z=this.WK.t(0,a)
+A5:function(a){var z=this.YH.t(0,a)
 if(z==null)return new T.r6(this,a)
 return new T.Wb(this,a,z)},
-fO:function(a){var z,y,x,w,v
+ZN:function(a){var z,y,x,w,v
 z=J.RE(a)
 y=z.gBy(a)
 if(y==null)return
@@ -15174,121 +15367,121 @@
 w=z.gmSA(x)
 v=w==null?z.gk8(x):w.k8
 if(!!J.x(v).$isGK)return v
-else return this.iX.t(0,a)}return this.fO(y)},
-ey:function(a,b){var z,y
-if(a==null)return K.dZ(b,this.jw)
+else return this.QA.t(0,a)}return this.ZN(y)},
+JY:function(a,b){var z,y
+if(a==null)return K.dZ(b,this.nF)
 z=J.x(a)
 if(!!z.$ish4);if(!!J.x(b).$isGK)return b
-y=this.iX
+y=this.QA
 if(y.t(0,a)!=null){y.t(0,a)
-return y.t(0,a)}else if(z.gBy(a)!=null)return this.Wg(z.gBy(a),b)
+return y.t(0,a)}else if(z.gBy(a)!=null)return this.rp(z.gBy(a),b)
 else{if(!M.CF(a))throw H.b("expected a template instead of "+H.d(a))
-return this.Wg(a,b)}},
-Wg:function(a,b){var z,y,x
+return this.rp(a,b)}},
+rp:function(a,b){var z,y,x
 if(M.CF(a)){z=!!J.x(a).$isvy?a:M.SB(a)
 y=J.RE(z)
 if(y.gmSA(z)==null)y.gk8(z)
-return this.iX.t(0,a)}else{y=J.RE(a)
-if(y.geT(a)==null){x=this.iX.t(0,a)
-return x!=null?x:K.dZ(b,this.jw)}else return this.Wg(y.gBy(a),b)}},
-static:{"^":"DI",GF:function(a,b){var z,y,x
+return this.QA.t(0,a)}else{y=J.RE(a)
+if(y.geT(a)==null){x=this.QA.t(0,a)
+return x!=null?x:K.dZ(b,this.nF)}else return this.rp(y.gBy(a),b)}},
+static:{"^":"rp3",GF:function(a,b){var z,y,x
 z=H.VM(new P.qo(null),[K.GK])
 y=H.VM(new P.qo(null),[P.qU])
 x=P.L5(null,null,null,P.qU,P.a)
 x.FV(0,C.c7o)
 return new T.QB(b,x,z,y,null)}}},
 qb:{
-"^":"TpZ:186;b,c,d",
+"^":"TpZ:189;b,c,d",
 $3:[function(a,b,c){var z,y
 z=this.b
-z.WK.u(0,b,this.c)
-y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
-z.iX.u(0,b,y)
+z.YH.u(0,b,this.c)
+y=!!J.x(a).$isGK?a:K.dZ(a,z.nF)
+z.QA.u(0,b,y)
 z=T.kR()
-return new T.tI(y,z,this.d,null,null,null,null)},"$3",null,6,0,null,174,175,176,"call"],
+return new T.tI(y,z,this.d,null,null,null,null)},"$3",null,6,0,null,177,178,179,"call"],
 $isEH:true},
 Xyb:{
-"^":"TpZ:186;e,f",
+"^":"TpZ:189;e,f",
 $3:[function(a,b,c){var z,y
 z=this.e
-y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
-z.iX.u(0,b,y)
+y=!!J.x(a).$isGK?a:K.dZ(a,z.nF)
+z.QA.u(0,b,y)
 if(c===!0)return T.jF(this.f,y,null)
 z=T.kR()
-return new T.tI(y,z,this.f,null,null,null,null)},"$3",null,6,0,null,174,175,176,"call"],
+return new T.tI(y,z,this.f,null,null,null,null)},"$3",null,6,0,null,177,178,179,"call"],
 $isEH:true},
 Ddj:{
-"^":"TpZ:186;a,UI,bK",
+"^":"TpZ:189;a,UI,bK",
 $3:[function(a,b,c){var z,y
-z=this.UI.ey(b,a)
+z=this.UI.JY(b,a)
 if(c===!0)return T.jF(this.bK,z,this.a.a)
 y=this.a.a
 if(y==null)y=T.kR()
-return new T.tI(z,y,this.bK,null,null,null,null)},"$3",null,6,0,null,174,175,176,"call"],
+return new T.tI(z,y,this.bK,null,null,null,null)},"$3",null,6,0,null,177,178,179,"call"],
 $isEH:true},
 r6:{
 "^":"TpZ:12;a,b",
 $1:[function(a){var z,y,x
 z=this.a
 y=this.b
-x=z.iX.t(0,y)
+x=z.QA.t(0,y)
 if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.dZ(a,z.jw)}else return z.ey(y,a)},"$1",null,2,0,null,174,"call"],
+return K.dZ(a,z.nF)}else return z.JY(y,a)},"$1",null,2,0,null,177,"call"],
 $isEH:true},
 Wb:{
 "^":"TpZ:12;c,d,e",
 $1:[function(a){var z,y,x,w
 z=this.c
 y=this.d
-x=z.iX.t(0,y)
+x=z.QA.t(0,y)
 w=this.e
 if(x!=null)return x.t1(w,a)
-else return z.fO(y).t1(w,a)},"$1",null,2,0,null,174,"call"],
+else return z.ZN(y).t1(w,a)},"$1",null,2,0,null,177,"call"],
 $isEH:true},
 tI:{
-"^":"OC;IM,eI,kG,Tu,T7,zh,IZ",
-bh:function(a){return this.eI.$1(a)},
-tC:function(a){return this.Tu.$1(a)},
-b9:[function(a,b){var z,y
-z=this.IZ
-y=this.bh(a)
-this.IZ=y
-if(b!==!0&&this.Tu!=null&&!J.xC(z,y))this.tC(this.IZ)},function(a){return this.b9(a,!1)},"bU","$2$skipChanges","$1","gNB",2,3,187,188,66,189],
-gP:function(a){if(this.Tu!=null)return this.IZ
-return T.jF(this.kG,this.IM,this.eI)},
+"^":"OC;yr,wx,n4,Fg,JX,zr,HR",
+Gb:function(a){return this.wx.$1(a)},
+WV:function(a){return this.Fg.$1(a)},
+nb:[function(a,b){var z,y
+z=this.HR
+y=this.Gb(a)
+this.HR=y
+if(b!==!0&&this.Fg!=null&&!J.xC(z,y))this.WV(this.HR)},function(a){return this.nb(a,!1)},"zh","$2$skipChanges","$1","gQp",2,3,190,191,66,192],
+gP:function(a){if(this.Fg!=null)return this.HR
+return T.jF(this.n4,this.yr,this.wx)},
 sP:function(a,b){var z,y,x,w,v
-try{z=K.FH(this.kG,b,this.IM,!1)
-this.b9(z,!0)}catch(w){v=H.Ru(w)
+try{z=K.jXm(this.n4,b,this.yr,!1)
+this.nb(z,!0)}catch(w){v=H.Ru(w)
 y=v
 x=new H.oP(w,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.kG)+"': "+H.d(y),x)}},
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.n4)+"': "+H.d(y),x)}},
 TR:function(a,b){var z,y,x,w,v
-if(this.Tu!=null)throw H.b(P.w("already open"))
-this.Tu=b
+if(this.Fg!=null)throw H.b(P.w("already open"))
+this.Fg=b
 x=H.VM(new P.Sw(null,0,0,0),[null])
 x.Eo(null,null)
-w=this.kG.RR(0,new K.Oy(x))
-this.zh=w
-x=w.gUO().yI(this.gNB())
+w=this.n4.RR(0,new K.Oy(x))
+this.zr=w
+x=w.gqM().yI(this.gQp())
 x.fm(0,new T.pI(this))
-this.T7=x
-try{x=this.zh
-J.okV(x,new K.Edh(this.IM))
+this.JX=x
+try{x=this.zr
+J.okV(x,new K.Edh(this.yr))
 x.gK3()
-this.b9(this.zh.gK3(),!0)}catch(v){x=H.Ru(v)
+this.nb(this.zr.gK3(),!0)}catch(v){x=H.Ru(v)
 z=x
 y=new H.oP(v,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.zh)+"': "+H.d(z),y)}return this.IZ},
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.zr)+"': "+H.d(z),y)}return this.HR},
 xO:function(a){var z,y
-if(this.Tu==null)return
-this.T7.ed()
-this.T7=null
-this.Tu=null
-z=$.At()
-y=this.zh
+if(this.Fg==null)return
+this.JX.ed()
+this.JX=null
+this.Fg=null
+z=$.bq()
+y=this.zr
 z.toString
 J.okV(y,z)
-this.zh=null},
+this.zr=null},
 static:{jF:function(a,b,c){var z,y,x,w,v
 try{z=J.okV(a,new K.GQ(b))
 w=c==null?z:c.$1(z)
@@ -15298,36 +15491,36 @@
 H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
 pI:{
 "^":"TpZ:79;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.zh)+"': "+H.d(a),b)},"$2",null,4,0,null,2,154,"call"],
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.zr)+"': "+H.d(a),b)},"$2",null,4,0,null,2,157,"call"],
 $isEH:true},
-yy:{
-"^":"a;"}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
+WM:{
+"^":"a;"}}],["","",,B,{
 "^":"",
 De:{
-"^":"xhq;vq,ra,AP,fn",
-vb:function(a,b){this.vq.yI(new B.fg(b,this))},
+"^":"xhq;vq>,ra,AP,fn",
+vb:function(a,b){this.vq.yI(new B.fg(this,b))},
 $asxhq:function(a){return[null]},
 static:{pe:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
 fg:{
 "^":"TpZ;a,b",
-$1:[function(a){var z=this.b
-z.ra=F.Wi(z,C.ls,z.ra,a)},"$1",null,2,0,null,93,"call"],
+$1:[function(a){var z=this.a
+z.ra=F.Wi(z,C.ls,z.ra,a)},"$1",null,2,0,null,95,"call"],
 $isEH:true,
-$signature:function(){return H.IGs(function(a){return{func:"Ay",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
+$signature:function(){return H.IGs(function(a){return{func:"Ay",args:[a]}},this.a,"De")}}}],["","",,K,{
 "^":"",
-FH:function(a,b,c,d){var z,y,x,w,v,u,t
+jXm:function(a,b,c,d){var z,y,x,w,v,u,t
 z=H.VM([],[U.Ip])
 for(;y=J.x(a),!!y.$isuku;){if(!J.xC(y.gkp(a),"|"))break
 z.push(y.gT8(a))
-a=y.gBb(a)}if(!!y.$isfp){x=y.gP(a)
-w=C.OL
+a=y.gBb(a)}if(!!y.$iselO){x=y.gP(a)
+w=C.x4
 v=!1}else if(!!y.$iszX){w=a.gTf()
 x=a.gJn()
 v=!0}else{if(!!y.$isrX){w=a.gTf()
 x=y.goc(a)}else{if(d)throw H.b(K.xn("Expression is not assignable: "+H.d(a)))
-return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);y.G();){u=y.lo
+return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){u=y.lo
 J.okV(u,new K.GQ(c))
 if(d)throw H.b(K.xn("filter must implement Transformer to be assignable: "+H.d(u)))
 else return}t=J.okV(w,new K.GQ(c))
@@ -15381,7 +15574,7 @@
 $isEH:true},
 w21:{
 "^":"TpZ:79;",
-$2:function(a,b){return J.z8(a,b)},
+$2:function(a,b){return J.xZ(a,b)},
 $isEH:true},
 w22:{
 "^":"TpZ:79;",
@@ -15461,25 +15654,25 @@
 AC:function(a){if(this.Z3.x4(0,a))return!1
 return!J.xC(a,"this")},
 bu:[function(a){var z=this.Z3
-return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.Ix(H.VM(new P.i5(z),[H.Oq(z,0)]),"(",")")+"]"},"$0","gAY",0,0,71]},
+return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.Ix(H.VM(new P.i5(z),[H.u3(z,0)]),"(",")")+"]"},"$0","gAY",0,0,71]},
 Ay0:{
-"^":"a;bO?,Xl<",
-gUO:function(){var z=this.k6
-return H.VM(new P.Ik(z),[H.Oq(z,0)])},
-gK3:function(){return this.Xl},
+"^":"a;fT?,Gl<",
+gqM:function(){var z=this.k6
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
+gK3:function(){return this.Gl},
 Qh:function(a){},
 ub:function(a){var z
 this.Db(0,a)
-z=this.bO
+z=this.fT
 if(z!=null)z.ub(a)},
 pu:function(){var z=this.tj
 if(z!=null){z.ed()
 this.tj=null}},
 Db:function(a,b){var z,y,x
 this.pu()
-z=this.Xl
+z=this.Gl
 this.Qh(b)
-y=this.Xl
+y=this.Gl
 if(y==null?z!=null:y!==z){x=this.k6
 if(x.Gv>=4)H.vh(x.q7())
 x.Iv(y)}},
@@ -15491,12 +15684,12 @@
 me:{
 "^":"cfS;",
 xn:function(a){a.pu()},
-static:{"^":"b3"}},
+static:{"^":"jCU"}},
 GQ:{
-"^":"P55;qu",
+"^":"lW;qu",
 W9:function(a){return J.ZH(this.qu)},
 LT:function(a){return a.wz.RR(0,this)},
-fV:function(a){var z,y,x
+T7:function(a){var z,y,x
 z=J.okV(a.gTf(),this)
 if(z==null)return
 y=a.goc(a)
@@ -15520,15 +15713,15 @@
 Zh:function(a){return H.VM(new H.A8(a.ghL(),this.gnG()),[null,null]).br(0)},
 o0:function(a){var z,y,x
 z=P.Fl(null,null)
-for(y=a.gRl(a),y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]);y.G();){x=y.lo
-z.u(0,J.okV(J.A6(x),this),J.okV(x.gv4(),this))}return z},
-YV:function(a){return H.vh(P.f("should never be called"))},
+for(y=a.gRl(a),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.lo
+z.u(0,J.okV(J.Kt(x),this),J.okV(x.gv4(),this))}return z},
+EZ:function(a){return H.vh(P.f("should never be called"))},
 qs:function(a){return J.UQ(this.qu,a.gP(a))},
 ex:function(a){var z,y,x,w,v
 z=a.gkp(a)
 y=J.okV(a.gBb(a),this)
 x=J.okV(a.gT8(a),this)
-w=$.YP().t(0,z)
+w=$.Xa().t(0,z)
 v=J.x(z)
 if(v.n(z,"&&")||v.n(z,"||")){v=y==null?!1:y
 return w.$2(v,x==null?!1:x)}else if(v.n(z,"==")||v.n(z,"!="))return w.$2(y,x)
@@ -15539,24 +15732,24 @@
 y=$.EU().t(0,a.gkp(a))
 if(J.xC(a.gkp(a),"!"))return y.$1(z==null?!1:z)
 return z==null?null:y.$1(z)},
-RD:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gSl(),this):J.okV(a.gru(),this)},
-e5:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
-xt:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
+RN:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gSl(),this):J.okV(a.gru(),this)},
+ky:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
+Vw:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
 Oy:{
-"^":"P55;ZGj",
+"^":"lW;ZGj",
 W9:function(a){return new K.uD(a,null,null,null,P.bK(null,null,!1,null))},
 LT:function(a){return a.wz.RR(0,this)},
-fV:function(a){var z,y
+T7:function(a){var z,y
 z=J.okV(a.gTf(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(y)
+z.sfT(y)
 return y},
 CU:function(a){var z,y,x
 z=J.okV(a.gTf(),this)
 y=J.okV(a.gJn(),this)
 x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(x)
-y.sbO(x)
+z.sfT(x)
+y.sfT(x)
 return x},
 Y7:function(a){var z,y,x,w,v
 z=J.okV(a.gTf(),this)
@@ -15565,7 +15758,7 @@
 w=this.gnG()
 x.toString
 y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.c3(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(v)
+z.sfT(v)
 if(y!=null)H.bQ(y,new K.zD(v))
 return v},
 tx:function(a){return new K.z0(a,null,null,null,P.bK(null,null,!1,null))},
@@ -15579,110 +15772,110 @@
 y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.Xs(y))
 return y},
-YV:function(a){var z,y,x
+EZ:function(a){var z,y,x
 z=J.okV(a.gG3(a),this)
 y=J.okV(a.gv4(),this)
 x=new K.EL(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(x)
-y.sbO(x)
+z.sfT(x)
+y.sfT(x)
 return x},
 qs:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
 ex:function(a){var z,y,x
 z=J.okV(a.gBb(a),this)
 y=J.okV(a.gT8(a),this)
-x=new K.UW(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(x)
-y.sbO(x)
+x=new K.kyp(z,y,a,null,null,null,P.bK(null,null,!1,null))
+z.sfT(x)
+y.sfT(x)
 return x},
 xN:function(a){var z,y
 z=J.okV(a.gwz(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(y)
+z.sfT(y)
 return y},
-RD:function(a){var z,y,x,w
+RN:function(a){var z,y,x,w
 z=J.okV(a.gdc(),this)
 y=J.okV(a.gSl(),this)
 x=J.okV(a.gru(),this)
 w=new K.WW(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(w)
-y.sbO(w)
-x.sbO(w)
+z.sfT(w)
+y.sfT(w)
+x.sfT(w)
 return w},
-e5:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
-xt:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
+ky:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
+Vw:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
 zD:{
 "^":"TpZ:12;a",
 $1:function(a){var z=this.a
-a.sbO(z)
+a.sfT(z)
 return z},
 $isEH:true},
 XV:{
 "^":"TpZ:12;a",
 $1:function(a){var z=this.a
-a.sbO(z)
+a.sfT(z)
 return z},
 $isEH:true},
 Xs:{
 "^":"TpZ:12;a",
 $1:function(a){var z=this.a
-a.sbO(z)
+a.sfT(z)
 return z},
 $isEH:true},
 uD:{
-"^":"Ay0;KL,bO,tj,Xl,k6",
-Qh:function(a){this.Xl=J.ZH(a)},
+"^":"Ay0;KL,fT,tj,Gl,k6",
+Qh:function(a){this.Gl=J.ZH(a)},
 RR:function(a,b){return b.W9(this)},
 $asAy0:function(){return[U.WH]},
 $isWH:true,
 $isIp:true},
 z0:{
-"^":"Ay0;KL,bO,tj,Xl,k6",
+"^":"Ay0;KL,fT,tj,Gl,k6",
 gP:function(a){var z=this.KL
 return z.gP(z)},
 Qh:function(a){var z=this.KL
-this.Xl=z.gP(z)},
+this.Gl=z.gP(z)},
 RR:function(a,b){return b.tx(this)},
-$asAy0:function(){return[U.no]},
-$asno:function(){return[null]},
-$isno:true,
+$asAy0:function(){return[U.noG]},
+$asnoG:function(){return[null]},
+$isnoG:true,
 $isIp:true},
 kL:{
-"^":"Ay0;hL<,KL,bO,tj,Xl,k6",
-Qh:function(a){this.Xl=H.VM(new H.A8(this.hL,new K.Hv()),[null,null]).br(0)},
+"^":"Ay0;hL<,KL,fT,tj,Gl,k6",
+Qh:function(a){this.Gl=H.VM(new H.A8(this.hL,new K.Hv()),[null,null]).br(0)},
 RR:function(a,b){return b.Zh(this)},
 $asAy0:function(){return[U.c0]},
 $isc0:true,
 $isIp:true},
 Hv:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gXl()},"$1",null,2,0,null,93,"call"],
+$1:[function(a){return a.gGl()},"$1",null,2,0,null,95,"call"],
 $isEH:true},
 ev:{
-"^":"Ay0;Rl>,KL,bO,tj,Xl,k6",
-Qh:function(a){this.Xl=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Kv())},
+"^":"Ay0;Rl>,KL,fT,tj,Gl,k6",
+Qh:function(a){this.Gl=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Kv())},
 RR:function(a,b){return b.o0(this)},
 $asAy0:function(){return[U.Mm]},
 $isMm:true,
 $isIp:true},
 Kv:{
 "^":"TpZ:79;",
-$2:function(a,b){J.kW(a,J.A6(b).gXl(),b.gv4().gXl())
+$2:function(a,b){J.kW(a,J.Kt(b).gGl(),b.gv4().gGl())
 return a},
 $isEH:true},
 EL:{
-"^":"Ay0;G3>,v4<,KL,bO,tj,Xl,k6",
-RR:function(a,b){return b.YV(this)},
+"^":"Ay0;G3>,v4<,KL,fT,tj,Gl,k6",
+RR:function(a,b){return b.EZ(this)},
 $asAy0:function(){return[U.ae]},
 $isae:true,
 $isIp:true},
 ek:{
-"^":"Ay0;KL,bO,tj,Xl,k6",
+"^":"Ay0;KL,fT,tj,Gl,k6",
 gP:function(a){var z=this.KL
 return z.gP(z)},
 Qh:function(a){var z,y,x,w
 z=this.KL
 y=J.U6(a)
-this.Xl=y.t(a,z.gP(z))
+this.Gl=y.t(a,z.gP(z))
 if(!a.AC(z.gP(z)))return
 x=y.gk8(a)
 y=J.x(x)
@@ -15691,46 +15884,46 @@
 w=$.Mg().Nz.t(0,z)
 this.tj=y.gqh(x).yI(new K.V8(this,a,w))},
 RR:function(a,b){return b.qs(this)},
-$asAy0:function(){return[U.fp]},
-$isfp:true,
+$asAy0:function(){return[U.elO]},
+$iselO:true,
 $isIp:true},
 V8:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.GC(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,182,"call"],
+$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
 GC:{
 "^":"TpZ:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 mv:{
-"^":"Ay0;wz<,KL,bO,tj,Xl,k6",
+"^":"Ay0;wz<,KL,fT,tj,Gl,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
 Qh:function(a){var z,y
 z=this.KL
 y=$.EU().t(0,z.gkp(z))
-if(J.xC(z.gkp(z),"!")){z=this.wz.gXl()
-this.Xl=y.$1(z==null?!1:z)}else{z=this.wz
-this.Xl=z.gXl()==null?null:y.$1(z.gXl())}},
+if(J.xC(z.gkp(z),"!")){z=this.wz.gGl()
+this.Gl=y.$1(z==null?!1:z)}else{z=this.wz
+this.Gl=z.gGl()==null?null:y.$1(z.gGl())}},
 RR:function(a,b){return b.xN(this)},
 $asAy0:function(){return[U.cJ]},
 $iscJ:true,
 $isIp:true},
-UW:{
-"^":"Ay0;Bb>,T8>,KL,bO,tj,Xl,k6",
+kyp:{
+"^":"Ay0;Bb>,T8>,KL,fT,tj,Gl,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
 Qh:function(a){var z,y,x
 z=this.KL
-y=$.YP().t(0,z.gkp(z))
-if(J.xC(z.gkp(z),"&&")||J.xC(z.gkp(z),"||")){z=this.Bb.gXl()
+y=$.Xa().t(0,z.gkp(z))
+if(J.xC(z.gkp(z),"&&")||J.xC(z.gkp(z),"||")){z=this.Bb.gGl()
 if(z==null)z=!1
-x=this.T8.gXl()
-this.Xl=y.$2(z,x==null?!1:x)}else if(J.xC(z.gkp(z),"==")||J.xC(z.gkp(z),"!="))this.Xl=y.$2(this.Bb.gXl(),this.T8.gXl())
+x=this.T8.gGl()
+this.Gl=y.$2(z,x==null?!1:x)}else if(J.xC(z.gkp(z),"==")||J.xC(z.gkp(z),"!="))this.Gl=y.$2(this.Bb.gGl(),this.T8.gGl())
 else{x=this.Bb
-if(x.gXl()==null||this.T8.gXl()==null)this.Xl=null
-else{if(J.xC(z.gkp(z),"|")&&!!J.x(x.gXl()).$iswn)this.tj=H.Go(x.gXl(),"$iswn").gQV().yI(new K.P8(this,a))
-this.Xl=y.$2(x.gXl(),this.T8.gXl())}}},
+if(x.gGl()==null||this.T8.gGl()==null)this.Gl=null
+else{if(J.xC(z.gkp(z),"|")&&!!J.x(x.gGl()).$iswn)this.tj=H.Go(x.gGl(),"$iswn").gQV().yI(new K.P8(this,a))
+this.Gl=y.$2(x.gGl(),this.T8.gGl())}}},
 RR:function(a,b){return b.ex(this)},
 $asAy0:function(){return[U.uku]},
 $isuku:true,
@@ -15740,46 +15933,46 @@
 $1:[function(a){return this.a.ub(this.b)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 WW:{
-"^":"Ay0;dc<,Sl<,ru<,KL,bO,tj,Xl,k6",
-Qh:function(a){var z=this.dc.gXl()
-this.Xl=(z==null?!1:z)===!0?this.Sl.gXl():this.ru.gXl()},
-RR:function(a,b){return b.RD(this)},
+"^":"Ay0;dc<,Sl<,ru<,KL,fT,tj,Gl,k6",
+Qh:function(a){var z=this.dc.gGl()
+this.Gl=(z==null?!1:z)===!0?this.Sl.gGl():this.ru.gGl()},
+RR:function(a,b){return b.RN(this)},
 $asAy0:function(){return[U.Dc]},
 $isDc:true,
 $isIp:true},
 vl:{
-"^":"Ay0;Tf<,KL,bO,tj,Xl,k6",
+"^":"Ay0;Tf<,KL,fT,tj,Gl,k6",
 goc:function(a){var z=this.KL
 return z.goc(z)},
 Qh:function(a){var z,y,x
-z=this.Tf.gXl()
-if(z==null){this.Xl=null
+z=this.Tf.gGl()
+if(z==null){this.Gl=null
 return}y=this.KL
 y=y.goc(y)
 x=$.Mg().Nz.t(0,y)
-this.Xl=$.cp().jD(z,x)
+this.Gl=$.cp().jD(z,x)
 y=J.x(z)
 if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.fk(this,a,x))},
-RR:function(a,b){return b.fV(this)},
+RR:function(a,b){return b.T7(this)},
 $asAy0:function(){return[U.rX]},
 $isrX:true,
 $isIp:true},
 fk:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.WKb(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,182,"call"],
+$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
 WKb:{
 "^":"TpZ:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 iT:{
-"^":"Ay0;Tf<,Jn<,KL,bO,tj,Xl,k6",
+"^":"Ay0;Tf<,Jn<,KL,fT,tj,Gl,k6",
 Qh:function(a){var z,y,x
-z=this.Tf.gXl()
-if(z==null){this.Xl=null
-return}y=this.Jn.gXl()
+z=this.Tf.gGl()
+if(z==null){this.Gl=null
+return}y=this.Jn.gGl()
 x=J.U6(z)
-this.Xl=x.t(z,y)
+this.Gl=x.t(z,y)
 if(!!x.$iswn)this.tj=z.gQV().yI(new K.tE(this,a,y))
 else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.z5(this,a,y))},
 RR:function(a,b){return b.CU(this)},
@@ -15788,7 +15981,7 @@
 $isIp:true},
 tE:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.Ku(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,182,"call"],
+$1:[function(a){if(J.VA(a,new K.Ku(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
 Ku:{
 "^":"TpZ:12;d",
@@ -15796,40 +15989,40 @@
 $isEH:true},
 z5:{
 "^":"TpZ:12;e,f,UI",
-$1:[function(a){if(J.nE1(a,new K.ey(this.UI))===!0)this.e.ub(this.f)},"$1",null,2,0,null,182,"call"],
+$1:[function(a){if(J.VA(a,new K.ey(this.UI))===!0)this.e.ub(this.f)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
 ey:{
 "^":"TpZ:12;bK",
 $1:[function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 c3:{
-"^":"Ay0;Tf<,re<,KL,bO,tj,Xl,k6",
+"^":"Ay0;Tf<,re<,KL,fT,tj,Gl,k6",
 gSf:function(a){var z=this.KL
 return z.gSf(z)},
 Qh:function(a){var z,y,x,w
 z=this.re
 z.toString
 y=H.VM(new H.A8(z,new K.vQ()),[null,null]).br(0)
-x=this.Tf.gXl()
-if(x==null){this.Xl=null
+x=this.Tf.gGl()
+if(x==null){this.Gl=null
 return}z=this.KL
 if(z.gSf(z)==null){z=H.eC(x,y,P.Te(null))
-this.Xl=!!J.x(z).$iswS?B.pe(z,null):z}else{z=z.gSf(z)
+this.Gl=!!J.x(z).$iswS?B.pe(z,null):z}else{z=z.gSf(z)
 w=$.Mg().Nz.t(0,z)
-this.Xl=$.cp().Ck(x,w,y,!1,null)
+this.Gl=$.cp().Ck(x,w,y,!1,null)
 z=J.x(x)
-if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.Sr(this,a,w))}},
+if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.Xh(this,a,w))}},
 RR:function(a,b){return b.Y7(this)},
 $asAy0:function(){return[U.Nb]},
 $isNb:true,
 $isIp:true},
 vQ:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gXl()},"$1",null,2,0,null,49,"call"],
+$1:[function(a){return a.gGl()},"$1",null,2,0,null,49,"call"],
 $isEH:true},
-Sr:{
-"^":"TpZ:190;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.ho(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,182,"call"],
+Xh:{
+"^":"TpZ:193;a,b,c",
+$1:[function(a){if(J.VA(a,new K.ho(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
 ho:{
 "^":"TpZ:12;d",
@@ -15838,7 +16031,7 @@
 B03:{
 "^":"a;G1>",
 bu:[function(a){return"EvalException: "+this.G1},"$0","gAY",0,0,71],
-static:{xn:function(a){return new K.B03(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
+static:{xn:function(a){return new K.B03(a)}}}}],["","",,U,{
 "^":"",
 Pu:function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
@@ -15860,7 +16053,7 @@
 return 536870911&a+((16383&a)<<15>>>0)},
 Fs:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,191,2,49]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,194,2,49]},
 Ip:{
 "^":"a;",
 $isIp:true},
@@ -15868,17 +16061,17 @@
 "^":"Ip;",
 RR:function(a,b){return b.W9(this)},
 $isWH:true},
-no:{
+noG:{
 "^":"Ip;P>",
 RR:function(a,b){return b.tx(this)},
 bu:[function(a){var z=this.P
 return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
-z=H.RB(b,"$isno",[H.Oq(this,0)],"$asno")
+z=H.RB(b,"$isnoG",[H.u3(this,0)],"$asnoG")
 return z&&J.xC(J.Vm(b),this.P)},
 giO:function(a){return J.v1(this.P)},
-$isno:true},
+$isnoG:true},
 c0:{
 "^":"Ip;hL<",
 RR:function(a,b){return b.Zh(this)},
@@ -15899,7 +16092,7 @@
 $isMm:true},
 ae:{
 "^":"Ip;G3>,v4<",
-RR:function(a,b){return b.YV(this)},
+RR:function(a,b){return b.EZ(this)},
 bu:[function(a){return this.G3.bu(0)+": "+H.d(this.v4)},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
@@ -15918,16 +16111,16 @@
 return!!J.x(b).$isXC&&J.xC(b.wz,this.wz)},
 giO:function(a){return J.v1(this.wz)},
 $isXC:true},
-fp:{
+elO:{
 "^":"Ip;P>",
 RR:function(a,b){return b.qs(this)},
 bu:[function(a){return this.P},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isfp&&J.xC(z.gP(b),this.P)},
+return!!z.$iselO&&J.xC(z.gP(b),this.P)},
 giO:function(a){return J.v1(this.P)},
-$isfp:true},
+$iselO:true},
 cJ:{
 "^":"Ip;kp>,wz<",
 RR:function(a,b){return b.xN(this)},
@@ -15957,7 +16150,7 @@
 $isuku:true},
 Dc:{
 "^":"Ip;dc<,Sl<,ru<",
-RR:function(a,b){return b.RD(this)},
+RR:function(a,b){return b.RN(this)},
 bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.ru)+")"},"$0","gAY",0,0,71],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isDc&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gru(),this.ru)},
@@ -15969,7 +16162,7 @@
 $isDc:true},
 X7S:{
 "^":"Ip;Bb>,T8>",
-RR:function(a,b){return b.e5(this)},
+RR:function(a,b){return b.ky(this)},
 gxG:function(){var z=this.Bb
 return z.gP(z)},
 gkZ:function(a){return this.T8},
@@ -15982,10 +16175,10 @@
 y=J.v1(this.T8)
 return U.Le(U.C0C(U.C0C(0,z),y))},
 $isX7S:true,
-$isb4:true},
+$isDI:true},
 px:{
 "^":"Ip;Bb>,T8>",
-RR:function(a,b){return b.xt(this)},
+RR:function(a,b){return b.Vw(this)},
 gxG:function(){var z=this.T8
 return z.gP(z)},
 gkZ:function(a){return this.Bb},
@@ -15998,7 +16191,7 @@
 y=y.giO(y)
 return U.Le(U.C0C(U.C0C(0,z),y))},
 $ispx:true,
-$isb4:true},
+$isDI:true},
 zX:{
 "^":"Ip;Tf<,Jn<",
 RR:function(a,b){return b.CU(this)},
@@ -16012,7 +16205,7 @@
 $iszX:true},
 rX:{
 "^":"Ip;Tf<,oc>",
-RR:function(a,b){return b.fV(this)},
+RR:function(a,b){return b.T7(this)},
 bu:[function(a){return H.d(this.Tf)+"."+H.d(this.oc)},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
@@ -16040,67 +16233,67 @@
 lc:{
 "^":"TpZ:79;",
 $2:function(a,b){return U.C0C(a,J.v1(b))},
-$isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
+$isEH:true}}],["","",,T,{
 "^":"",
 FX:{
-"^":"a;rp,Yf,jQ,vi",
-gQi:function(){return this.vi.lo},
+"^":"a;r3,Yf,jQ,R3",
+gQi:function(){return this.R3.lo},
 lx:function(a,b){var z
-if(a!=null){z=this.vi.lo
+if(a!=null){z=this.R3.lo
 z=z==null||!J.xC(J.Iz(z),a)}else z=!1
-if(!z)if(b!=null){z=this.vi.lo
+if(!z)if(b!=null){z=this.R3.lo
 z=z==null||!J.xC(J.Vm(z),b)}else z=!1
 else z=!0
 if(z)throw H.b(Y.RV("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gQi())))
-this.vi.G()},
+this.R3.G()},
 Bp:function(){return this.lx(null,null)},
 GI:function(a){return this.lx(a,null)},
-Te:function(){if(this.vi.lo==null){this.rp.toString
-return C.OL}var z=this.Yq()
+Te:function(){if(this.R3.lo==null){this.r3.toString
+return C.x4}var z=this.ia()
 return z==null?null:this.mi(z,0)},
 mi:function(a,b){var z,y,x,w,v,u
-for(;z=this.vi.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.vi.lo),"(")){y=this.rD()
-this.rp.toString
-a=new U.Nb(a,null,y)}else if(J.xC(J.Vm(this.vi.lo),"[")){x=this.Ew()
-this.rp.toString
+for(;z=this.R3.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.R3.lo),"(")){y=this.rD()
+this.r3.toString
+a=new U.Nb(a,null,y)}else if(J.xC(J.Vm(this.R3.lo),"[")){x=this.Ew()
+this.r3.toString
 a=new U.zX(a,x)}else break
-else if(J.xC(J.Iz(this.vi.lo),3)){this.Bp()
-a=this.j6(a,this.Yq())}else if(J.xC(J.Iz(this.vi.lo),10))if(J.xC(J.Vm(this.vi.lo),"in")){if(!J.x(a).$isfp)H.vh(Y.RV("in... statements must start with an identifier"))
+else if(J.xC(J.Iz(this.R3.lo),3)){this.Bp()
+a=this.F0(a,this.ia())}else if(J.xC(J.Iz(this.R3.lo),10))if(J.xC(J.Vm(this.R3.lo),"in")){if(!J.x(a).$iselO)H.vh(Y.RV("in... statements must start with an identifier"))
 this.Bp()
 w=this.Te()
-this.rp.toString
-a=new U.X7S(a,w)}else if(J.xC(J.Vm(this.vi.lo),"as")){this.Bp()
+this.r3.toString
+a=new U.X7S(a,w)}else if(J.xC(J.Vm(this.R3.lo),"as")){this.Bp()
 w=this.Te()
-if(!J.x(w).$isfp)H.vh(Y.RV("'as' statements must end with an identifier"))
-this.rp.toString
+if(!J.x(w).$iselO)H.vh(Y.RV("'as' statements must end with an identifier"))
+this.r3.toString
 a=new U.px(a,w)}else break
-else{if(J.xC(J.Iz(this.vi.lo),8)){z=this.vi.lo.gnS()
+else{if(J.xC(J.Iz(this.R3.lo),8)){z=this.R3.lo.gnS()
 if(typeof z!=="number")return z.F()
 if(typeof b!=="number")return H.s(b)
 z=z>=b}else z=!1
-if(z)if(J.xC(J.Vm(this.vi.lo),"?")){this.lx(8,"?")
+if(z)if(J.xC(J.Vm(this.R3.lo),"?")){this.lx(8,"?")
 v=this.Te()
 this.GI(5)
 u=this.Te()
-this.rp.toString
+this.r3.toString
 a=new U.Dc(a,v,u)}else a=this.T1(a)
 else break}return a},
-j6:function(a,b){var z,y
+F0:function(a,b){var z,y
 z=J.x(b)
-if(!!z.$isfp){z=z.gP(b)
-this.rp.toString
-return new U.rX(a,z)}else if(!!z.$isNb&&!!J.x(b.gTf()).$isfp){z=J.Vm(b.gTf())
+if(!!z.$iselO){z=z.gP(b)
+this.r3.toString
+return new U.rX(a,z)}else if(!!z.$isNb&&!!J.x(b.gTf()).$iselO){z=J.Vm(b.gTf())
 y=b.gre()
-this.rp.toString
+this.r3.toString
 return new U.Nb(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
 T1:function(a){var z,y,x,w,v
-z=this.vi.lo
+z=this.R3.lo
 y=J.RE(z)
 if(!C.Nm.tg(C.fW,y.gP(z)))throw H.b(Y.RV("unknown operator: "+H.d(y.gP(z))))
 this.Bp()
-x=this.Yq()
-while(!0){w=this.vi.lo
-if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.vi.lo),3)||J.xC(J.Iz(this.vi.lo),9)){w=this.vi.lo.gnS()
+x=this.ia()
+while(!0){w=this.R3.lo
+if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.R3.lo),3)||J.xC(J.Iz(this.R3.lo),9)){w=this.R3.lo.gnS()
 v=z.gnS()
 if(typeof w!=="number")return w.D()
 if(typeof v!=="number")return H.s(v)
@@ -16108,121 +16301,121 @@
 w=v}else w=!1
 else w=!1
 if(!w)break
-x=this.mi(x,this.vi.lo.gnS())}y=y.gP(z)
-this.rp.toString
+x=this.mi(x,this.R3.lo.gnS())}y=y.gP(z)
+this.r3.toString
 return new U.uku(y,a,x)},
-Yq:function(){var z,y,x,w
-if(J.xC(J.Iz(this.vi.lo),8)){z=J.Vm(this.vi.lo)
+ia:function(){var z,y,x,w
+if(J.xC(J.Iz(this.R3.lo),8)){z=J.Vm(this.R3.lo)
 y=J.x(z)
 if(y.n(z,"+")||y.n(z,"-")){this.Bp()
-if(J.xC(J.Iz(this.vi.lo),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.vi.lo)),null,null)
-this.rp.toString
-z=new U.no(y)
+if(J.xC(J.Iz(this.R3.lo),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.R3.lo)),null,null)
+this.r3.toString
+z=new U.noG(y)
 z.$builtinTypeInfo=[null]
 this.Bp()
-return z}else{y=this.rp
-if(J.xC(J.Iz(this.vi.lo),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.vi.lo)),null)
+return z}else{y=this.r3
+if(J.xC(J.Iz(this.R3.lo),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.R3.lo)),null)
 y.toString
-z=new U.no(x)
+z=new U.noG(x)
 z.$builtinTypeInfo=[null]
 this.Bp()
 return z}else{w=this.mi(this.fq(),11)
 y.toString
 return new U.cJ(z,w)}}}else if(y.n(z,"!")){this.Bp()
 w=this.mi(this.fq(),11)
-this.rp.toString
+this.r3.toString
 return new U.cJ(z,w)}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.fq()},
 fq:function(){var z,y
-switch(J.Iz(this.vi.lo)){case 10:z=J.Vm(this.vi.lo)
+switch(J.Iz(this.R3.lo)){case 10:z=J.Vm(this.R3.lo)
 if(J.xC(z,"this")){this.Bp()
-this.rp.toString
-return new U.fp("this")}else if(C.Nm.tg(C.jY,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
+this.r3.toString
+return new U.elO("this")}else if(C.Nm.tg(C.jY,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
 throw H.b(Y.RV("unrecognized keyword: "+H.d(z)))
 case 2:return this.qK()
 case 1:return this.ef()
-case 6:return this.DS()
+case 6:return this.PP()
 case 7:return this.xJ()
-case 9:if(J.xC(J.Vm(this.vi.lo),"(")){this.Bp()
+case 9:if(J.xC(J.Vm(this.R3.lo),"(")){this.Bp()
 y=this.Te()
 this.lx(9,")")
-this.rp.toString
-return new U.XC(y)}else if(J.xC(J.Vm(this.vi.lo),"{"))return this.pH()
-else if(J.xC(J.Vm(this.vi.lo),"["))return this.S9()
+this.r3.toString
+return new U.XC(y)}else if(J.xC(J.Vm(this.R3.lo),"{"))return this.pH()
+else if(J.xC(J.Vm(this.R3.lo),"["))return this.S9()
 return
 case 5:throw H.b(Y.RV("unexpected token \":\""))
 default:return}},
 S9:function(){var z,y
 z=[]
 do{this.Bp()
-if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"]"))break
+if(J.xC(J.Iz(this.R3.lo),9)&&J.xC(J.Vm(this.R3.lo),"]"))break
 z.push(this.Te())
-y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
+y=this.R3.lo}while(y!=null&&J.xC(J.Vm(y),","))
 this.lx(9,"]")
 return new U.c0(z)},
 pH:function(){var z,y,x
 z=[]
 do{this.Bp()
-if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"}"))break
-y=J.Vm(this.vi.lo)
-this.rp.toString
-x=new U.no(y)
+if(J.xC(J.Iz(this.R3.lo),9)&&J.xC(J.Vm(this.R3.lo),"}"))break
+y=J.Vm(this.R3.lo)
+this.r3.toString
+x=new U.noG(y)
 x.$builtinTypeInfo=[null]
 this.Bp()
 this.lx(5,":")
 z.push(new U.ae(x,this.Te()))
-y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
+y=this.R3.lo}while(y!=null&&J.xC(J.Vm(y),","))
 this.lx(9,"}")
 return new U.Mm(z)},
 qK:function(){var z,y,x
-if(J.xC(J.Vm(this.vi.lo),"true")){this.Bp()
-this.rp.toString
-return H.VM(new U.no(!0),[null])}if(J.xC(J.Vm(this.vi.lo),"false")){this.Bp()
-this.rp.toString
-return H.VM(new U.no(!1),[null])}if(J.xC(J.Vm(this.vi.lo),"null")){this.Bp()
-this.rp.toString
-return H.VM(new U.no(null),[null])}if(!J.xC(J.Iz(this.vi.lo),2))H.vh(Y.RV("expected identifier: "+H.d(this.gQi())+".value"))
-z=J.Vm(this.vi.lo)
+if(J.xC(J.Vm(this.R3.lo),"true")){this.Bp()
+this.r3.toString
+return H.VM(new U.noG(!0),[null])}if(J.xC(J.Vm(this.R3.lo),"false")){this.Bp()
+this.r3.toString
+return H.VM(new U.noG(!1),[null])}if(J.xC(J.Vm(this.R3.lo),"null")){this.Bp()
+this.r3.toString
+return H.VM(new U.noG(null),[null])}if(!J.xC(J.Iz(this.R3.lo),2))H.vh(Y.RV("expected identifier: "+H.d(this.gQi())+".value"))
+z=J.Vm(this.R3.lo)
 this.Bp()
-this.rp.toString
-y=new U.fp(z)
+this.r3.toString
+y=new U.elO(z)
 x=this.rD()
 if(x==null)return y
 else return new U.Nb(y,null,x)},
 rD:function(){var z,y
-z=this.vi.lo
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"(")){y=[]
+z=this.R3.lo
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.R3.lo),"(")){y=[]
 do{this.Bp()
-if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),")"))break
+if(J.xC(J.Iz(this.R3.lo),9)&&J.xC(J.Vm(this.R3.lo),")"))break
 y.push(this.Te())
-z=this.vi.lo}while(z!=null&&J.xC(J.Vm(z),","))
+z=this.R3.lo}while(z!=null&&J.xC(J.Vm(z),","))
 this.lx(9,")")
 return y}return},
 Ew:function(){var z,y
-z=this.vi.lo
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"[")){this.Bp()
+z=this.R3.lo
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.R3.lo),"[")){this.Bp()
 y=this.Te()
 this.lx(9,"]")
 return y}return},
 ef:function(){var z,y
-z=J.Vm(this.vi.lo)
-this.rp.toString
-y=H.VM(new U.no(z),[null])
+z=J.Vm(this.R3.lo)
+this.r3.toString
+y=H.VM(new U.noG(z),[null])
 this.Bp()
 return y},
-Bu:function(a){var z,y
-z=H.BU(H.d(a)+H.d(J.Vm(this.vi.lo)),null,null)
-this.rp.toString
-y=H.VM(new U.no(z),[null])
+Nt:function(a){var z,y
+z=H.BU(H.d(a)+H.d(J.Vm(this.R3.lo)),null,null)
+this.r3.toString
+y=H.VM(new U.noG(z),[null])
 this.Bp()
 return y},
-DS:function(){return this.Bu("")},
-u3:function(a){var z,y
-z=H.RR(H.d(a)+H.d(J.Vm(this.vi.lo)),null)
-this.rp.toString
-y=H.VM(new U.no(z),[null])
+PP:function(){return this.Nt("")},
+rR:function(a){var z,y
+z=H.RR(H.d(a)+H.d(J.Vm(this.R3.lo)),null)
+this.r3.toString
+y=H.VM(new U.noG(z),[null])
 this.Bp()
 return y},
-xJ:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+xJ:function(){return this.rR("")}}}],["","",,K,{
 "^":"",
 eq:[function(a){return H.VM(new K.Bt(a),[null])},"$1","BQ",2,0,68,69],
 Aep:{
@@ -16254,7 +16447,7 @@
 if(z.G()){this.CD=H.VM(new K.Aep(this.wX++,z.gl()),[null])
 return!0}this.CD=null
 return!1},
-$asAnv:function(a){return[[K.Aep,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+$asAnv:function(a){return[[K.Aep,a]]}}}],["","",,Y,{
 "^":"",
 wX:function(a){switch(a){case 102:return 12
 case 110:return 10
@@ -16267,7 +16460,7 @@
 bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"$0","gAY",0,0,71],
 $isqS:true},
 xv:{
-"^":"a;MV,H4,jI,x0",
+"^":"a;MV,zy,jI,x0",
 zl:function(){var z,y,x,w,v,u,t,s
 z=this.jI
 this.x0=z.G()?z.Wn:null
@@ -16303,7 +16496,7 @@
 y=this.jI
 x=y.G()?y.Wn:null
 this.x0=x
-for(w=this.H4;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
+for(w=this.zy;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
 if(x===92){x=y.G()?y.Wn:null
 this.x0=x
 if(x==null)throw H.b(Y.RV("unterminated string"))
@@ -16315,7 +16508,7 @@
 this.x0=y.G()?y.Wn:null},
 zI:function(){var z,y,x,w,v
 z=this.jI
-y=this.H4
+y=this.zy
 while(!0){x=this.x0
 if(x!=null){if(typeof x!=="number")return H.s(x)
 if(!(97<=x&&x<=122))if(!(65<=x&&x<=90))w=48<=x&&x<=57||x===95||x===36||x>127
@@ -16331,7 +16524,7 @@
 y.vM=""},
 jj:function(){var z,y,x,w
 z=this.jI
-y=this.H4
+y=this.zy
 while(!0){x=this.x0
 if(x!=null){if(typeof x!=="number")return H.s(x)
 w=48<=x&&x<=57}else w=!1
@@ -16345,7 +16538,7 @@
 else this.MV.push(new Y.qS(3,".",11))}else{this.MV.push(new Y.qS(6,y.vM,0))
 y.vM=""}},
 qv:function(){var z,y,x,w
-z=this.H4
+z=this.zy
 z.KF(H.mx(46))
 y=this.jI
 while(!0){x=this.x0
@@ -16356,37 +16549,37 @@
 z.vM+=x
 this.x0=y.G()?y.Wn:null}this.MV.push(new Y.qS(7,z.vM,0))
 z.vM=""}},
-hA:{
+hAN:{
 "^":"a;G1>",
 bu:[function(a){return"ParseException: "+this.G1},"$0","gAY",0,0,71],
-static:{RV:function(a){return new Y.hA(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
+static:{RV:function(a){return new Y.hAN(a)}}}}],["","",,S,{
 "^":"",
-P55:{
+lW:{
 "^":"a;",
-DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,192,154]},
+DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,195,157]},
 cfS:{
-"^":"P55;",
+"^":"lW;",
 xn:function(a){},
 W9:function(a){this.xn(a)},
 LT:function(a){a.wz.RR(0,this)
 this.xn(a)},
-fV:function(a){J.okV(a.gTf(),this)
+T7:function(a){J.okV(a.gTf(),this)
 this.xn(a)},
 CU:function(a){J.okV(a.gTf(),this)
 J.okV(a.gJn(),this)
 this.xn(a)},
 Y7:function(a){var z
 J.okV(a.gTf(),this)
-if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.okV(z.lo,this)
+if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
 tx:function(a){this.xn(a)},
 Zh:function(a){var z
-for(z=a.ghL(),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.okV(z.lo,this)
+for(z=a.ghL(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
 o0:function(a){var z
-for(z=a.gRl(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.okV(z.lo,this)
+for(z=a.gRl(a),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
-YV:function(a){J.okV(a.gG3(a),this)
+EZ:function(a){J.okV(a.gG3(a),this)
 J.okV(a.gv4(),this)
 this.xn(a)},
 qs:function(a){this.xn(a)},
@@ -16395,21 +16588,21 @@
 this.xn(a)},
 xN:function(a){J.okV(a.gwz(),this)
 this.xn(a)},
-RD:function(a){J.okV(a.gdc(),this)
+RN:function(a){J.okV(a.gdc(),this)
 J.okV(a.gSl(),this)
 J.okV(a.gru(),this)
 this.xn(a)},
-e5:function(a){a.Bb.RR(0,this)
+ky:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
 this.xn(a)},
-xt:function(a){a.Bb.RR(0,this)
+Vw:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
-this.xn(a)}}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
+this.xn(a)}}}],["","",,T,{
 "^":"",
 ov:{
-"^":"V45;oX,t7,fI,Fd,cI,He,xo,ZJ,Kf,nu,Oq,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
-gIs:function(a){return a.oX},
-sIs:function(a,b){a.oX=this.ct(a,C.PX,a.oX,b)},
+"^":"V44;Ny,t7,fI,Fd,cI,He,xo,ZJ,PZ,Kf,nu,Oq,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
+gIs:function(a){return a.Ny},
+sIs:function(a,b){a.Ny=this.ct(a,C.PX,a.Ny,b)},
 gfg:function(a){return a.t7},
 sfg:function(a,b){a.t7=this.ct(a,C.A7,a.t7,b)},
 gGV:function(a){return a.fI},
@@ -16424,14 +16617,17 @@
 sxT:function(a,b){a.xo=this.ct(a,C.nt,a.xo,b)},
 giZ:function(a){return a.ZJ},
 siZ:function(a,b){a.ZJ=this.ct(a,C.vs,a.ZJ,b)},
+gTj:function(a){return a.PZ},
+sTj:function(a,b){a.PZ=this.ct(a,C.uG,a.PZ,b)},
 gGd:function(a){return a.Kf},
 sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
 Nn:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,14,43],
-mJ5:[function(a,b,c){var z,y
+SQ:function(a){var z,y
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#line-"+H.d(a.He))
 if(z!=null){y=!!z.scrollIntoViewIfNeeded
 if(y)z.scrollIntoViewIfNeeded()
-else z.scrollIntoView()}},"$2","gFG",4,0,193,194,195],
+else z.scrollIntoView()}},
+Un:[function(a,b,c){this.SQ(a)},"$2","gFG",4,0,196,197,198],
 Es:function(a){var z,y
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector(".sourceTable")
@@ -16441,54 +16637,98 @@
 dQ:function(a){var z=a.nu
 if(z!=null){z.disconnect()
 a.nu=null}Z.uL.prototype.dQ.call(this,a)},
-GA:[function(a,b){this.mC(a)},"$1","goL",2,0,19,59],
-Yo:[function(a,b){this.mC(a)},"$1","gie",2,0,19,59],
+NQ:[function(a,b){this.mC(a)
+this.SQ(a)},"$1","goL",2,0,19,59],
+KC:[function(a,b){this.mC(a)},"$1","gie",2,0,19,59],
 Ti:[function(a,b){this.mC(a)},"$1","gRq",2,0,19,59],
 ok:[function(a,b){this.mC(a)},"$1","gcY",2,0,19,59],
 mC:function(a){var z,y,x
+a.PZ=this.ct(a,C.uG,a.PZ,!1)
 if(a.Oq!=null)return
-z=a.oX
+z=a.Ny
 if(z==null)return
-if(J.iS(z)!==!0){a.Oq=J.SK(a.oX).ml(new T.Es(a))
+if(J.iS(z)!==!0){a.Oq=J.SK(a.Ny).ml(new T.Es(a))
 return}z=a.Fd
-z=z!=null?a.oX.q6(z):1
+z=z!=null?a.Ny.q6(z):1
 a.xo=this.ct(a,C.nt,a.xo,z)
 z=a.fI
-z=z!=null?a.oX.q6(z):null
+z=z!=null?a.Ny.q6(z):null
 a.He=this.ct(a,C.kI,a.He,z)
 z=a.cI
-y=a.oX
+y=a.Ny
 z=z!=null?y.q6(z):J.q8(J.de(y))
 a.ZJ=this.ct(a,C.vs,a.ZJ,z)
 J.Z8(a.Kf)
-for(x=J.Hn(a.xo,1);z=J.Wx(x),z.E(x,J.Hn(a.ZJ,1));x=z.g(x,1))J.bi(a.Kf,J.UQ(J.de(a.oX),x))},
+for(x=J.Hn(a.xo,1);z=J.Wx(x),z.E(x,J.Hn(a.ZJ,1));x=z.g(x,1))J.bi(a.Kf,J.UQ(J.de(a.Ny),x))
+a.PZ=this.ct(a,C.uG,a.PZ,!0)},
 static:{T5i:function(a){var z,y,x
 z=R.tB([])
 y=P.L5(null,null,null,P.qU,W.I0)
 x=P.qU
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
 a.t7=null
+a.PZ=!1
 a.Kf=z
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=y
 a.ZQ=x
 C.za.ZL(a)
 C.za.XI(a)
 return a}}},
-V45:{
+V44:{
 "^":"uL+Pi;",
 $isd3:true},
 Es:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(J.iS(z.oX)===!0){z.Oq=null
+if(J.iS(z.Ny)===!0){z.Oq=null
 J.TG(z)}},"$1",null,2,0,null,13,"call"],
-$isEH:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
+$isEH:true},
+vr:{
+"^":"V45;X9,xt,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
+gRd:function(a){return a.X9},
+sRd:function(a,b){a.X9=this.ct(a,C.VI,a.X9,b)},
+gv8:function(a){return a.xt},
+sv8:function(a,b){a.xt=this.ct(a,C.S4,a.xt,b)},
+Wp:[function(a,b,c,d){var z,y
+z=a.xt
+if(z===!0)return
+a.xt=this.ct(a,C.S4,z,!0)
+z=a.X9.gqr()
+y=a.X9
+if(z==null)J.aT(J.zH(y)).G5(J.zH(a.X9),J.f2(a.X9)).ml(new T.eE(a))
+else J.aT(J.zH(y)).h4(a.X9.gqr()).ml(new T.b3(a))},"$3","gQP",6,0,82,49,50,83],
+static:{xA:function(a){var z,y
+z=P.L5(null,null,null,P.qU,W.I0)
+y=P.qU
+y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+a.xt=!1
+a.Cc=[]
+a.Ap=!1
+a.oG=!1
+a.ZM=z
+a.ZQ=y
+C.FC.ZL(a)
+C.FC.XI(a)
+return a}}},
+V45:{
+"^":"uL+Pi;",
+$isd3:true},
+eE:{
+"^":"TpZ:12;a",
+$1:[function(a){var z=this.a
+z.xt=J.Q5(z,C.S4,z.xt,!1)},"$1",null,2,0,null,13,"call"],
+$isEH:true},
+b3:{
+"^":"TpZ:12;b",
+$1:[function(a){var z=this.b
+z.xt=J.Q5(z,C.S4,z.xt,!1)},"$1",null,2,0,null,13,"call"],
+$isEH:true}}],["","",,A,{
 "^":"",
 kn:{
-"^":"oEY;jJ,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"oEY;jJ,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gBV:function(a){return a.jJ},
 sBV:function(a,b){a.jJ=this.ct(a,C.tW,a.jJ,b)},
 gJp:function(a){var z=a.tY
@@ -16515,7 +16755,7 @@
 a.jJ=-1
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -16524,10 +16764,10 @@
 return a}}},
 oEY:{
 "^":"xI+Pi;",
-$isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
+$isd3:true}}],["","",,U,{
 "^":"",
 fI:{
-"^":"V46;Uz,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V46;Uz,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gIs:function(a){return a.Uz},
 sIs:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
 Es:function(a){var z
@@ -16535,14 +16775,14 @@
 z=a.Uz
 if(z==null)return
 J.SK(z)},
-SK:[function(a,b){J.cI(a.Uz).YM(b)},"$1","gvC",2,0,19,98],
-j9:[function(a,b){J.eg(a.Uz).YM(b)},"$1","gDX",2,0,19,98],
+SK:[function(a,b){J.cI(a.Uz).YM(b)},"$1","gvC",2,0,19,100],
+Ur:[function(a,b){J.eg(a.Uz).YM(b)},"$1","gDX",2,0,19,100],
 static:{UF:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -16551,7 +16791,7 @@
 return a}}},
 V46:{
 "^":"uL+Pi;",
-$isd3:true}}],["service","package:observatory/service.dart",,D,{
+$isd3:true}}],["","",,D,{
 "^":"",
 Xm:[function(a,b){return J.FW(J.O6(a),J.O6(b))},"$2","E0",4,0,70],
 Nl:function(a,b){var z,y,x,w,v,u,t,s,r,q
@@ -16627,7 +16867,7 @@
 q.$builtinTypeInfo=[t]
 t=P.L5(null,null,null,P.qU,P.CP)
 t=R.tB(t)
-s=new D.bv(x,null,!1,!1,!0,!1,w,new D.tL(v,u,null,null,20,0),null,r,null,q,null,null,null,null,null,t,new D.eK(0,0,0,0,0,0,null,null),new D.eK(0,0,0,0,0,0,null,null),null,null,null,null,null,null,null,z,null,null,!1,null,null,null,null,null)
+s=new D.bv(x,null,!1,!1,!0,!1,w,new D.tL(v,u,null,null,20,0),null,r,null,q,null,null,null,null,null,t,new D.eK(0,0,0,0,0,0,null,null),new D.eK(0,0,0,0,0,0,null,null),null,null,null,null,null,null,null,null,null,z,null,null,!1,null,null,null,null,null)
 break
 case"Library":z=D.U4
 x=[]
@@ -16656,7 +16896,6 @@
 t.$builtinTypeInfo=[z]
 s=new D.U4(null,x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"Null":return
 case"ServiceError":s=new D.N7(null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"ServiceEvent":s=new D.Mk(null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
@@ -16676,6 +16915,8 @@
 z.$builtinTypeInfo=[null,null]
 s=new D.vO(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
 return s},
+UW:function(a){if(!!J.x(a).$isvO&&J.xC(a.mQ,"Null"))return
+return a},
 bF:function(a){var z
 if(a!=null){z=J.U6(a)
 z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
@@ -16686,7 +16927,7 @@
 else if(!!z.$iswn)D.f3(a,b)},
 Gf:function(a,b){a.aN(0,new D.Qf(a,b))},
 f3:function(a,b){var z,y,x,w,v,u
-for(z=a.ao,y=0;y<z.length;++y){x=z[y]
+for(z=a.XH,y=0;y<z.length;++y){x=z[y]
 w=J.x(x)
 v=!!w.$isqC
 if(v)u=w.t(x,"id")!=null&&w.t(x,"type")!=null
@@ -16727,10 +16968,10 @@
 if(w!=null&&!J.xC(w,z.t(a,"id")));this.r0=z.t(a,"id")
 this.mQ=x
 this.bF(0,a,y)},
-Mq:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gLc",2,0,163,196],
+Mq:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gua",2,0,166,199],
 $isaf:true},
 Bf:{
-"^":"TpZ:198;a",
+"^":"TpZ:201;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
@@ -16738,7 +16979,7 @@
 y=this.a
 if(!J.xC(z,y.mQ))return D.Nl(y.P3,a)
 y.eC(a)
-return y},"$1",null,2,0,null,197,"call"],
+return y},"$1",null,2,0,null,200,"call"],
 $isEH:true},
 n1:{
 "^":"TpZ:74;b",
@@ -16747,16 +16988,16 @@
 boh:{
 "^":"a;",
 O5:function(a){J.Me(a,new D.P5(this))},
-Ms:[function(a){return this.gwv(this).jU(this.Mq("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,199]},
+Ms:[function(a){return this.gwv(this).jU(this.Mq("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,202]},
 P5:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,200,"call"],
+z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,203,"call"],
 $isEH:true},
 Rv:{
-"^":"TpZ:198;a",
+"^":"TpZ:201;a",
 $1:[function(a){var z=this.a
-z.O5(D.Nl(J.xC(z.gzS(),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,197,"call"],
+z.O5(D.Nl(J.xC(z.gzS(),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,200,"call"],
 $isEH:true},
 xm:{
 "^":"af;"},
@@ -16767,12 +17008,12 @@
 giR:function(){var z=this.z7
 return z.gUQ(z)},
 gPj:function(a){return H.d(this.r0)},
-Mq:[function(a){return H.d(a)},"$1","gLc",2,0,163,196],
+Mq:[function(a){return H.d(a)},"$1","gua",2,0,166,199],
 gYe:function(a){return this.Ox},
 gJk:function(){return this.RW},
 gA3:function(){return this.Ts},
 gEy:function(){return this.Va},
-gU6:function(){return this.kU},
+gcD:function(){return this.kU},
 gPE:function(){return this.l7},
 EM:function(a){var z,y,x,w
 z={}
@@ -16834,7 +17075,7 @@
 y=z.t(b,"version")
 this.Ox=F.Wi(this,C.zn,this.Ox,y)
 y=z.t(b,"architecture")
-this.GY=F.Wi(this,C.ke,this.GY,y)
+this.GY=F.Wi(this,C.US,this.GY,y)
 y=z.t(b,"uptime")
 this.RW=F.Wi(this,C.mh,this.RW,y)
 y=P.Wu(H.BU(z.t(b,"date"),null,null),!1)
@@ -16872,12 +17113,12 @@
 z=D.Nl(a,this.a.a)
 y=this.b.Rk
 if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)},"$1",null,2,0,null,201,"call"],
+y.Iv(z)},"$1",null,2,0,null,204,"call"],
 $isEH:true},
 MZ:{
 "^":"TpZ:12;a,b",
 $1:[function(a){if(!J.x(a).$iswv)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,140,"call"],
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,144,"call"],
 $isEH:true},
 it:{
 "^":"TpZ:12;a,b",
@@ -16888,12 +17129,12 @@
 else return a.cv(z)},"$1",null,2,0,null,6,"call"],
 $isEH:true},
 lb:{
-"^":"TpZ:198;c,d",
+"^":"TpZ:201;c,d",
 $1:[function(a){var z,y
 z=this.c
 y=D.Nl(z,a)
 if(y.gUm())z.Qy.to(0,this.d,new D.QZ(y))
-return y},"$1",null,2,0,null,197,"call"],
+return y},"$1",null,2,0,null,200,"call"],
 $isEH:true},
 QZ:{
 "^":"TpZ:74;e",
@@ -16902,7 +17143,7 @@
 zA:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-return z.N7(z.ng(a))},"$1",null,2,0,null,144,"call"],
+return z.N7(z.ng(a))},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 tm:{
 "^":"TpZ:12;b",
@@ -16920,7 +17161,7 @@
 $1:[function(a){var z=this.c.Li
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,86,"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,88,"call"],
 $isEH:true},
 hc:{
 "^":"TpZ:12;",
@@ -16957,7 +17198,7 @@
 if(!(w<v))break
 u=z.t(b,w)
 if(w>=x)return H.e(y,w)
-y[w]=J.z8(y[w],u)?y[w]:u;++w}},
+y[w]=J.xZ(y[w],u)?y[w]:u;++w}},
 CJ:function(){var z,y,x
 for(z=this.XE,y=z.length,x=0;x<y;++x)z[x]=0},
 $isER:true},
@@ -17018,7 +17259,7 @@
 z=z.t(a,"avgCollectionPeriodMillis")
 this.hu=F.Wi(this,C.BE,this.hu,z)}},
 bv:{
-"^":"bvc;V3,Jr,EY,eU,yP,XV,Qy,GH,Wm,AI,v9,tW,zb,bN:KT@,GR:f5@,i9,cL,Y8,UY<,xQ<,vJ,yv,BC<,FF,bj,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+"^":"bvc;V3,Jr,EY,eU,yP,XV,Qy,GH,Wm,AI,v9,tW,zb,bN:KT@,GR:f5@,i9,cL,Y8,UY<,xQ<,ip,yv,BC<,I5,bj,iD<,QR,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gwv:function(a){return this.P3},
 god:function(a){return this},
 gXE:function(a){return this.V3},
@@ -17028,7 +17269,7 @@
 gA6:function(){return this.EY},
 gaj:function(){return this.eU},
 gMN:function(){return this.yP},
-Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gLc",2,0,163,196],
+Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gua",2,0,166,199],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
@@ -17046,12 +17287,12 @@
 for(z=J.mY(y);z.G();){w=z.gl()
 J.UQ(w,"code").Il(w,b,x)}},
 WR:function(){return this.cv("classes").ml(this.geL()).ml(this.gMh())},
-Dw:[function(a){var z,y,x,w
+ND:[function(a){var z,y,x,w
 z=[]
 for(y=J.mY(J.UQ(a,"members"));y.G();){x=y.gl()
 w=J.x(x)
-if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","geL",2,0,202,203],
-Nze:[function(a){var z,y,x,w
+if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","geL",2,0,205,206],
+OV:[function(a){var z,y,x,w
 z=this.AI
 z.V1(z)
 this.Wm=F.Wi(this,C.jo,this.Wm,null)
@@ -17060,7 +17301,7 @@
 if(J.xC(x.gTX(),"Object")&&J.xC(x.gi2(),!1)){w=this.Wm
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.jo,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gMh",2,0,204,205],
+this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gMh",2,0,207,208],
 Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -17101,6 +17342,7 @@
 if(c)return
 this.kT=!0
 this.yP=F.Wi(this,C.DY,this.yP,!1)
+this.Xb()
 x=z.t(b,"pauseEvent")
 if(x!=null){y=J.U6(x)
 if(J.xC(y.t(x,"type"),"DebuggerEvent"))y.u(x,"type","ServiceEvent")}D.kT(b,this)
@@ -17163,40 +17405,73 @@
 y.FV(0,z.t(b,"libraries"))
 y.GT(y,D.E0())},
 m7:function(){return this.P3.jU("/"+H.d(this.r0)+"/profile/tag").ml(new D.O5(this))},
-aU:function(a,b){this.FF=0
+aU:function(a,b){this.I5=0
 this.bj=a
 if(a==null)return
 if(J.u6(J.q8(a),3))return
-return this.AW(b)},
-AW:function(a){var z,y,x,w,v,u,t,s,r,q
+return this.tw(b)},
+tw:function(a){var z,y,x,w,v,u,t,s,r,q
 z=this.bj
-y=this.FF
+y=this.I5
 if(typeof y!=="number")return y.g()
-this.FF=y+1
+this.I5=y+1
 x=J.UQ(z,y)
 if(x>>>0!==x||x>=a.length)return H.e(a,x)
 w=a[x]
 y=this.bj
-z=this.FF
+z=this.I5
 if(typeof z!=="number")return z.g()
-this.FF=z+1
+this.I5=z+1
 v=J.UQ(y,z)
 z=[]
 z.$builtinTypeInfo=[D.D5]
 u=new D.D5(w,v,z,0)
 y=this.bj
-t=this.FF
+t=this.I5
 if(typeof t!=="number")return t.g()
-this.FF=t+1
+this.I5=t+1
 s=J.UQ(y,t)
 if(typeof s!=="number")return H.s(s)
 r=0
-for(;r<s;++r){q=this.AW(a)
+for(;r<s;++r){q=this.tw(a)
 z.push(q)
 y=u.Jv
 t=q.Av
 if(typeof t!=="number")return H.s(t)
 u.Jv=y+t}return u},
+pU:function(a){var z,y,x,w,v,u
+z=J.U6(a)
+y=J.UQ(z.t(a,"location"),"script")
+x=J.UQ(z.t(a,"location"),"tokenPos")
+z=J.RE(y)
+if(z.gox(y)===!0){w=y.q6(x)
+J.UQ(z.gGd(y),J.Hn(w,1)).sqr(a)}else{z=z.xW(y)
+z.toString
+v=$.X3
+u=new P.Gc(0,v,null,null,v.wY(new D.Ye(this,a)),null,P.VH(null,$.X3),null)
+u.$builtinTypeInfo=[null]
+z.au(u)}},
+CE:function(a){var z,y,x,w,v,u
+z=this.iD
+if(z!=null)for(z=J.mY(J.UQ(z,"breakpoints"));z.G();){y=z.gl()
+x=J.U6(y)
+w=J.UQ(x.t(y,"location"),"script")
+v=J.UQ(x.t(y,"location"),"tokenPos")
+x=J.RE(w)
+if(x.gox(w)===!0){u=w.q6(v)
+J.UQ(x.gGd(w),J.Hn(u,1)).sqr(null)}}for(z=J.mY(J.UQ(a,"breakpoints"));z.G();)this.pU(z.gl())
+this.iD=a},
+Xb:function(){var z=this.QR
+if(z==null){z=this.cv("debug/breakpoints").ml(new D.y4(this)).YM(new D.Cm(this))
+this.QR=z}return z},
+G5:function(a,b){return this.cv(J.ew(J.eS(a),"/setBreakpoint?line="+H.d(b))).ml(new D.fx(this,a,b))},
+h4:function(a){return this.cv(H.d(J.eS(a))+"/clear").ml(new D.fw(this,a))},
+yy:[function(a){return this.cv("debug/pause").ml(new D.ry(this))},"$0","gX0",0,0,202],
+QE:[function(a){return this.cv("debug/resume").ml(new D.LO(this))},"$0","gDQ",0,0,202],
+fV:[function(a){P.FL("isolate.stepInto")
+return this.cv("debug/resume?step=into").ml(new D.qD(this))},"$0","gLc",0,0,202],
+Fc:[function(a){return this.cv("debug/resume?step=over").ml(new D.A6(this))},"$0","gqF",0,0,202],
+h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.xK(this))},"$0","gVX",0,0,202],
 $isbv:true,
 static:{"^":"ZGx"}},
 PKX:{
@@ -17216,12 +17491,12 @@
 a.Oo.V1(0)}},
 $isEH:true},
 KQ:{
-"^":"TpZ:198;a,b",
+"^":"TpZ:201;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.Nl(z,a)
 if(y.gUm())z.Qy.to(0,this.b,new D.Ea(y))
-return y},"$1",null,2,0,null,197,"call"],
+return y},"$1",null,2,0,null,200,"call"],
 $isEH:true},
 Ea:{
 "^":"TpZ:74;c",
@@ -17230,16 +17505,67 @@
 Qq:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,206,"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,209,"call"],
 $isEH:true},
 O5:{
-"^":"TpZ:198;a",
+"^":"TpZ:201;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
 y=this.a.GH
 y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,157,"call"],
+return y},"$1",null,2,0,null,160,"call"],
+$isEH:true},
+Ye:{
+"^":"TpZ:12;a,b",
+$1:[function(a){this.a.pU(this.b)},"$1",null,2,0,null,13,"call"],
+$isEH:true},
+y4:{
+"^":"TpZ:12;a",
+$1:[function(a){this.a.CE(a)},"$1",null,2,0,null,210,"call"],
+$isEH:true},
+Cm:{
+"^":"TpZ:74;b",
+$0:[function(){this.b.QR=null},"$0",null,0,0,null,"call"],
+$isEH:true},
+fx:{
+"^":"TpZ:12;a,b,c",
+$1:[function(a){if(!!J.x(a).$ispD)J.UQ(J.de(this.b),J.Hn(this.c,1)).sj9(!1)
+return this.a.Xb()},"$1",null,2,0,null,144,"call"],
+$isEH:true},
+fw:{
+"^":"TpZ:12;a,b",
+$1:[function(a){var z,y
+if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+z=this.a
+y=z.Jr
+if(y!=null&&y.gQ1()!=null&&J.xC(J.UQ(z.Jr.gQ1(),"id"),J.UQ(this.b,"id")))return z.RE(0)
+else return z.Xb()},"$1",null,2,0,null,144,"call"],
+$isEH:true},
+ry:{
+"^":"TpZ:12;a",
+$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+return this.a.RE(0)},"$1",null,2,0,null,144,"call"],
+$isEH:true},
+LO:{
+"^":"TpZ:12;a",
+$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+return this.a.RE(0)},"$1",null,2,0,null,144,"call"],
+$isEH:true},
+qD:{
+"^":"TpZ:12;a",
+$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+return this.a.RE(0)},"$1",null,2,0,null,144,"call"],
+$isEH:true},
+A6:{
+"^":"TpZ:12;a",
+$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+return this.a.RE(0)},"$1",null,2,0,null,144,"call"],
+$isEH:true},
+xK:{
+"^":"TpZ:12;a",
+$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+return this.a.RE(0)},"$1",null,2,0,null,144,"call"],
 $isEH:true},
 vO:{
 "^":"af;RF,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
@@ -17276,12 +17602,12 @@
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 HC:[function(a){var z=this.RF
-return z.HC(z)},"$0","gDx",0,0,120],
+return z.HC(z)},"$0","gDx",0,0,123],
 nq:function(a,b){var z=this.RF
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
-k0:[function(a){return},"$0","gqw",0,0,17],
-Yd:[function(a){this.RF.AP=null
+Tr:[function(a){return},"$0","gqw",0,0,17],
+NB:[function(a){this.RF.AP=null
 return},"$0","gym",0,0,17],
 gqh:function(a){var z=this.RF
 return z.gqh(z)},
@@ -17317,7 +17643,8 @@
 z="DartError "+H.d(this.I0)
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
-this.GR=this.ct(this,C.Tc,this.GR,z)}},
+this.GR=this.ct(this,C.Tc,this.GR,z)},
+$ispD:true},
 wVq:{
 "^":"af+Pi;",
 $isd3:true},
@@ -17442,9 +17769,9 @@
 sWt:function(a,b){this.wf=F.Wi(this,C.yB,this.wf,b)},
 gfj:function(){return this.rT}},
 Iy:{
-"^":"a;bi<,l<",
+"^":"a;hb<,l<",
 eC:function(a){var z,y,x
-z=this.bi
+z=this.hb
 y=J.U6(a)
 x=y.t(a,6)
 z.wf=F.Wi(z,C.yB,z.wf,x)
@@ -17457,13 +17784,13 @@
 x.rT=F.Wi(x,C.hN,x.rT,y)},
 static:{"^":"jZx,xxx,qWF,SP7,S1O,wXu,WVi,JQ"}},
 dy:{
-"^":"cOr;Gz,ar,x8,Lh,vY,u0,J1,E8,qG,dN,yv,UY<,xQ<,ks>,S5<,tJ<,mu<,p2<,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+"^":"cOr;Gz,ar,kJ,Lh,vY,u0,J1,E8,qG,dN,yv,UY<,xQ<,ks>,S5<,tJ<,mu<,p2<,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gHt:function(a){return this.Gz},
 sHt:function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},
 gIs:function(a){return this.ar},
 sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-guj:function(){return this.x8},
-suj:function(a){this.x8=F.Wi(this,C.Cw,this.x8,a)},
+guj:function(){return this.kJ},
+suj:function(a){this.kJ=F.Wi(this,C.Cw,this.kJ,a)},
 gVM:function(){return this.Lh},
 gRs:function(){return this.vY},
 gi2:function(){return this.J1},
@@ -17473,13 +17800,13 @@
 sej:function(a){this.dN=F.Wi(this,C.Fe,this.dN,a)},
 gkc:function(a){return this.yv},
 skc:function(a,b){this.yv=F.Wi(this,C.yh,this.yv,b)},
-gJL:function(){var z,y
+gMp:function(){var z,y
 z=this.UY
-y=z.bi
+y=z.hb
 if(J.xC(y.wf,0)&&J.xC(y.rT,0)){z=z.l
 z=J.xC(z.wf,0)&&J.xC(z.rT,0)}else z=!1
 if(z){z=this.xQ
-y=z.bi
+y=z.hb
 if(J.xC(y.wf,0)&&J.xC(y.rT,0)){z=z.l
 z=J.xC(z.wf,0)&&J.xC(z.rT,0)}else z=!1}else z=!1
 return z},
@@ -17526,8 +17853,8 @@
 y.FV(0,z.t(b,"functions"))
 y.GT(y,D.E0())
 y=z.t(b,"super")
-y=F.Wi(this,C.Cw,this.x8,y)
-this.x8=y
+y=F.Wi(this,C.Cw,this.kJ,y)
+this.kJ=y
 if(y!=null)y.Ib(this)
 y=z.t(b,"error")
 this.yv=F.Wi(this,C.yh,this.yv,y)
@@ -17545,7 +17872,7 @@
 cOr:{
 "^":"ZzQ+Pi;",
 $isd3:true},
-Hk:{
+ma:{
 "^":"a;zt",
 bu:[function(a){return this.zt},"$0","gAY",0,0,74],
 Q2:function(){return C.Nm.tg([$.b1(),$.l3(),$.zx(),$.MQ()],this)},
@@ -17620,9 +17947,9 @@
 this.qG=F.Wi(this,C.z6,this.qG,y)
 y=z.t(b,"endTokenPos")
 this.dN=F.Wi(this,C.Fe,this.dN,y)
-y=z.t(b,"code")
+y=D.UW(z.t(b,"code"))
 this.TD=F.Wi(this,C.i4,this.TD,y)
-y=z.t(b,"unoptimized_code")
+y=D.UW(z.t(b,"unoptimized_code"))
 this.NM=F.Wi(this,C.OU,this.NM,y)
 y=z.t(b,"is_optimizable")
 this.vf=F.Wi(this,C.Vl,this.vf,y)
@@ -17644,10 +17971,43 @@
 "^":"wvY+Pi;",
 $isd3:true},
 c2:{
-"^":"Pi;Rd<,a4>,x9,AP,fn",
+"^":"Pi;Is>,Rd>,a4>,x9,Yp,am,AP,fn",
 gu9:function(){return this.x9},
 su9:function(a){this.x9=F.Wi(this,C.Ss,this.x9,a)},
-$isc2:true},
+gqr:function(){return this.Yp},
+sqr:function(a){var z=this.Yp
+if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.WC,z,a)
+z.$builtinTypeInfo=[null]
+this.nq(this,z)}this.Yp=a},
+gj9:function(){return this.am},
+sj9:function(a){this.am=F.Wi(this,C.Jf,this.am,a)},
+jY:function(a,b,c){var z,y,x,w,v,u,t
+z=D.eG(this.a4)
+this.am=F.Wi(this,C.Jf,this.am,!z)
+for(z=this.Is,y=J.mY(J.UQ(J.aT(z.P3).giD(),"breakpoints")),x=this.Rd;y.G();){w=y.gl()
+v=J.U6(w)
+u=J.UQ(v.t(w,"location"),"script")
+t=J.UQ(v.t(w,"location"),"tokenPos")
+if(J.xC(u,z)&&J.xC(u.q6(t),x)){v=this.Yp
+if(this.gnz(this)&&!J.xC(v,w)){v=new T.qI(this,C.WC,v,w)
+v.$builtinTypeInfo=[null]
+this.nq(this,v)}this.Yp=w}}},
+$isc2:true,
+static:{Fu:function(a){var z,y
+z=J.x(a)
+if(z.n(a,"else"))return!0
+z=z.Fr(a,"")
+y=new H.a7(z,z.length,0,null)
+y.$builtinTypeInfo=[H.u3(z,0)]
+for(;y.G();)switch(y.lo){case"{":case"}":case"(":case")":case";":break
+default:return!1}return!0},eG:function(a){var z,y,x,w
+z=J.It(a,new H.VR("(\\s)+",H.v4("(\\s)+",!1,!0,!1),null,null))
+for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){x=J.It(y.lo,new H.VR("(\\b)",H.v4("(\\b)",!1,!0,!1),null,null))
+w=new H.a7(x,x.length,0,null)
+w.$builtinTypeInfo=[H.u3(x,0)]
+for(;w.G();)if(!D.Fu(w.lo))return!1}return!0},NQ:function(a,b,c){var z=new D.c2(a,b,c,null,null,!0,null,null)
+z.jY(a,b,c)
+return z}}},
 vx:{
 "^":"vix;Gd>,d6,I0,U9,nE,EG,Ge,wA,y6,FB,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gfY:function(a){return this.I0},
@@ -17657,7 +18017,7 @@
 gM8:function(){return!0},
 rK:function(a){var z,y
 z=J.Hn(a,1)
-y=this.Gd.ao
+y=this.Gd.XH
 if(z>>>0!==z||z>=y.length)return H.e(y,z)
 return y[z]},
 q6:function(a){return this.y6.t(0,a)},
@@ -17681,7 +18041,7 @@
 this.PT(z.t(b,"tokenPosTable"))
 z=z.t(b,"owning_library")
 this.EG=F.Wi(this,C.If,this.EG,z)},
-PT:function(a){var z,y,x,w,v,u,t,s,r,q,p
+PT:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 if(a==null)return
 z=this.y6
 z.V1(0)
@@ -17689,34 +18049,37 @@
 y.V1(0)
 this.U9=F.Wi(this,C.Gd,this.U9,null)
 this.nE=F.Wi(this,C.kA,this.nE,null)
-for(x=J.mY(a);x.G();){w=x.gl()
-v=J.U6(w)
-u=v.t(w,0)
-t=1
-while(!0){s=v.gB(w)
-if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
-r=v.t(w,t)
-q=v.t(w,t+1)
-s=this.U9
-if(s==null){if(this.gnz(this)&&!J.xC(s,r)){s=new T.qI(this,C.Gd,s,r)
-s.$builtinTypeInfo=[null]
-this.nq(this,s)}this.U9=r
-s=this.nE
-if(this.gnz(this)&&!J.xC(s,r)){s=new T.qI(this,C.kA,s,r)
-s.$builtinTypeInfo=[null]
-this.nq(this,s)}this.nE=r}else{s=J.Bl(s,r)?this.U9:r
-p=this.U9
-if(this.gnz(this)&&!J.xC(p,s)){p=new T.qI(this,C.Gd,p,s)
-p.$builtinTypeInfo=[null]
-this.nq(this,p)}this.U9=s
-s=J.J5(this.nE,r)?this.nE:r
-p=this.nE
-if(this.gnz(this)&&!J.xC(p,s)){p=new T.qI(this,C.kA,p,s)
-p.$builtinTypeInfo=[null]
-this.nq(this,p)}this.nE=s}z.u(0,r,u)
-y.u(0,r,q)
-t+=2}}},
+x=P.Ls(null,null,null,null)
+for(w=J.mY(a);w.G();){v=w.gl()
+u=J.U6(v)
+t=u.t(v,0)
+x.h(0,t)
+s=1
+while(!0){r=u.gB(v)
+if(typeof r!=="number")return H.s(r)
+if(!(s<r))break
+q=u.t(v,s)
+p=u.t(v,s+1)
+r=this.U9
+if(r==null){if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.Gd,r,q)
+r.$builtinTypeInfo=[null]
+this.nq(this,r)}this.U9=q
+r=this.nE
+if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.kA,r,q)
+r.$builtinTypeInfo=[null]
+this.nq(this,r)}this.nE=q}else{r=J.Bl(r,q)?this.U9:q
+o=this.U9
+if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.Gd,o,r)
+o.$builtinTypeInfo=[null]
+this.nq(this,o)}this.U9=r
+r=J.J5(this.nE,q)?this.nE:q
+o=this.nE
+if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.kA,o,r)
+o.$builtinTypeInfo=[null]
+this.nq(this,o)}this.nE=r}z.u(0,q,t)
+y.u(0,q,p)
+s+=2}}for(z=this.Gd,z=z.gA(z);z.G();){v=z.lo
+if(!x.tg(0,J.f2(v)))v.sj9(!1)}},
 SC:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=this.d6
@@ -17739,12 +18102,10 @@
 y.V1(y)
 N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
 for(x=0;x<z.length;x=w){w=x+1
-y.h(0,new D.c2(w,z[x],null,null,null))}this.zL()},
+y.h(0,D.NQ(this,w,z[x]))}this.zL()},
 zL:function(){var z,y,x
-z=this.Gd
-if(z.ao.length===0)return
-for(z=z.gA(z),y=this.d6;z.G();){x=z.lo
-x.su9(y.t(0,x.gRd()))}},
+for(z=this.Gd,z=z.gA(z),y=this.d6;z.G();){x=z.lo
+x.su9(y.t(0,J.f2(x)))}},
 $isvx:true},
 Vlh:{
 "^":"af+boh;"},
@@ -17775,10 +18136,10 @@
 this.up=F.Wi(this,C.oI,this.up,z)},
 $isZ9:true},
 Q4:{
-"^":"Pi;Yu<,jA,L4<,dh,uH<,AP,fn",
+"^":"Pi;Yu<,vI,L4<,dh,uH<,AP,fn",
 gEB:function(){return this.dh},
 gUB:function(){return J.xC(this.Yu,0)},
-gGf:function(){return this.uH.ao.length>0},
+gGf:function(){return this.uH.XH.length>0},
 dV:[function(){var z,y
 z=this.Yu
 y=J.x(z)
@@ -17789,12 +18150,12 @@
 z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
 if(J.xC(z.gfF(),z.gDu()))return""
-return D.dJ(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,207,76],
+return D.dJ(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,211,76],
 HU:[function(a){var z
 if(a==null)return""
 z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
-return D.dJ(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,207,76],
+return D.dJ(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,211,76],
 eQ:function(){var z,y,x,w
 y=J.It(this.L4," ")
 x=y.length
@@ -17805,13 +18166,13 @@
 try{x=H.BU(z,16,null)
 return x}catch(w){H.Ru(w)
 return 0}},
-Tc:function(a){var z,y,x,w,v
+ju:function(a){var z,y,x,w,v
 z=this.L4
 if(!J.co(z,"j"))return
 y=this.eQ()
 x=J.x(y)
 if(x.n(y,0)){N.QM("").YX("Could not determine jump address for "+H.d(z))
-return}for(z=a.ao,w=0;w<z.length;++w){v=z[w]
+return}for(z=a.XH,w=0;w<z.length;++w){v=z[w]
 if(J.xC(v.gYu(),y)){z=this.dh
 if(this.gnz(this)&&!J.xC(z,v)){z=new T.qI(this,C.b5,z,v)
 z.$builtinTypeInfo=[null]
@@ -17853,7 +18214,7 @@
 gM8:function(){return!0},
 p7:[function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gUH",2,0,208,209],
+for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gUH",2,0,212,213],
 OF:function(){if(this.ar!=null)return
 if(!J.xC(this.I0,C.l8))return
 var z=this.MO
@@ -17906,7 +18267,7 @@
 if(v!=null)this.xs(v)
 u=z.t(b,"descriptors")
 if(u!=null)this.WY(J.UQ(u,"members"))
-z=this.va.ao
+z=this.va.XH
 this.kT=z.length!==0||!J.xC(this.I0,C.l8)
 z=z.length!==0&&J.xC(this.I0,C.l8)
 this.Mk=F.Wi(this,C.zS,this.Mk,z)},
@@ -17928,7 +18289,7 @@
 s=new Q.wn(null,null,s,null,null)
 s.$builtinTypeInfo=[w]
 z.h(0,new D.Q4(t,v,u,null,s,null,null))
-x+=3}for(y=z.gA(z);y.G();)y.lo.Tc(z)},
+x+=3}for(y=z.gA(z);y.G();)y.lo.ju(z)},
 QX:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=H.BU(z.t(a,"pc"),16,null)
@@ -17965,7 +18326,7 @@
 z=this.a
 y=J.zH(z.MO)
 if(y==null)return
-J.SK(y).ml(z.gUH())},"$1",null,2,0,null,210,"call"],
+J.SK(y).ml(z.gUH())},"$1",null,2,0,null,214,"call"],
 $isEH:true},
 Cq:{
 "^":"TpZ:79;",
@@ -17982,7 +18343,7 @@
 N.QM("").j2("Unknown socket kind "+H.d(a))
 throw H.b(P.a9())}}},
 WP:{
-"^":"D3i;V8@,jel,Ue,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+"^":"D3i;V8@,jel,IHj,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gUm:function(){return!0},
 gHY:function(){return J.xC(this.I0,C.FJ)},
 gfY:function(a){return this.I0},
@@ -18039,47 +18400,7 @@
 if(y&&D.bF(b))this.a.u(0,a,this.b.Qn(b))
 else if(!!z.$iswn)D.f3(b,this.b)
 else if(y)D.Gf(b,this.b)},
-$isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
-"^":"",
-zM:{
-"^":"V47;S4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
-gkc:function(a){return a.S4},
-skc:function(a,b){a.S4=this.ct(a,C.yh,a.S4,b)},
-static:{ZmK:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Cc=[]
-a.q1=!1
-a.oG=!1
-a.ZM=z
-a.ZQ=y
-C.U0.ZL(a)
-C.U0.XI(a)
-return a}}},
-V47:{
-"^":"uL+Pi;",
-$isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
-"^":"",
-Rk:{
-"^":"V48;Xc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
-gja:function(a){return a.Xc},
-sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
-static:{bZp:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Cc=[]
-a.q1=!1
-a.oG=!1
-a.ZM=z
-a.ZQ=y
-C.Vd.ZL(a)
-C.Vd.XI(a)
-return a}}},
-V48:{
-"^":"uL+Pi;",
-$isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
+$isEH:true}}],["","",,L,{
 "^":"",
 Z5:{
 "^":"a;eX@,A9<,oc*,w8<",
@@ -18093,63 +18414,48 @@
 this.w8=z
 if(this.oc==null)this.oc=z},
 $isZ5:true,
-static:{K9:function(a){var z=new U.Z5(0,!1,null,null)
+static:{K9:function(a){var z=new L.Z5(0,!1,null,null)
 z.UT(a)
 return z}}},
 U2:{
 "^":"a;jO>,mh<",
 $isU2:true},
-KM:{
-"^":"wv;eG,Mp,N>,JS,S3,yb,bs,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,Qy,z7,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
-gEH:function(){return this.eG.MM},
-t3:function(){var z=this.Mp.MM
+Uon:{
+"^":"wv;N>",
+gEH:function(){return this.bO.MM},
+Ue:function(){var z=this.DS.MM
 if(z.Gv===0){N.QM("").To("WebSocketVM connection error: "+H.d(this.N.gw8()))
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(this)}},
-giG:function(a){return this.Mp.MM},
-je:function(a){var z=this.bs
-if(z!=null)z.close()
-this.CS()
-this.t3()},
+giG:function(a){return this.DS.MM},
+je:function(a){if(this.xu)this.TU.bs.close()
+this.vt()
+this.Ue()},
 z6:function(a,b){var z,y,x
-if(this.bs==null){z=W.pS(this.N.gw8(),null)
-this.bs=z
-z=H.VM(new W.RO(z,C.i6.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gxb()),z.Sg),[H.Oq(z,0)]).Zz()
-z=this.bs
-z.toString
-z=H.VM(new W.RO(z,C.MD.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gpU()),z.Sg),[H.Oq(z,0)]).Zz()
-z=this.bs
-z.toString
-z=H.VM(new W.RO(z,C.JL.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gqM()),z.Sg),[H.Oq(z,0)]).Zz()
-z=this.bs
-z.toString
-z=H.VM(new W.RO(z,C.ph.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.ga9()),z.Sg),[H.Oq(z,0)]).Zz()}y=C.jn.bu(this.yb++)
-z=P.qU
-z=H.VM(new P.Zf(P.Dt(z)),[z])
-x=new U.U2(b,z)
-if(this.bs.readyState===1)this.ti(y,x)
-else this.JS.u(0,y,x)
-return z.MM},
-W4X:[function(a){this.CS()
-this.t3()},"$1","gxb",2,0,211,143],
-Wp:[function(a){this.CS()
-this.t3()},"$1","gpU",2,0,19,212],
-MLC:[function(a){var z,y
+if(!this.xu){this.xu=!0
+this.TU.Tc(this.N.gw8(),this.gBU(),this.gCC(),this.gyE(),this.gM5())}z=C.jn.bu(this.fW++)
+y=P.qU
+y=H.VM(new P.Zf(P.Dt(y)),[y])
+x=new L.U2(b,y)
+if(this.TU.bs.readyState===1)this.L8(z,x)
+else this.hZ.u(0,z,x)
+return y.MM},
+yg:[function(){this.vt()
+this.Ue()},"$0","gM5",0,0,17],
+os:[function(){this.vt()
+this.Ue()},"$0","gyE",0,0,17],
+yl5:[function(){var z,y
 z=this.N
 y=Date.now()
 new P.iP(y,!1).EK()
 z.seX(y)
-this.cf()
-y=this.eG.MM
+this.uP()
+y=this.bO.MM
 if(y.Gv===0){N.QM("").To("WebSocketVM connection opened: "+H.d(z.gw8()))
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(this)}},"$1","gqM",2,0,19,212],
-SS:[function(a){var z,y,x,w,v
-z=C.xr.kV(J.Qd(a))
+y.OH(this)}},"$0","gBU",0,0,17],
+wDh:[function(a){var z,y,x,w,v
+z=C.xr.kV(a)
 if(z==null){N.QM("").YX("WebSocketVM got empty message")
 return}if(this.N.gA9()===!0){y=J.U6(z)
 if(!J.xC(y.t(z,"method"),"Dart.observatoryData"))return
@@ -18157,44 +18463,123 @@
 w=J.UQ(y.t(z,"params"),"data")}else{y=J.U6(z)
 x=y.t(z,"seq")
 w=y.t(z,"response")}if(x==null){this.EM(w)
-return}v=this.S3.Rz(0,x)
+return}v=this.AW.Rz(0,x)
 if(v==null){N.QM("").YX("Received unexpected message: "+H.d(z))
 return}y=v.gmh().MM
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(w)},"$1","ga9",2,0,213,143],
-z1:function(a){a.aN(0,new U.Fw(this))
+y.OH(w)},"$1","gCC",2,0,19],
+BF:function(a){a.aN(0,new L.dV(this))
 a.V1(0)},
-CS:function(){var z=this.S3
+vt:function(){var z=this.AW
 if(z.X5>0){N.QM("").To("Cancelling all pending requests.")
-this.z1(z)}z=this.JS
+this.BF(z)}z=this.hZ
 if(z.X5>0){N.QM("").To("Cancelling all delayed requests.")
-this.z1(z)}},
-cf:function(){var z=this.JS
+this.BF(z)}},
+uP:function(){var z=this.hZ
 if(z.X5===0)return
 N.QM("").To("Sending all delayed requests.")
-z.aN(0,this.gkB())
+z.aN(0,this.grW())
 z.V1(0)},
-ti:[function(a,b){var z,y
+L8:[function(a,b){var z,y
 z=J.RE(b)
 if(!J.Vr(z.gjO(b),"/profile/tag"))N.QM("").To("GET "+H.d(z.gjO(b))+" from "+H.d(this.N.gw8()))
-this.S3.u(0,a,b)
+this.AW.u(0,a,b)
 y=this.N.gA9()===!0?C.xr.KP(P.EF(["id",H.BU(a,null,null),"method","Dart.observatoryQuery","params",P.EF(["id",a,"query",z.gjO(b)],null,null)],null,null)):C.xr.KP(P.EF(["seq",a,"request",z.gjO(b)],null,null))
-this.bs.send(y)},"$2","gkB",4,0,214],
-$isKM:true},
-Fw:{
-"^":"TpZ:215;a",
+this.TU.bs.send(y)},"$2","grW",4,0,215]},
+dV:{
+"^":"TpZ:216;a",
 $2:function(a,b){var z,y
 z=b.gmh()
 y=C.xr.KP(P.EF(["type","ServiceException","id","","kind","NetworkException","message","WebSocket disconnected"],null,null))
 z=z.MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(y)},
+$isEH:true}}],["","",,R,{
+"^":"",
+zM:{
+"^":"V47;S4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
+gkc:function(a){return a.S4},
+skc:function(a,b){a.S4=this.ct(a,C.yh,a.S4,b)},
+static:{ZmK:function(a){var z,y
+z=P.L5(null,null,null,P.qU,W.I0)
+y=P.qU
+y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+a.Cc=[]
+a.Ap=!1
+a.oG=!1
+a.ZM=z
+a.ZQ=y
+C.U0.ZL(a)
+C.U0.XI(a)
+return a}}},
+V47:{
+"^":"uL+Pi;",
+$isd3:true}}],["","",,D,{
+"^":"",
+Rk:{
+"^":"V48;Xc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
+gja:function(a){return a.Xc},
+sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
+static:{bZp:function(a){var z,y
+z=P.L5(null,null,null,P.qU,W.I0)
+y=P.qU
+y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+a.Cc=[]
+a.Ap=!1
+a.oG=!1
+a.ZM=z
+a.ZQ=y
+C.Vd.ZL(a)
+C.Vd.XI(a)
+return a}}},
+V48:{
+"^":"uL+Pi;",
+$isd3:true}}],["","",,U,{
+"^":"",
+hA:{
+"^":"a;bs",
+Tc:function(a,b,c,d,e){var z=W.pS(a,null)
+this.bs=z
+z=H.VM(new W.RO(z,C.i6.Ph,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new U.lo(e)),z.Sg),[H.u3(z,0)]).Zz()
+z=this.bs
+z.toString
+z=H.VM(new W.RO(z,C.MD.Ph,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new U.j3(d)),z.Sg),[H.u3(z,0)]).Zz()
+z=this.bs
+z.toString
+z=H.VM(new W.RO(z,C.JL.Ph,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new U.Fz(b)),z.Sg),[H.u3(z,0)]).Zz()
+z=this.bs
+z.toString
+z=H.VM(new W.RO(z,C.ph.Ph,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new U.oy(c)),z.Sg),[H.u3(z,0)]).Zz()},
+wR:function(a,b){this.bs.send(b)},
+xO:function(a){this.bs.close()}},
+lo:{
+"^":"TpZ:12;a",
+$1:[function(a){return this.a.$0()},"$1",null,2,0,null,217,"call"],
 $isEH:true},
+j3:{
+"^":"TpZ:12;b",
+$1:[function(a){return this.b.$0()},"$1",null,2,0,null,218,"call"],
+$isEH:true},
+Fz:{
+"^":"TpZ:12;c",
+$1:[function(a){return this.c.$0()},"$1",null,2,0,null,218,"call"],
+$isEH:true},
+oy:{
+"^":"TpZ:219;d",
+$1:[function(a){return this.d.$1(J.Qd(a))},"$1",null,2,0,null,85,"call"],
+$isEH:true},
+KM:{
+"^":"Uon;bO,DS,N,hZ,AW,fW,xu,TU,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,Qy,z7,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+$isKM:true},
 dS:{
-"^":"wv;eG,Mp,S3,yb,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,Qy,z7,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+"^":"wv;eG,mc,S3,yb,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,Qy,z7,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 je:function(a){},
 gEH:function(){return this.eG.MM},
-giG:function(a){return this.Mp.MM},
+giG:function(a){return this.mc.MM},
 q3:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -18204,7 +18589,7 @@
 z=this.S3
 v=z.t(0,y)
 z.Rz(0,y)
-J.KD(v,w)},"$1","gVx",2,0,19,216],
+J.KD(v,w)},"$1","gVx",2,0,19,220],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -18216,13 +18601,13 @@
 J.tT(W.Pv(window.parent),C.xr.KP(y),"*")
 return x.MM},
 ZH:function(){var z=H.VM(new W.RO(window,C.ph.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gVx()),z.Sg),[H.Oq(z,0)]).Zz()
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(this.gVx()),z.Sg),[H.u3(z,0)]).Zz()
 z=this.eG.MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(this)}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
+z.OH(this)}}}],["","",,U,{
 "^":"",
 Ti:{
-"^":"V49;Ll,Sa,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V49;Ll,Sa,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gWA:function(a){return a.Ll},
 sWA:function(a,b){a.Ll=this.ct(a,C.td,a.Ll,b)},
 gKw:function(a){return a.Sa},
@@ -18283,7 +18668,7 @@
 J.tH(z,a.Ll)
 return z
 case"Isolate":z=W.r3("isolate-view",null)
-J.uM(z,a.Ll)
+J.Rp(z,a.Ll)
 return z
 case"Library":z=W.r3("library-view",null)
 J.cl(z,a.Ll)
@@ -18301,7 +18686,7 @@
 J.A4(z,a.Ll)
 return z
 case"RandomAccessFile":z=W.r3("io-random-access-file-view",null)
-J.fR(z,a.Ll)
+J.OH(z,a.Ll)
 return z
 case"ServiceError":z=W.r3("service-error-view",null)
 J.Qr(z,a.Ll)
@@ -18336,7 +18721,7 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -18345,10 +18730,10 @@
 return a}}},
 V49:{
 "^":"uL+Pi;",
-$isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
+$isd3:true}}],["","",,Q,{
 "^":"",
 xI:{
-"^":"Vfx;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"Vfx;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gnv:function(a){return a.tY},
 snv:function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},
 gjT:function(a){return a.Pe},
@@ -18375,7 +18760,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -18384,10 +18769,10 @@
 return a}}},
 Vfx:{
 "^":"uL+Pi;",
-$isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
+$isd3:true}}],["","",,Q,{
 "^":"",
 CY:{
-"^":"ImK;kF,IK,bP,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"ImK;kF,IK,bP,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gd4:function(a){return a.kF},
 sd4:function(a,b){a.kF=this.ct(a,C.bk,a.kF,b)},
 gEu:function(a){return a.IK},
@@ -18395,13 +18780,13 @@
 gRY:function(a){return a.bP},
 sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
 RC:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,111,2,217,103],
+a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,113,2,221,105],
 static:{Sm:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -18410,7 +18795,7 @@
 return a}}},
 ImK:{
 "^":"xc+Pi;",
-$isd3:true}}],["smoke","package:smoke/smoke.dart",,A,{
+$isd3:true}}],["","",,A,{
 "^":"",
 Wq:{
 "^":"a;c1,BH,Mg,nN,ER,Ja,MR,tu",
@@ -18446,7 +18831,7 @@
 return z.vM},"$0","gAY",0,0,71],
 $isES:true},
 iYn:{
-"^":"a;fY>"}}],["smoke.src.common","package:smoke/src/common.dart",,X,{
+"^":"a;fY>"}}],["","",,X,{
 "^":"",
 Na:function(a,b,c){var z,y
 z=a.length
@@ -18459,18 +18844,18 @@
 return z}return a},
 ZO:function(a,b){var z,y,x,w,v,u
 z=new H.a7(a,a.length,0,null)
-z.$builtinTypeInfo=[H.Oq(a,0)]
+z.$builtinTypeInfo=[H.u3(a,0)]
 for(;z.G();){y=z.lo
 b.length
 x=new H.a7(b,1,0,null)
-x.$builtinTypeInfo=[H.Oq(b,0)]
+x.$builtinTypeInfo=[H.u3(b,0)]
 w=J.x(y)
 for(;x.G();){v=x.lo
 if(w.n(y,v))return!0
 if(!!J.x(v).$isuq){u=w.gbx(y)
 u=$.mX().dM(u,v)}else u=!1
 if(u)return!0}}return!1},
-fy:function(a){var z,y
+Cz:function(a){var z,y
 z=H.G3()
 y=H.KT(z).BD(a)
 if(y)return 0
@@ -18500,12 +18885,12 @@
 x.FV(0,b)
 for(w=0;w<a.length;++w)if(!x.tg(0,a[w]))return!1}else for(w=0;w<z;++w){v=a[w]
 if(w>=y)return H.e(b,w)
-if(v!==b[w])return!1}return!0}}],["smoke.src.implementation","package:smoke/src/implementation.dart",,D,{
+if(v!==b[w])return!1}return!0}}],["","",,D,{
 "^":"",
-kP:function(){throw H.b(P.FM("The \"smoke\" library has not been configured. Make sure you import and configure one of the implementations (package:smoke/mirrors.dart or package:smoke/static.dart)."))}}],["smoke.static","package:smoke/static.dart",,O,{
+kP:function(){throw H.b(P.FM("The \"smoke\" library has not been configured. Make sure you import and configure one of the implementations (package:smoke/mirrors.dart or package:smoke/static.dart)."))}}],["","",,O,{
 "^":"",
 Oj:{
-"^":"a;LH,AH,ZGj,BJ,Yp,af<,yQ"},
+"^":"a;E4e,AH,ZGj,of,NX,af<,yQ"},
 fH:{
 "^":"a;eA,vk,Si",
 jD:function(a,b){var z=this.eA.t(0,b)
@@ -18520,7 +18905,7 @@
 z=null}else{x=this.eA.t(0,b)
 z=x==null?null:x.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
 y=null
-if(d){w=X.fy(z)
+if(d){w=X.Cz(z)
 if(w>3){y="we tried to adjust the arguments for calling \""+H.d(b)+"\", but we couldn't determine the exact number of arguments it expects (it is more than 3)."
 c=X.Na(c,w,P.y(w,J.q8(c)))}else{v=X.RI(z)
 u=v>=0?v:J.q8(c)
@@ -18567,21 +18952,21 @@
 throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
 rD:{
 "^":"a;ep,Nz",
-Ut:function(a){this.ep.aN(0,new O.m8(this))},
+Ut:function(a){this.ep.aN(0,new O.Fi(this))},
 static:{ty:function(a){var z=new O.rD(a.af,P.Fl(null,null))
 z.Ut(a)
 return z}}},
-m8:{
+Fi:{
 "^":"TpZ:79;a",
 $2:function(a,b){this.a.Nz.u(0,b,a)},
 $isEH:true},
 tk:{
 "^":"a;GB",
 bu:[function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},"$0","gAY",0,0,71],
-static:{lA:function(a){return new O.tk(a)}}}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
+static:{lA:function(a){return new O.tk(a)}}}}],["","",,K,{
 "^":"",
 nm:{
-"^":"V50;xP,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V50;xP,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gM6:function(a){return a.xP},
 sM6:function(a,b){a.xP=this.ct(a,C.rE,a.xP,b)},
 static:{an:function(a){var z,y
@@ -18589,7 +18974,7 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -18598,28 +18983,28 @@
 return a}}},
 V50:{
 "^":"uL+Pi;",
-$isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
+$isd3:true}}],["","",,X,{
 "^":"",
 uw:{
-"^":"V51;ju,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
-gtN:function(a){return a.ju},
-stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
-SK:[function(a,b){J.cI(a.ju).YM(b)},"$1","gvC",2,0,19,98],
+"^":"V51;Jl,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
+gtN:function(a){return a.Jl},
+stN:function(a,b){a.Jl=this.ct(a,C.kw,a.Jl,b)},
+SK:[function(a,b){J.cI(a.Jl).YM(b)},"$1","gvC",2,0,19,100],
 static:{lt2:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.wB.ZL(a)
-C.wB.XI(a)
+C.uC.ZL(a)
+C.uC.XI(a)
 return a}}},
 V51:{
 "^":"uL+Pi;",
-$isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
+$isd3:true}}],["","",,M,{
 "^":"",
 AD:function(a,b,c,d){var z,y
 if(c){z=null!=d&&!1!==d
@@ -18635,17 +19020,17 @@
 dg:function(a,b){var z,y,x,w,v,u
 z=M.pNz(a,b)
 if(z==null)z=new M.PW([],null,null)
-for(y=J.RE(a),x=y.gPZ(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.dg(x,b)
+for(y=J.RE(a),x=y.glb(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.dg(x,b)
 if(u==null)continue
-if(w==null){w=Array(y.gyT(a).NL.childNodes.length)
+if(w==null){w=Array(y.gUN(a).NL.childNodes.length)
 w.fixed$length=init}if(v>=w.length)return H.e(w,v)
 w[v]=u}z.ks=w
 return z},
 S0:function(a,b,c,d,e,f,g,h){var z,y,x,w
-z=b.appendChild(J.Ha(c,a,!1))
+z=b.appendChild(J.Lh(c,a,!1))
 for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.S0(y,z,c,x?d.JW(w):null,e,f,g,null)
-if(d.ghK()){M.SB(z).bt(a)
-if(f!=null)J.vc(M.SB(z),f)}M.mV(z,d,e,g)
+if(d.ghK()){M.SB(z).wh(a)
+if(f!=null)J.D4(M.SB(z),f)}M.mV(z,d,e,g)
 return z},
 tA:function(a){var z
 for(;z=J.TmB(a),z!=null;a=z);return a},
@@ -18656,13 +19041,13 @@
 y=$.vH()
 y.toString
 x=H.of(a,"expando$values")
-w=x==null?null:H.of(x,y.J4())
+w=x==null?null:H.of(x,y.YV())
 y=w==null
-if(!y&&w.gC0()!=null)v=J.Eh(w.gC0(),z)
+if(!y&&w.gj6()!=null)v=J.Eh(w.gj6(),z)
 else{u=J.x(a)
 v=!!u.$isYN||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
 if(y)return
-a=w.gCi()
+a=w.gCv()
 if(a==null)return}},
 H4o:function(a,b,c){if(c==null)return
 return new M.hg(a,b,c)},
@@ -18685,15 +19070,15 @@
 z=w}else z=x
 v=new M.qf(null,null,null,z,null,null)
 z=M.rJ(a,"if",b)
-v.qd=z
+v.EI=z
 x=M.rJ(a,"bind",b)
-v.fu=x
+v.YI=x
 u=M.rJ(a,"repeat",b)
-v.zy=u
-if(z!=null&&x==null&&u==null)v.fu=S.j9("{{}}",M.H4o("bind",a,b))
+v.Lx=u
+if(z!=null&&x==null&&u==null)v.YI=S.j9("{{}}",M.H4o("bind",a,b))
 return v}z=z.a
 return z==null?null:new M.PW(z,null,null)},
-fX:function(a,b,c,d){var z,y,x,w,v,u,t
+i8:function(a,b,c,d){var z,y,x,w,v,u,t
 if(b.gqz()){z=b.HH(0)
 y=z!=null?z.$3(d,c,!0):b.Pn(0).Tl(d)
 return b.gaW()?y:b.qm(y)}x=J.U6(b)
@@ -18711,11 +19096,11 @@
 if(u>=w)return H.e(v,u)
 v[u]=t;++u}return b.qm(v)},
 oO:function(a,b,c,d){var z,y,x,w,v,u,t,s
-if(b.gwD())return M.fX(a,b,c,d)
+if(b.gwD())return M.i8(a,b,c,d)
 if(b.gqz()){z=b.HH(0)
 if(z!=null)y=z.$3(d,c,!1)
 else{x=b.Pn(0)
-x=!!J.x(x).$isTv?x:L.hk(x)
+x=!!J.x(x).$isZl?x:L.hk(x)
 w=$.ps
 $.ps=w+1
 y=new L.WR(x,d,null,w,null,null,null)}return b.gaW()?y:new Y.Qw(y,b.gEO(),null,null,null)}x=$.ps
@@ -18730,10 +19115,10 @@
 c$0:{u=b.l8(v)
 z=b.HH(v)
 if(z!=null){t=z.$3(d,c,u)
-if(u===!0)y.U2(t)
+if(u===!0)y.ti(t)
 else y.Qs(t)
 break c$0}s=b.Pn(v)
-if(u===!0)y.U2(s.Tl(d))
+if(u===!0)y.ti(s.Tl(d))
 else y.yN(d,s)}++v}return new Y.Qw(y,b.gEO(),null,null,null)},
 mV:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p
 z=J.RE(b)
@@ -18745,17 +19130,17 @@
 if(r!=null&&!0)d.push(r)}v.Vz(x)
 if(!z.$isqf)return
 q=M.SB(a)
-q.sCz(c)
-p=q.ZZ(b)
+q.skr(c)
+p=q.Cm(b)
 if(p!=null&&!0)d.push(p)},
 SB:function(a){var z,y,x,w
 z=$.cm()
 z.toString
 y=H.of(a,"expando$values")
-x=y==null?null:H.of(y,z.J4())
+x=y==null?null:H.of(y,z.YV())
 if(x!=null)return x
 w=J.x(a)
-if(!!w.$isMi)x=new M.L1(a,null,null)
+if(!!w.$isMi)x=new M.Q8(a,null,null)
 else if(!!w.$islpR)x=new M.ug(a,null,null)
 else if(!!w.$isHR)x=new M.VT(a,null,null)
 else if(!!w.$ish4){if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.lY.x4(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
@@ -18771,31 +19156,31 @@
 else z=!1
 return z},
 VE:{
-"^":"a;cJ",
+"^":"a;DP",
 US:function(a,b,c){return},
 static:{"^":"ac"}},
 V2:{
-"^":"vy;rF,Cd,Vw",
+"^":"vy;N1,Cd,Xl",
 nR:function(a,b,c,d){var z,y,x,w,v,u
 z={}
 z.a=b
-y=this.grF()
+y=this.gN1()
 x=J.x(y)
 w=!!x.$isQlt&&J.xC(z.a,"value")
 v=z.a
 if(w){new W.E9(y).Rz(0,v)
-if(d)return this.Dt(c)
-x=this.ge2()
+if(d)return this.Lm(c)
+x=this.gKX()
 x.$1(J.mu(c,x))}else{u=J.Vr(v,"?")
 if(u){x.gQg(y).Rz(0,z.a)
 x=z.a
 w=J.U6(x)
-z.a=w.Nj(x,0,J.Hn(w.gB(x),1))}if(d)return M.AD(this.grF(),z.a,u,c)
-x=new M.BL(z,this,u)
+z.a=w.Nj(x,0,J.Hn(w.gB(x),1))}if(d)return M.AD(this.gN1(),z.a,u,c)
+x=new M.IoZ(z,this,u)
 x.$1(J.mu(c,x))}z=z.a
-return $.rK?this.Un(z,c):c},
-Dt:[function(a){var z,y,x,w,v,u,t,s
-z=this.grF()
+return $.rK?this.Zr(z,c):c},
+Lm:[function(a){var z,y,x,w,v,u,t,s
+z=this.gN1()
 y=J.RE(z)
 x=y.gBy(z)
 w=J.x(x)
@@ -18807,37 +19192,37 @@
 s=null}}else{t=null
 s=null}y.sP(z,a==null?"":H.d(a))
 if(s!=null&&!J.xC(w.gP(x),t)){y=w.gP(x)
-J.ta(s.gvt(),y)}},"$1","ge2",2,0,19,60]},
-BL:{
+J.ta(s.gOi(),y)}},"$1","gKX",2,0,19,60]},
+IoZ:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,67,"call"],
+$1:[function(a){return M.AD(this.b.gN1(),this.a.a,this.c,a)},"$1",null,2,0,null,67,"call"],
 $isEH:true},
 b2:{
-"^":"OC;rF<,E3,vt<,jS",
-HF:[function(a){return M.pw(this.rF,a,this.jS)},"$1","ghZ",2,0,19,60],
-Uh:[function(a){var z,y,x,w,v
-switch(this.jS){case"value":z=J.Vm(this.rF)
-J.ta(this.vt,z)
+"^":"OC;N1<,Ca,Oi<,M7",
+Cno:[function(a){return M.pw(this.N1,a,this.M7)},"$1","gRD",2,0,19,60],
+wU:[function(a){var z,y,x,w,v
+switch(this.M7){case"value":z=J.Vm(this.N1)
+J.ta(this.Oi,z)
 break
-case"checked":z=this.rF
+case"checked":z=this.N1
 y=J.RE(z)
 x=y.gd4(z)
-J.ta(this.vt,x)
-if(!!y.$isMi&&J.xC(y.gt5(z),"radio"))for(z=J.mY(M.pt(z));z.G();){w=z.gl()
+J.ta(this.Oi,x)
+if(!!y.$isMi&&J.xC(y.gt5(z),"radio"))for(z=J.mY(M.YP(z));z.G();){w=z.gl()
 v=J.UQ(J.QE(!!J.x(w).$isvy?w:M.SB(w)),"checked")
 if(v!=null)J.ta(v,!1)}break
-case"selectedIndex":z=J.Lr(this.rF)
-J.ta(this.vt,z)
-break}O.N0()},"$1","gCL",2,0,19,2],
-TR:function(a,b){return J.mu(this.vt,b)},
-gP:function(a){return J.Vm(this.vt)},
-sP:function(a,b){J.ta(this.vt,b)
+case"selectedIndex":z=J.Lr(this.N1)
+J.ta(this.Oi,z)
+break}O.N0()},"$1","gd1",2,0,19,2],
+TR:function(a,b){return J.mu(this.Oi,b)},
+gP:function(a){return J.Vm(this.Oi)},
+sP:function(a,b){J.ta(this.Oi,b)
 return b},
-xO:function(a){var z=this.E3
+xO:function(a){var z=this.Ca
 if(z!=null){z.ed()
-this.E3=null}z=this.vt
+this.Ca=null}z=this.Oi
 if(z!=null){J.yd(z)
-this.vt=null}},
+this.Oi=null}},
 $isb2:true,
 static:{"^":"S8",pw:function(a,b,c){switch(c){case"checked":J.Ae(a,null!=b&&!1!==b)
 return
@@ -18849,7 +19234,7 @@
 switch(z.gt5(a)){case"checkbox":return $.FF().LX(a)
 case"radio":case"select-multiple":case"select-one":return z.gEr(a)
 case"range":if(J.x5(window.navigator.userAgent,new H.VR("Trident|MSIE",H.v4("Trident|MSIE",!1,!0,!1),null,null)))return z.gEr(a)
-break}return z.gLm(a)},pt:function(a){var z,y,x
+break}return z.gQb(a)},YP:function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
 z.toString
@@ -18857,7 +19242,7 @@
 return z.ad(z,new M.qx(a))}else{y=M.y9(a)
 if(y==null)return C.dn
 x=J.Vj(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ad(x,new M.y4(a))}},Fa:function(a){if(typeof a==="string")return H.BU(a,null,new M.LG())
+return x.ad(x,new M.di(a))}},Fa:function(a){if(typeof a==="string")return H.BU(a,null,new M.LG())
 return typeof a==="number"&&Math.floor(a)===a?a:0}}},
 Raa:{
 "^":"TpZ:74;",
@@ -18867,14 +19252,14 @@
 y.st5(z,"checkbox")
 x=[]
 w=y.gfs(z)
-H.VM(new W.Ov(0,w.DK,w.Ph,W.aF(new M.pp(x)),w.Sg),[H.Oq(w,0)]).Zz()
+H.VM(new W.Ov(0,w.bi,w.Ph,W.aF(new M.pp(x)),w.Sg),[H.u3(w,0)]).Zz()
 y=y.gEr(z)
-H.VM(new W.Ov(0,y.DK,y.Ph,W.aF(new M.LfS(x)),y.Sg),[H.Oq(y,0)]).Zz()
+H.VM(new W.Ov(0,y.bi,y.Ph,W.aF(new M.LfS(x)),y.Sg),[H.u3(y,0)]).Zz()
 y=window
 v=document.createEvent("MouseEvent")
 J.Dh(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
 z.dispatchEvent(v)
-return x.length===1?C.U3:C.Nm.gTw(x)},
+return x.length===1?C.U3:C.Nm.gne(x)},
 $isEH:true},
 pp:{
 "^":"TpZ:12;a",
@@ -18896,7 +19281,7 @@
 else z=!1
 return z},
 $isEH:true},
-y4:{
+di:{
 "^":"TpZ:12;b",
 $1:function(a){var z=J.x(a)
 return!z.n(a,this.b)&&z.gMB(a)==null},
@@ -18905,44 +19290,44 @@
 "^":"TpZ:12;",
 $1:function(a){return 0},
 $isEH:true},
-L1:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
+Q8:{
+"^":"V2;N1,Cd,Xl",
+gN1:function(){return this.N1},
 nR:function(a,b,c,d){var z,y,x
 z=J.x(b)
 if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.nR.call(this,this,b,c,d)
-J.Vs(this.rF).Rz(0,b)
-if(d){M.pw(this.rF,c,b)
-return}z=this.rF
+J.Vs(this.N1).Rz(0,b)
+if(d){M.pw(this.N1,c,b)
+return}z=this.N1
 y=new M.b2(z,null,c,b)
-y.E3=M.IPt(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return this.Un(b,y)}},
+y.Ca=M.IPt(z).yI(y.gd1())
+x=y.gRD()
+M.pw(z,J.mu(y.Oi,x),b)
+return this.Zr(b,y)}},
 PW:{
-"^":"a;Cd>,ks>,jb>",
+"^":"a;Cd>,ks>,q1>",
 ghK:function(){return!1},
 JW:function(a){var z=this.ks
 if(z==null||a>=z.length)return
 if(a>=z.length)return H.e(z,a)
 return z[a]}},
 qf:{
-"^":"PW;qd,fu,zy,Cd,ks,jb",
+"^":"PW;EI,YI,Lx,Cd,ks,q1",
 ghK:function(){return!0},
 $isqf:true},
 vy:{
-"^":"a;rF<,Cd*,Vw?",
+"^":"a;N1<,Cd*,Xl?",
 nR:function(a,b,c,d){var z
 window
 z="Unhandled binding to Node: "+H.a5(this)+" "+H.d(b)+" "+H.d(c)+" "+d
 if(typeof console!="undefined")console.error(z)
 return},
 Vz:function(a){},
-gmSA:function(a){var z=this.Vw
-if(z!=null);else if(J.Lp(this.grF())!=null){z=J.Lp(this.grF())
+gmSA:function(a){var z=this.Xl
+if(z!=null);else if(J.Lp(this.gN1())!=null){z=J.Lp(this.gN1())
 z=J.Zz(!!J.x(z).$isvy?z:M.SB(z))}else z=null
 return z},
-Un:function(a,b){var z,y
+Zr:function(a,b){var z,y
 z=this.Cd
 if(z==null){z=P.Fl(null,null)
 this.Cd=z}y=z.t(0,a)
@@ -18951,137 +19336,137 @@
 return b},
 $isvy:true},
 ze:{
-"^":"a;k8>,EA,Po"},
+"^":"a;k8>,Mm,Ve"},
 ug:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
+"^":"V2;N1,Cd,Xl",
+gN1:function(){return this.N1},
 nR:function(a,b,c,d){var z,y,x
 if(J.xC(b,"selectedindex"))b="selectedIndex"
 z=J.x(b)
 if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.nR.call(this,this,b,c,d)
-J.Vs(this.rF).Rz(0,b)
-if(d){M.pw(this.rF,c,b)
-return}z=this.rF
+J.Vs(this.N1).Rz(0,b)
+if(d){M.pw(this.N1,c,b)
+return}z=this.N1
 y=new M.b2(z,null,c,b)
-y.E3=M.IPt(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return this.Un(b,y)}},
+y.Ca=M.IPt(z).yI(y.gd1())
+x=y.gRD()
+M.pw(z,J.mu(y.Oi,x),b)
+return this.Zr(b,y)}},
 DT:{
-"^":"V2;Cz?,nF,os<,xU,q4?,Bx?,ZV?,le,VZ,q8,rF,Cd,Vw",
-grF:function(){return this.rF},
+"^":"V2;kr?,dH,F3<,z7E,QO?,jH?,mj?,my,dv,kC,N1,Cd,Xl",
+gN1:function(){return this.N1},
 nR:function(a,b,c,d){var z
 if(!J.xC(b,"ref"))return M.V2.prototype.nR.call(this,this,b,c,d)
 z=d?c:J.mu(c,new M.pi(this))
-J.Vs(this.rF).MW.setAttribute("ref",z)
-this.aX()
+J.Vs(this.N1).MW.setAttribute("ref",z)
+this.Yo()
 if(d)return
-return this.Un("ref",c)},
-ZZ:function(a){var z=this.os
-if(z!=null)z.NC()
-if(a.qd==null&&a.fu==null&&a.zy==null){z=this.os
+return this.Zr("ref",c)},
+Cm:function(a){var z=this.F3
+if(z!=null)z.z9()
+if(a.EI==null&&a.YI==null&&a.Lx==null){z=this.F3
 if(z!=null){z.xO(0)
-this.os=null}return}z=this.os
-if(z==null){z=new M.aY(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
-this.os=z}z.dE(a,this.Cz)
-J.ZW($.ik(),this.rF,["ref"],!0)
-return this.os},
+this.F3=null}return}z=this.F3
+if(z==null){z=new M.TGm(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
+this.F3=z}z.Bq(a,this.kr)
+J.ZW($.ik(),this.N1,["ref"],!0)
+return this.F3},
 ZK:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-if(c==null)c=this.nF
-z=this.q8
-if(z==null){z=this.gNK()
-z=J.NQ(!!J.x(z).$isvy?z:M.SB(z))
-this.q8=z}y=J.RE(z)
-if(y.gPZ(z)==null)return $.zl()
-x=c==null?$.HT():c
-w=x.cJ
+if(c==null)c=this.dH
+z=this.kC
+if(z==null){z=this.gyT()
+z=J.Xu(!!J.x(z).$isvy?z:M.SB(z))
+this.kC=z}y=J.RE(z)
+if(y.glb(z)==null)return $.zl()
+x=c==null?$.Bu():c
+w=x.DP
 if(w==null){w=H.VM(new P.qo(null),[null])
-x.cJ=w}v=w.t(0,z)
+x.DP=w}v=w.t(0,z)
 if(v==null){v=M.dg(z,x)
-x.cJ.u(0,z,v)}w=this.le
-if(w==null){u=J.Do(this.rF)
+x.DP.u(0,z,v)}w=this.my
+if(w==null){u=J.Do(this.N1)
 w=$.we()
 t=w.t(0,u)
 if(t==null){t=u.implementation.createHTMLDocument("")
 $.Ks().u(0,t,!0)
-M.lo(t)
-w.u(0,u,t)}this.le=t
+M.Uk(t)
+w.u(0,u,t)}this.my=t
 w=t}s=J.bs(w)
 w=[]
-r=new M.Fi(w,null,null,null)
+r=new M.qdK(w,null,null,null)
 q=$.vH()
-r.Ci=this.rF
-r.C0=z
+r.Cv=this.N1
+r.j6=z
 q.u(0,s,r)
 p=new M.ze(b,null,null)
-M.SB(s).sVw(p)
-for(o=y.gPZ(z),z=v!=null,n=0,m=!1;o!=null;o=o.nextSibling,++n){if(o.nextSibling==null)m=!0
+M.SB(s).sXl(p)
+for(o=y.glb(z),z=v!=null,n=0,m=!1;o!=null;o=o.nextSibling,++n){if(o.nextSibling==null)m=!0
 l=z?v.JW(n):null
-k=M.S0(o,s,this.le,l,b,c,w,null)
-M.SB(k).sVw(p)
-if(m)r.Qo=k}p.EA=s.firstChild
-p.Po=s.lastChild
-r.C0=null
-r.Ci=null
+k=M.S0(o,s,this.my,l,b,c,w,null)
+M.SB(k).sXl(p)
+if(m)r.he=k}p.Mm=s.firstChild
+p.Ve=s.lastChild
+r.j6=null
+r.Cv=null
 return s},
-gk8:function(a){return this.Cz},
-gG5:function(a){return this.nF},
-sG5:function(a,b){var z
-if(this.nF!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
-this.nF=b
-this.VZ=null
-z=this.os
-if(z!=null){z.Wv=!1
-z.eY=null
-z.TC=null}},
-aX:function(){var z,y
-if(this.os!=null){z=this.q8
-y=this.gNK()
-y=J.NQ(!!J.x(y).$isvy?y:M.SB(y))
+gk8:function(a){return this.kr},
+gA0:function(a){return this.dH},
+sA0:function(a,b){var z
+if(this.dH!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
+this.dH=b
+this.dv=null
+z=this.F3
+if(z!=null){z.vJ=!1
+z.DO=null
+z.Fy=null}},
+Yo:function(){var z,y
+if(this.F3!=null){z=this.kC
+y=this.gyT()
+y=J.Xu(!!J.x(y).$isvy?y:M.SB(y))
 y=z==null?y==null:z===y
 z=y}else z=!0
 if(z)return
-this.q8=null
-this.os.Io(null)
-this.os.vr(null)},
+this.kC=null
+this.F3.t3(null)
+this.F3.xY(null)},
 V1:function(a){var z,y
-this.Cz=null
-this.nF=null
+this.kr=null
+this.dH=null
 z=this.Cd
 if(z!=null){y=z.Rz(0,"ref")
-if(y!=null)J.yd(y)}this.q8=null
-z=this.os
+if(y!=null)J.yd(y)}this.kC=null
+z=this.F3
 if(z==null)return
-z.Io(null)
-this.os.xO(0)
-this.os=null},
-gNK:function(){var z,y
-this.GC()
-z=M.cS(this.rF,J.Vs(this.rF).MW.getAttribute("ref"))
-if(z==null){z=this.q4
-if(z==null)return this.rF}y=M.SB(z).gNK()
+z.t3(null)
+this.F3.xO(0)
+this.F3=null},
+gyT:function(){var z,y
+this.wo()
+z=M.cS(this.N1,J.Vs(this.N1).MW.getAttribute("ref"))
+if(z==null){z=this.QO
+if(z==null)return this.N1}y=M.SB(z).gyT()
 return y!=null?y:z},
-gjb:function(a){var z
-this.GC()
-z=this.Bx
-return z!=null?z:H.Go(this.rF,"$isOH").content},
-bt:function(a){var z,y,x,w,v,u,t
-if(this.ZV===!0)return!1
+gq1:function(a){var z
+this.wo()
+z=this.jH
+return z!=null?z:H.Go(this.N1,"$isfX").content},
+wh:function(a){var z,y,x,w,v,u,t
+if(this.mj===!0)return!1
 M.oR()
 M.hb()
-this.ZV=!0
-z=!!J.x(this.rF).$isOH
+this.mj=!0
+z=!!J.x(this.N1).$isfX
 y=!z
-if(y){x=this.rF
+if(y){x=this.N1
 w=J.RE(x)
 if(w.gQg(x).MW.hasAttribute("template")===!0&&C.lY.x4(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
-v=M.pZ(this.rF)
+v=M.pZ(this.N1)
 v=!!J.x(v).$isvy?v:M.SB(v)
-v.sZV(!0)
-z=!!J.x(v.grF()).$isOH
-u=!0}else{x=this.rF
+v.smj(!0)
+z=!!J.x(v.gN1()).$isfX
+u=!0}else{x=this.N1
 w=J.RE(x)
-if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.rF
+if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.N1
 w=J.RE(x)
 t=w.gM0(x).createElement("template",null)
 w.gBy(x).insertBefore(t,x)
@@ -19090,15 +19475,15 @@
 w.gQg(x).V1(0)
 w.wg(x)
 v=!!J.x(t).$isvy?t:M.SB(t)
-v.sZV(!0)
-z=!!J.x(v.grF()).$isOH}else{v=this
+v.smj(!0)
+z=!!J.x(v.gN1()).$isfX}else{v=this
 z=!1}u=!1}}else{v=this
-u=!1}if(!z)v.sBx(J.bs(M.TA(v.grF())))
-if(a!=null)v.sq4(a)
-else if(y)M.O1(v,this.rF,u)
-else M.Af(J.NQ(v))
+u=!1}if(!z)v.sjH(J.bs(M.TA(v.gN1())))
+if(a!=null)v.sQO(a)
+else if(y)M.O1(v,this.N1,u)
+else M.Af(J.Xu(v))
 return!0},
-GC:function(){return this.bt(null)},
+wo:function(){return this.wh(null)},
 $isDT:true,
 static:{"^":"mn,v2,YO,vU,xV,joK",TA:function(a){var z,y,x,w
 z=J.Do(a)
@@ -19110,7 +19495,7 @@
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
 z.gBy(a).insertBefore(y,a)
-for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.Oq(x,0)]);x.G();){w=x.lo
+for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.lo
 switch(w){case"template":v=z.gQg(a).MW
 v.getAttribute(w)
 v.removeAttribute(w)
@@ -19121,9 +19506,9 @@
 v.removeAttribute(w)
 y.setAttribute(w,u)
 break}}return y},O1:function(a,b,c){var z,y,x,w
-z=J.NQ(a)
+z=J.Xu(a)
 if(c){J.y2(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gPZ(b),w!=null;)x.mx(z,w)},Af:function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.glb(b),w!=null;)x.mx(z,w)},Af:function(a){var z,y
 z=new M.yi()
 y=J.Vj(a,$.S1())
 if(M.CF(a))z.$1(a)
@@ -19135,38 +19520,38 @@
 if($.xV===!0)return
 $.xV=!0
 z=document.createElement("template",null)
-if(!!J.x(z).$isOH){y=z.content.ownerDocument
+if(!!J.x(z).$isfX){y=z.content.ownerDocument
 if(y.documentElement==null)y.appendChild(y.createElement("html",null)).appendChild(y.createElement("head",null))
-if(J.m5(y).querySelector("base")==null)M.lo(y)}},lo:function(a){var z=a.createElement("base",null)
+if(J.m5(y).querySelector("base")==null)M.Uk(y)}},Uk:function(a){var z=a.createElement("base",null)
 J.dc(z,document.baseURI)
 J.m5(a).appendChild(z)}}},
 pi:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-J.Vs(z.rF).MW.setAttribute("ref",a)
-z.aX()},"$1",null,2,0,null,218,"call"],
+J.Vs(z.N1).MW.setAttribute("ref",a)
+z.Yo()},"$1",null,2,0,null,222,"call"],
 $isEH:true},
 yi:{
 "^":"TpZ:19;",
-$1:function(a){if(!M.SB(a).bt(null))M.Af(J.NQ(!!J.x(a).$isvy?a:M.SB(a)))},
+$1:function(a){if(!M.SB(a).wh(null))M.Af(J.Xu(!!J.x(a).$isvy?a:M.SB(a)))},
 $isEH:true},
 YJG:{
 "^":"TpZ:12;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,130,"call"],
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,133,"call"],
 $isEH:true},
 lPa:{
 "^":"TpZ:79;",
 $2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.SB(J.l2(z.gl())).aX()},"$2",null,4,0,null,172,13,"call"],
+for(z=J.mY(a);z.G();)M.SB(J.l2(z.gl())).Yo()},"$2",null,4,0,null,175,13,"call"],
 $isEH:true},
 Ufa:{
 "^":"TpZ:74;",
 $0:function(){var z=document.createDocumentFragment()
-$.vH().u(0,z,new M.Fi([],null,null,null))
+$.vH().u(0,z,new M.qdK([],null,null,null))
 return z},
 $isEH:true},
-Fi:{
-"^":"a;u2<,Qo<,Ci<,C0<"},
+qdK:{
+"^":"a;mD<,he<,Cv<,j6<"},
 hg:{
 "^":"TpZ:12;a,b,c",
 $1:function(a){return this.c.US(a,this.a,this.b)},
@@ -19187,99 +19572,99 @@
 z.push(a)
 z.push(y)}},
 $isEH:true},
-aY:{
-"^":"OC;YS,Rj,vy,S6,ky,vL,wC,D2,ts,qe,ur,VC,Wv,eY,TC",
-RV:function(a){return this.eY.$1(a)},
+TGm:{
+"^":"OC;e9,JI,d8,h5,Ag,DM,h6,Yq,xS,C8,k0,IY,vJ,DO,Fy",
+Mv:function(a){return this.DO.$1(a)},
 TR:function(a,b){return H.vh(P.w("binding already opened"))},
-gP:function(a){return this.wC},
-NC:function(){var z,y
-z=this.vL
+gP:function(a){return this.h6},
+z9:function(){var z,y
+z=this.DM
 y=J.x(z)
 if(!!y.$isOC){y.xO(z)
-this.vL=null}z=this.wC
+this.DM=null}z=this.h6
 y=J.x(z)
 if(!!y.$isOC){y.xO(z)
-this.wC=null}},
-dE:function(a,b){var z,y,x
-this.NC()
-z=this.YS.rF
-y=a.qd
+this.h6=null}},
+Bq:function(a,b){var z,y,x
+this.z9()
+z=this.e9.N1
+y=a.EI
 x=y!=null
-this.D2=x
-this.ts=a.zy!=null
-if(x){this.qe=y.wD
+this.Yq=x
+this.xS=a.Lx!=null
+if(x){this.C8=y.wD
 y=M.oO("if",y,z,b)
-this.vL=y
-if(this.qe===!0){if(!(null!=y&&!1!==y)){this.vr(null)
-return}}else H.Go(y,"$isOC").TR(0,this.gNt())}if(this.ts===!0){y=a.zy
-this.ur=y.wD
+this.DM=y
+if(this.C8===!0){if(!(null!=y&&!1!==y)){this.xY(null)
+return}}else H.Go(y,"$isOC").TR(0,this.gAJ())}if(this.xS===!0){y=a.Lx
+this.k0=y.wD
 y=M.oO("repeat",y,z,b)
-this.wC=y}else{y=a.fu
-this.ur=y.wD
+this.h6=y}else{y=a.YI
+this.k0=y.wD
 y=M.oO("bind",y,z,b)
-this.wC=y}if(this.ur!==!0)J.mu(y,this.gNt())
-this.vr(null)},
-vr:[function(a){var z,y
-if(this.D2===!0){z=this.vL
-if(this.qe!==!0){H.Go(z,"$isOC")
-z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Io([])
-return}}y=this.wC
-if(this.ur!==!0){H.Go(y,"$isOC")
-y=y.gP(y)}this.Io(this.ts!==!0?[y]:y)},"$1","gNt",2,0,19,13],
-Io:function(a){var z,y
+this.h6=y}if(this.k0!==!0)J.mu(y,this.gAJ())
+this.xY(null)},
+xY:[function(a){var z,y
+if(this.Yq===!0){z=this.DM
+if(this.C8!==!0){H.Go(z,"$isOC")
+z=z.gP(z)}if(!(null!=z&&!1!==z)){this.t3([])
+return}}y=this.h6
+if(this.k0!==!0){H.Go(y,"$isOC")
+y=y.gP(y)}this.t3(this.xS!==!0?[y]:y)},"$1","gAJ",2,0,19,13],
+t3:function(a){var z,y
 z=J.x(a)
 if(!z.$isWO)a=!!z.$isQV?z.br(a):[]
-z=this.vy
+z=this.d8
 if(a===z)return
-this.Ke()
-this.S6=a
-if(!!J.x(a).$iswn&&this.ts===!0&&this.ur!==!0){if(a.gb3()!=null)a.sb3([])
-this.VC=a.gQV().yI(this.gU0())}y=this.S6
+this.R5()
+this.h5=a
+if(!!J.x(a).$iswn&&this.xS===!0&&this.k0!==!0){if(a.gSE()!=null)a.sSE([])
+this.IY=a.gQV().yI(this.gLH())}y=this.h5
 y=y!=null?y:[]
-this.lw(G.jj(y,0,J.q8(y),z,0,z.length))},
-xS:function(a){var z,y,x,w
-if(J.xC(a,-1))return this.YS.rF
+this.lC(G.jj(y,0,J.q8(y),z,0,z.length))},
+OW:function(a){var z,y,x,w
+if(J.xC(a,-1))return this.e9.N1
 z=$.vH()
-y=this.Rj
+y=this.JI
 if(a>>>0!==a||a>=y.length)return H.e(y,a)
-x=z.t(0,y[a]).gQo()
-if(x==null)return this.xS(a-1)
-if(!M.CF(x)||x===this.YS.rF)return x
-w=M.SB(x).gos()
+x=z.t(0,y[a]).ghe()
+if(x==null)return this.OW(a-1)
+if(!M.CF(x)||x===this.e9.N1)return x
+w=M.SB(x).gF3()
 if(w==null)return x
-return w.xS(w.Rj.length-1)},
-ne:function(a){var z,y,x,w,v,u,t
-z=this.xS(J.Hn(a,1))
-y=this.xS(a)
-J.TmB(this.YS.rF)
-x=C.Nm.W4(this.Rj,a)
+return w.OW(w.JI.length-1)},
+nV:function(a){var z,y,x,w,v,u,t
+z=this.OW(J.Hn(a,1))
+y=this.OW(a)
+J.TmB(this.e9.N1)
+x=C.Nm.W4(this.JI,a)
 for(w=J.RE(x),v=J.RE(z);!J.xC(y,z);){u=v.guD(z)
 if(u==null?y==null:u===y)y=z
 t=u.parentNode
 if(t!=null)t.removeChild(u)
 w.mx(x,u)}return x},
-lw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
-if(this.ky||J.FN(a)===!0)return
-u=this.YS
-t=u.rF
+lC:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
+if(this.Ag||J.FN(a)===!0)return
+u=this.e9
+t=u.N1
 if(J.TmB(t)==null){this.xO(0)
-return}s=this.vy
-Q.Y5(s,this.S6,a)
-z=u.nF
-if(!this.Wv){this.Wv=!0
-r=J.fx(!!J.x(u.rF).$isDT?u.rF:u)
-if(r!=null){this.eY=r.Mn.CE(t)
-this.TC=null}}q=P.YM(P.N3R(),null,null,null,null)
+return}s=this.d8
+Q.Y5(s,this.h5,a)
+z=u.dH
+if(!this.vJ){this.vJ=!0
+r=J.qy(!!J.x(u.N1).$isDT?u.N1:u)
+if(r!=null){this.DO=r.Mn.A5(t)
+this.Fy=null}}q=P.YM(P.N3R(),null,null,null,null)
 for(p=J.w1(a),o=p.gA(a),n=0;o.G();){m=o.gl()
 for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.lo
-i=this.ne(J.ew(k.gvH(m),n))
+i=this.nV(J.ew(k.gvH(m),n))
 if(!J.xC(i,$.zl()))q.u(0,j,i)}l=m.gNg()
 if(typeof l!=="number")return H.s(l)
 n-=l}for(p=p.gA(a);p.G();){m=p.gl()
 for(o=J.RE(m),h=o.gvH(m);J.u6(h,J.ew(o.gvH(m),m.gNg()));++h){if(h>>>0!==h||h>=s.length)return H.e(s,h)
 y=s[h]
 x=q.Rz(0,y)
-if(x==null)try{if(this.eY!=null)y=this.RV(y)
+if(x==null)try{if(this.DO!=null)y=this.Mv(y)
 if(y==null)x=$.zl()
 else x=u.ZK(0,y,z)}catch(g){l=H.Ru(g)
 w=l
@@ -19292,55 +19677,55 @@
 if(l.Gv!==0)H.vh(P.w("Future already completed"))
 l.CG(k,v)
 x=$.zl()}l=x
-f=this.xS(h-1)
-e=J.TmB(u.rF)
-C.Nm.xe(this.Rj,h,l)
-e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.Oq(u,0),H.Oq(u,1)]);u.G();)this.Ep(u.lo)},"$1","gU0",2,0,219,220],
-Ep:[function(a){var z,y,x
+f=this.OW(h-1)
+e=J.TmB(u.N1)
+C.Nm.xe(this.JI,h,l)
+e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.u3(u,0),H.u3(u,1)]);u.G();)this.ET(u.lo)},"$1","gLH",2,0,223,224],
+ET:[function(a){var z,y,x
 z=$.vH()
 z.toString
 y=H.of(a,"expando$values")
-x=(y==null?null:H.of(y,z.J4())).gu2()
+x=(y==null?null:H.of(y,z.YV())).gmD()
 z=new H.a7(x,x.length,0,null)
-z.$builtinTypeInfo=[H.Oq(x,0)]
-for(;z.G();)J.yd(z.lo)},"$1","gV6",2,0,221],
-Ke:function(){var z=this.VC
+z.$builtinTypeInfo=[H.u3(x,0)]
+for(;z.G();)J.yd(z.lo)},"$1","gvi",2,0,225],
+R5:function(){var z=this.IY
 if(z==null)return
 z.ed()
-this.VC=null},
+this.IY=null},
 xO:function(a){var z
-if(this.ky)return
-this.Ke()
-z=this.Rj
-H.bQ(z,this.gV6())
+if(this.Ag)return
+this.R5()
+z=this.JI
+H.bQ(z,this.gvi())
 C.Nm.sB(z,0)
-this.NC()
-this.YS.os=null
-this.ky=!0}},
+this.z9()
+this.e9.F3=null
+this.Ag=!0}},
 XT:{
-"^":"vy;rF,Cd,Vw",
+"^":"vy;N1,Cd,Xl",
 nR:function(a,b,c,d){var z
 if(!J.xC(b,"text"))return M.vy.prototype.nR.call(this,this,b,c,d)
 if(d){z=c==null?"":H.d(c)
-J.t3(this.rF,z)
-return}z=this.gmt()
+J.t3(this.N1,z)
+return}z=this.gBS()
 z.$1(J.mu(c,z))
-return $.rK?this.Un(b,c):c},
-lrv:[function(a){var z=a==null?"":H.d(a)
-J.t3(this.rF,z)},"$1","gmt",2,0,12,20]},
+return $.rK?this.Zr(b,c):c},
+un:[function(a){var z=a==null?"":H.d(a)
+J.t3(this.N1,z)},"$1","gBS",2,0,12,20]},
 VT:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
+"^":"V2;N1,Cd,Xl",
+gN1:function(){return this.N1},
 nR:function(a,b,c,d){var z,y,x
 if(!J.xC(b,"value"))return M.V2.prototype.nR.call(this,this,b,c,d)
-J.Vs(this.rF).Rz(0,b)
-if(d){M.pw(this.rF,c,b)
-return}z=this.rF
+J.Vs(this.N1).Rz(0,b)
+if(d){M.pw(this.N1,c,b)
+return}z=this.N1
 y=new M.b2(z,null,c,b)
-y.E3=M.IPt(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return $.rK?this.Un(b,y):y}}}],["template_binding.src.mustache_tokens","package:template_binding/src/mustache_tokens.dart",,S,{
+y.Ca=M.IPt(z).yI(y.gd1())
+x=y.gRD()
+M.pw(z,J.mu(y.Oi,x),b)
+return $.rK?this.Zr(b,y):y}}}],["","",,S,{
 "^":"",
 jb:{
 "^":"a;iB,wD<,UV",
@@ -19378,8 +19763,8 @@
 x=z.length
 w=C.jn.cU(x,4)*4
 if(w>=x)return H.e(z,w)
-return y+H.d(z[w])},"$1","geb",2,0,222,20],
-Xb:[function(a){var z,y,x,w,v,u,t,s
+return y+H.d(z[w])},"$1","geb",2,0,226,20],
+eF:[function(a){var z,y,x,w,v,u,t,s
 z=this.iB
 if(0>=z.length)return H.e(z,0)
 y=P.p9(z[0])
@@ -19389,7 +19774,7 @@
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gqt",2,0,223,224],
+y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gqt",2,0,227,228],
 l3:function(a,b){this.UV=this.iB.length===5?this.geb():this.gqt()},
 static:{"^":"rz5,xN8,t3a,epG,oM,Ftg",j9:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 if(a==null||a.length===0)return
@@ -19416,10 +19801,10 @@
 v=o+2}if(v===z)w.push("")
 y=new S.jb(w,u,null)
 y.l3(w,u)
-return y}}}}],["vm_connect_element","package:observatory/src/elements/vm_connect.dart",,V,{
+return y}}}}],["","",,V,{
 "^":"",
 Pa:{
-"^":"V52;P5,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V52;P5,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gN:function(a){return a.P5},
 sN:function(a,b){a.P5=this.ct(a,C.ft,a.P5,b)},
 ghS:function(a){var z=a.P5
@@ -19428,7 +19813,7 @@
 gnI:function(a){var z=$.Kh.Eh
 if(z==null)return!1
 return J.xC(H.Go(z,"$isKM").N,a.P5)},
-xX:[function(a,b,c,d){var z,y,x,w
+Ke:[function(a,b,c,d){var z,y,x,w
 z=J.RE(b)
 y=z.gpL(b)
 if(typeof y!=="number")return y.D()
@@ -19437,25 +19822,25 @@
 x=$.Kh.Eh
 if(x==null||!J.xC(J.l2(x),a.P5)){z=$.Kh
 y=a.P5
-y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 y.Lw()
 z.swv(0,y)}w=J.Vs(d).MW.getAttribute("href")
-$.Kh.Z6.bo(0,w)},"$3","gkD",6,0,162,143,102,175],
+$.Kh.Z6.bo(0,w)},"$3","gkD",6,0,165,85,104,178],
 MeB:[function(a,b,c,d){var z,y,x,w
 z=$.Kh.m2
 y=a.P5
-x=z.jY
+x=z.bq
 x.Rz(0,y)
 z.XT()
 z.XT()
 w=z.wu.IU+".history"
-$.Vy().setItem(w,C.xr.KP(x))},"$3","gAS",6,0,162,143,102,175],
+$.Vy().setItem(w,C.xr.KP(x))},"$3","gAS",6,0,165,85,104,178],
 static:{fXx:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -19466,7 +19851,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 D2:{
-"^":"V53;ot,YE,lr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V53;ot,YE,lr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gvm:function(a){return a.ot},
 svm:function(a,b){a.ot=this.ct(a,C.uX,a.ot,b)},
 gHL:function(a){return a.YE},
@@ -19476,22 +19861,22 @@
 yY:function(a){this.Vf(a)},
 Kl:function(a,b){if(J.co(b,"ws://"))return b
 return"ws://"+H.d(b)+"/ws"},
-ny:[function(a,b,c,d){var z,y,x
+nyC:[function(a,b,c,d){var z,y,x
 J.Kr(b)
 z=this.Kl(a,a.ot)
 d=$.Kh.m2.TP(z)
 y=$.Kh
-x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 x.Lw()
 y.swv(0,x)
-$.Kh.Z6.bo(0,"#/vm")},"$3","gMt",6,0,111,2,102,103],
+$.Kh.Z6.bo(0,"#/vm")},"$3","gMt",6,0,113,2,104,105],
 qf:[function(a,b,c,d){J.Kr(b)
-this.Vf(a)},"$3","gzG",6,0,111,2,102,103],
-Vf:function(a){G.FI(a.YE).ml(new V.Vn(a)).OA(new V.oU(a))},
-Kq:function(a){var z=P.ii(0,0,0,0,0,1)
+this.Vf(a)},"$3","gzG",6,0,113,2,104,105],
+Vf:function(a){G.n8(a.YE).ml(new V.Vn(a)).OA(new V.oU(a))},
+U2:function(a){var z=P.ii(0,0,0,0,0,1)
 a.tB=this.ct(a,C.O9,a.tB,z)},
 static:{NI:function(a){var z,y,x
-z=Q.ch(null,U.Z5)
+z=Q.ch(null,L.Z5)
 y=P.L5(null,null,null,P.qU,W.I0)
 x=P.qU
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
@@ -19499,13 +19884,13 @@
 a.YE="localhost:9222"
 a.lr=z
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=y
 a.ZQ=x
 C.aXh.ZL(a)
 C.aXh.XI(a)
-C.aXh.Kq(a)
+C.aXh.U2(a)
 return a}}},
 V53:{
 "^":"uL+Pi;",
@@ -19522,42 +19907,42 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 c$0:{if(y.t(a,x).gw8()==null)break c$0
-J.bi(z.lr,y.t(a,x))}++x}},"$1",null,2,0,null,225,"call"],
+J.bi(z.lr,y.t(a,x))}++x}},"$1",null,2,0,null,229,"call"],
 $isEH:true},
 oU:{
 "^":"TpZ:12;b",
 $1:[function(a){J.Z8(this.b.lr)},"$1",null,2,0,null,2,"call"],
-$isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
+$isEH:true}}],["","",,X,{
 "^":"",
 I5:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
-static:{vC:function(a){var z,y
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
+static:{yC:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.vA.ZL(a)
 C.vA.XI(a)
-return a}}}}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
+return a}}}}],["","",,U,{
 "^":"",
 el:{
-"^":"V54;uB,lc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V54;uB,lc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gwv:function(a){return a.uB},
 swv:function(a,b){a.uB=this.ct(a,C.RJ,a.uB,b)},
 gkc:function(a){return a.lc},
 skc:function(a,b){a.lc=this.ct(a,C.yh,a.lc,b)},
-SK:[function(a,b){J.cI(a.uB).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.uB).YM(b)},"$1","gvC",2,0,19,100],
 static:{oH:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -19610,13 +19995,13 @@
 y.$ish4=z
 y.$isKV=z
 y.$isa=z
+P.ns.$isa=z
 P.oz.$isa=z
 P.a.$isa=z
 y=P.WO
 y.$isWO=z
 y.$isQV=z
 y.$isa=z
-P.ns.$isa=z
 y=K.Aep
 y.$isAep=z
 y.$isa=z
@@ -19629,8 +20014,8 @@
 y=U.uku
 y.$isIp=z
 y.$isa=z
-y=U.fp
-y.$isfp=z
+y=U.elO
+y.$iselO=z
 y.$isIp=z
 y.$isa=z
 y=U.ae
@@ -19642,7 +20027,7 @@
 y=U.c0
 y.$isIp=z
 y.$isa=z
-y=U.no
+y=U.noG
 y.$isIp=z
 y.$isa=z
 y=U.Nb
@@ -19673,7 +20058,7 @@
 y.$ish4=z
 y.$isKV=z
 y.$isa=z
-y=U.U2
+y=L.U2
 y.$isU2=z
 y.$isa=z
 y=D.af
@@ -19712,9 +20097,7 @@
 y=G.DA
 y.$isDA=z
 y.$isa=z
-D.Z9.$isa=z
 y=W.BI
-y.$isBI=z
 y.$isea=z
 y.$isa=z
 y=W.ea
@@ -19730,6 +20113,7 @@
 y=P.a2
 y.$isa2=z
 y.$isa=z
+D.Z9.$isa=z
 W.fJ.$isa=z
 y=W.ew7
 y.$isea=z
@@ -19750,18 +20134,19 @@
 y.$isa=z
 G.OS.$isa=z
 y=D.Mk
+y.$isMk=z
 y.$isaf=z
 y.$isa=z
 y=W.f5
 y.$isf5=z
 y.$isea=z
 y.$isa=z
-P.A5.$isa=z
+P.A0.$isa=z
 y=W.PGY
 y.$isea=z
 y.$isa=z
-y=L.Tv
-y.$isTv=z
+y=L.Zl
+y.$isZl=z
 y.$isa=z
 K.GK.$isa=z
 y=N.HV
@@ -19784,7 +20169,7 @@
 y=U.Ip
 y.$isIp=z
 y.$isa=z
-y=U.Z5
+y=L.Z5
 y.$isZ5=z
 y.$isa=z
 G.Ni.$isa=z
@@ -19806,8 +20191,8 @@
 y.$isNOT=z
 y.$isyX=z
 y.$isa=z
-y=P.e4y
-y.$ise4y=z
+y=P.AN
+y.$isAN=z
 y.$isa=z
 y=P.dl
 y.$isdl=z
@@ -19821,8 +20206,8 @@
 y=P.Z0
 y.$isZ0=z
 y.$isa=z
-y=P.Xa
-y.$isXa=z
+y=P.kWp
+y.$iskWp=z
 y.$isa=z
 y=P.QV
 y.$isQV=z
@@ -19868,8 +20253,8 @@
 y=A.Wq
 y.$isWq=z
 y.$isa=z
-y=L.AR
-y.$isAR=z
+y=L.lg
+y.$islg=z
 y.$isOC=z
 y.$isa=z
 y=W.hsw
@@ -19884,13 +20269,13 @@
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
+return J.Dx(a)}
 J.U6=function(a){if(typeof a=="string")return J.O.prototype
 if(a==null)return a
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
+return J.Dx(a)}
 J.Wx=function(a){if(typeof a=="number")return J.P.prototype
 if(a==null)return a
 if(!(a instanceof P.a))return J.kdQ.prototype
@@ -19903,27 +20288,29 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
-J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.Xh.prototype
-return J.VA.prototype}if(typeof a=="string")return J.O.prototype
+return J.Dx(a)}
+J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
+return J.VA7.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.CDU.prototype
 if(typeof a=="boolean")return J.yEe.prototype
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
+return J.Dx(a)}
 J.A1=function(a,b){return J.RE(a).seT(a,b)}
 J.A4=function(a,b){return J.RE(a).sjx(a,b)}
-J.A6=function(a){return J.RE(a).gG3(a)}
 J.AF=function(a){return J.RE(a).gIi(a)}
 J.AG=function(a){return J.x(a).bu(a)}
 J.AI=function(a,b){return J.RE(a).su6(a,b)}
 J.AL=function(a){return J.RE(a).gW6(a)}
+J.AR=function(a){return J.RE(a).gWt(a)}
 J.Ac=function(a,b){return J.RE(a).siZ(a,b)}
 J.Ae=function(a,b){return J.RE(a).sd4(a,b)}
+J.At=function(a){return J.RE(a).gvC(a)}
 J.Aw=function(a){return J.RE(a).gb6(a)}
 J.B9=function(a,b){return J.RE(a).shN(a,b)}
 J.BC=function(a,b){return J.RE(a).sja(a,b)}
+J.BL=function(a,b){return J.RE(a).sRd(a,b)}
 J.BT=function(a){return J.RE(a).gNG(a)}
 J.BZ=function(a){return J.RE(a).gnv(a)}
 J.Bj=function(a,b){return J.RE(a).Tk(a,b)}
@@ -19931,18 +20318,17 @@
 return J.Wx(a).E(a,b)}
 J.By=function(a,b){return J.RE(a).sLW(a,b)}
 J.C3=function(a,b){return J.RE(a).sig(a,b)}
+J.C7=function(a){return J.RE(a).gLc(a)}
 J.C8=function(a){return J.RE(a).gSO(a)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
 J.CN=function(a){return J.RE(a).gd0(a)}
 J.Cg=function(a){return J.RE(a).goL(a)}
 J.Cl=function(a,b){return J.Wx(a).Z(a,b)}
-J.Cm=function(a){return J.RE(a).gvC(a)}
-J.Cr=function(a){return J.RE(a).gEQ(a)}
 J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
+J.D4=function(a,b){return J.RE(a).sA0(a,b)}
 J.DB=function(a){return J.RE(a).gn0(a)}
 J.DF=function(a,b){return J.RE(a).soc(a,b)}
 J.DO=function(a){return J.RE(a).gR(a)}
-J.DP=function(a,b,c){return J.U6(a).XU(a,b,c)}
 J.Dh=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
 J.Do=function(a){return J.RE(a).gM0(a)}
 J.Ds=function(a){return J.RE(a).gPj(a)}
@@ -19956,10 +20342,15 @@
 J.Er=function(a){return J.RE(a).gu6(a)}
 J.Ew=function(a){return J.RE(a).gkm(a)}
 J.F9=function(a){return J.RE(a).gvm(a)}
+J.FH=function(a,b){return J.RE(a).sVX(a,b)}
+J.FI=function(a,b){return J.RE(a).sih(a,b)}
 J.FN=function(a){return J.U6(a).gl0(a)}
 J.FS=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
 J.FW=function(a,b){return J.Qc(a).iM(a,b)}
+J.FY=function(a){return J.RE(a).gKJ(a)}
 J.Fd=function(a,b,c){return J.w1(a).aM(a,b,c)}
+J.Fy=function(a){return J.RE(a).h9(a)}
+J.G0=function(a,b,c){return J.U6(a).XU(a,b,c)}
 J.GH=function(a){return J.RE(a).gyW(a)}
 J.GJ=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
 J.GL=function(a){return J.RE(a).gfN(a)}
@@ -19971,12 +20362,14 @@
 J.H4=function(a,b){return J.RE(a).wR(a,b)}
 J.HB=function(a){return J.RE(a).gxT(a)}
 J.HP=function(a){return J.RE(a).gFK(a)}
-J.Ha=function(a,b,c){return J.RE(a).ek(a,b,c)}
+J.HT=function(a,b){return J.RE(a).sLc(a,b)}
+J.Hg=function(a){return J.RE(a).gYe(a)}
 J.Hh=function(a){return J.Wx(a).yu(a)}
 J.Hn=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
 return J.Wx(a).W(a,b)}
 J.I2=function(a){return J.RE(a).gwv(a)}
 J.IA=function(a){return J.RE(a).gjT(a)}
+J.II=function(a){return J.w1(a).Jd(a)}
 J.IO=function(a){return J.RE(a).gRH(a)}
 J.IP=function(a){return J.RE(a).gSs(a)}
 J.IR=function(a){return J.RE(a).gYt(a)}
@@ -20002,7 +20395,9 @@
 J.Kd=function(a){return J.RE(a).gCF(a)}
 J.Kl=function(a){return J.RE(a).gBP(a)}
 J.Kr=function(a){return J.RE(a).e6(a)}
+J.Kt=function(a){return J.RE(a).gG3(a)}
 J.Ky=function(a){return J.RE(a).gRk(a)}
+J.L1=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
 J.L6=function(a){return J.RE(a).glD(a)}
 J.L9=function(a,b){return J.RE(a).sdU(a,b)}
 J.LB=function(a){return J.RE(a).gX0(a)}
@@ -20010,7 +20405,7 @@
 J.LL=function(a){return J.Wx(a).HG(a)}
 J.LM=function(a,b){return J.RE(a).szj(a,b)}
 J.Ld=function(a,b){return J.w1(a).eR(a,b)}
-J.Lh=function(a){return J.RE(a).gff(a)}
+J.Lh=function(a,b,c){return J.RE(a).ek(a,b,c)}
 J.Lm=function(a){return J.x(a).gbx(a)}
 J.Ln=function(a){return J.RE(a).gdU(a)}
 J.Lp=function(a){return J.RE(a).geT(a)}
@@ -20018,9 +20413,10 @@
 J.MB=function(a){return J.RE(a).gzG(a)}
 J.ME=function(a,b){return J.RE(a).sUo(a,b)}
 J.MO=function(a,b,c){return J.RE(a).ZK(a,b,c)}
+J.MU=function(a){return J.RE(a).Fc(a)}
 J.MX=function(a,b){return J.RE(a).sPj(a,b)}
 J.Me=function(a,b){return J.w1(a).aN(a,b)}
-J.Mh=function(a){return J.RE(a).gMt(a)}
+J.Mh=function(a,b){return J.RE(a).sTj(a,b)}
 J.Mo=function(a){return J.RE(a).gx6(a)}
 J.Mp=function(a){return J.w1(a).wg(a)}
 J.Mx=function(a){return J.RE(a).gks(a)}
@@ -20030,10 +20426,10 @@
 J.NC=function(a){return J.RE(a).gHy(a)}
 J.NE=function(a,b){return J.RE(a).sHL(a,b)}
 J.NO=function(a,b){return J.RE(a).soE(a,b)}
-J.NQ=function(a){return J.RE(a).gjb(a)}
 J.NT=function(a,b,c){return J.U6(a).eM(a,b,c)}
 J.NV=function(a,b){return J.RE(a).sKw(a,b)}
 J.NZ=function(a,b){return J.RE(a).sRu(a,b)}
+J.Nd=function(a){return J.w1(a).br(a)}
 J.Nf=function(a,b){return J.RE(a).syw(a,b)}
 J.Nj=function(a,b,c){return J.rY(a).Nj(a,b,c)}
 J.No=function(a,b){return J.RE(a).sR(a,b)}
@@ -20042,16 +20438,17 @@
 J.O6=function(a){return J.RE(a).goc(a)}
 J.OB=function(a){return J.RE(a).gfg(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
+J.OH=function(a,b){return J.RE(a).sMZ(a,b)}
 J.OT=function(a){return J.RE(a).gXE(a)}
 J.Ok=function(a){return J.RE(a).ghU(a)}
 J.P2=function(a,b){return J.RE(a).sU4(a,b)}
-J.P4=function(a){return J.RE(a).gVr(a)}
 J.PN=function(a,b){return J.RE(a).sCI(a,b)}
 J.PP=function(a,b){return J.RE(a).snv(a,b)}
 J.PY=function(a){return J.RE(a).goN(a)}
 J.Pf=function(a){return J.RE(a).gWw(a)}
 J.Pl=function(a,b){return J.RE(a).sM6(a,b)}
 J.Pp=function(a,b){return J.rY(a).j(a,b)}
+J.Pq=function(a){return J.RE(a).gqF(a)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
 J.Q2=function(a){return J.RE(a).gO3(a)}
 J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
@@ -20071,6 +20468,7 @@
 J.RC=function(a){return J.RE(a).gTA(a)}
 J.RX=function(a,b){return J.RE(a).sjl(a,b)}
 J.Rg=function(a){return J.x(a).gAY(a)}
+J.Rp=function(a,b){return J.RE(a).sod(a,b)}
 J.Ry=function(a){return J.RE(a).gLW(a)}
 J.SF=function(a,b){return J.RE(a).sIi(a,b)}
 J.SG=function(a){return J.RE(a).gDI(a)}
@@ -20079,7 +20477,9 @@
 J.SO=function(a,b){return J.RE(a).sCF(a,b)}
 J.Sf=function(a,b){return J.RE(a).sXE(a,b)}
 J.Sj=function(a,b){return J.RE(a).svC(a,b)}
+J.Sl=function(a){return J.RE(a).gxb(a)}
 J.So=function(a,b){return J.RE(a).X3(a,b)}
+J.Sr=function(a){return J.RE(a).gvq(a)}
 J.T5=function(a,b){return J.RE(a).stT(a,b)}
 J.TG=function(a){return J.RE(a).mC(a)}
 J.TM=function(a){return J.RE(a).gOd(a)}
@@ -20090,21 +20490,19 @@
 J.TmB=function(a){return J.RE(a).gBy(a)}
 J.Tr=function(a){return J.RE(a).gCj(a)}
 J.Ts=function(a){return J.RE(a).gfG(a)}
+J.Tv=function(a){return J.RE(a).gB1(a)}
 J.Tx=function(a,b){return J.RE(a).spf(a,b)}
-J.U8=function(a){return J.RE(a).gUQ(a)}
-J.UA=function(a){return J.RE(a).gP2(a)}
+J.U8=function(a){return J.RE(a).gEQ(a)}
 J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
 return J.Wx(a).w(a,b)}
 J.UP=function(a){return J.RE(a).gnZ(a)}
 J.UQ=function(a,b){if(a.constructor==Array||typeof a=="string"||H.Gp(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
 return J.U6(a).t(a,b)}
-J.US=function(a){return J.RE(a).gWt(a)}
 J.UT=function(a){return J.RE(a).gDQ(a)}
 J.Uf=function(a){return J.RE(a).gDD(a)}
 J.Uv=function(a,b){return J.RE(a).WO(a,b)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
-J.V5=function(a,b,c,d){return J.RE(a).Yb(a,b,c,d)}
-J.VL=function(a){return J.RE(a).gR2(a)}
+J.VA=function(a,b){return J.w1(a).Vr(a,b)}
 J.VZ=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
 J.Vf=function(a){return J.RE(a).gVE(a)}
 J.Vj=function(a,b){return J.RE(a).Md(a,b)}
@@ -20117,6 +20515,7 @@
 J.WI=function(a,b){return J.RE(a).sLF(a,b)}
 J.WT=function(a){return J.RE(a).gFR(a)}
 J.WX=function(a){return J.RE(a).gbJ(a)}
+J.Wa=function(a,b){return J.U6(a).Mw(a,b)}
 J.Wk=function(a){return J.RE(a).gc9(a)}
 J.Wp=function(a){return J.RE(a).gQU(a)}
 J.Wy=function(a,b){return J.RE(a).sBk(a,b)}
@@ -20125,8 +20524,11 @@
 return J.Wx(a).V(a,b)}
 J.XF=function(a,b){return J.RE(a).siC(a,b)}
 J.XJ=function(a){return J.RE(a).gRY(a)}
+J.Xf=function(a){return J.RE(a).gbq(a)}
 J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
 J.Xi=function(a){return J.RE(a).gr9(a)}
+J.Xu=function(a){return J.RE(a).gq1(a)}
+J.YG=function(a){return J.RE(a).gQP(a)}
 J.YH=function(a){return J.RE(a).gpM(a)}
 J.YQ=function(a){return J.RE(a).gPL(a)}
 J.Yf=function(a){return J.w1(a).gIr(a)}
@@ -20147,6 +20549,7 @@
 J.a3=function(a){return J.RE(a).gBk(a)}
 J.aA=function(a){return J.RE(a).gzY(a)}
 J.aB=function(a){return J.RE(a).gql(a)}
+J.aN=function(a){return J.RE(a).fV(a)}
 J.aT=function(a){return J.RE(a).god(a)}
 J.aW=function(a){return J.RE(a).gJp(a)}
 J.au=function(a,b){return J.RE(a).sNG(a,b)}
@@ -20155,9 +20558,10 @@
 J.bH=function(a,b,c,d){return J.RE(a).ea(a,b,c,d)}
 J.bL=function(a){return J.RE(a).ghS(a)}
 J.bN=function(a,b){return J.RE(a).GE(a,b)}
+J.bS=function(a){return J.RE(a).gUo(a)}
+J.bh=function(a){return J.RE(a).gLf(a)}
 J.bi=function(a,b){return J.w1(a).h(a,b)}
 J.bj=function(a,b){return J.w1(a).FV(a,b)}
-J.br=function(a){return J.RE(a).gj8(a)}
 J.bs=function(a){return J.RE(a).JP(a)}
 J.bu=function(a){return J.RE(a).gyw(a)}
 J.cG=function(a){return J.RE(a).Ki(a)}
@@ -20165,38 +20569,40 @@
 J.cO=function(a){return J.RE(a).gjx(a)}
 J.cU=function(a){return J.RE(a).gHh(a)}
 J.cV=function(a,b){return J.RE(a).sjT(a,b)}
+J.cZ=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
 J.cj=function(a){return J.RE(a).gMT(a)}
 J.cl=function(a,b){return J.RE(a).sHt(a,b)}
 J.co=function(a,b){return J.rY(a).nC(a,b)}
 J.cs=function(a){return J.RE(a).gwJ(a)}
 J.d5=function(a){return J.Wx(a).gKy(a)}
-J.d7=function(a){return J.RE(a).giG(a)}
 J.dA=function(a){return J.RE(a).gV5(a)}
 J.dF=function(a){return J.w1(a).zH(a)}
 J.dY=function(a){return J.RE(a).ga4(a)}
 J.dc=function(a,b){return J.RE(a).smH(a,b)}
 J.de=function(a){return J.RE(a).gGd(a)}
-J.df=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
+J.df=function(a){return J.RE(a).QE(a)}
 J.dk=function(a,b){return J.RE(a).sMj(a,b)}
 J.du=function(a){return J.RE(a).gUj(a)}
+J.dw=function(a){return J.RE(a).gMt(a)}
 J.eS=function(a){return J.RE(a).gjO(a)}
 J.eT=function(a){return J.RE(a).gnD(a)}
 J.eU=function(a){return J.RE(a).gRh(a)}
 J.ee=function(a){return J.RE(a).giC(a)}
 J.eg=function(a){return J.RE(a).Ms(a)}
-J.et=function(a,b){return J.U6(a).kJ(a,b)}
 J.ew=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
 return J.Qc(a).g(a,b)}
+J.f2=function(a){return J.RE(a).gRd(a)}
 J.fD=function(a,b){return J.RE(a).Id(a,b)}
-J.fR=function(a,b){return J.RE(a).sMZ(a,b)}
 J.fU=function(a){return J.RE(a).gDX(a)}
 J.fa=function(a,b){return J.RE(a).sEQ(a,b)}
 J.fb=function(a,b){return J.RE(a).sql(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
 J.fi=function(a,b){return J.RE(a).ps(a,b)}
-J.fx=function(a){return J.RE(a).gG5(a)}
+J.fp=function(a){return J.RE(a).yy(a)}
+J.fy=function(a){return J.RE(a).gTj(a)}
 J.h6=function(a){return J.RE(a).gML(a)}
 J.h9=function(a,b){return J.RE(a).sWA(a,b)}
+J.hI=function(a){return J.RE(a).gUQ(a)}
 J.hS=function(a,b){return J.w1(a).srZ(a,b)}
 J.hh=function(a,b){return J.Wx(a).Y(a,b)}
 J.hn=function(a){return J.RE(a).gEu(a)}
@@ -20207,7 +20613,6 @@
 J.iL=function(a){return J.RE(a).gNb(a)}
 J.iM=function(a,b){return J.RE(a).st5(a,b)}
 J.iS=function(a){return J.RE(a).gox(a)}
-J.iY=function(a){return J.RE(a).gvc(a)}
 J.id=function(a){return J.RE(a).gR1(a)}
 J.ih=function(a){return J.RE(a).ga5(a)}
 J.io=function(a){return J.RE(a).gja(a)}
@@ -20234,7 +20639,6 @@
 J.kX=function(a,b){return J.RE(a).sNb(a,b)}
 J.kZ=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
 J.kl=function(a,b){return J.w1(a).ez(a,b)}
-J.ks=function(a){return J.RE(a).gB1(a)}
 J.kv=function(a){return J.RE(a).gDf(a)}
 J.ky=function(a,b,c){return J.RE(a).dR(a,b,c)}
 J.l2=function(a){return J.RE(a).gN(a)}
@@ -20245,8 +20649,8 @@
 J.lk=function(a){return J.RE(a).gRq(a)}
 J.m4=function(a){return J.RE(a).gig(a)}
 J.m5=function(a){return J.RE(a).gQr(a)}
+J.m8=function(a){return J.RE(a).gR2(a)}
 J.mB=function(a){return J.RE(a).Zi(a)}
-J.mI=function(a,b){return J.RE(a).rW(a,b)}
 J.mP=function(a){return J.RE(a).gzj(a)}
 J.mU=function(a,b){return J.RE(a).skm(a,b)}
 J.mY=function(a){return J.w1(a).gA(a)}
@@ -20254,15 +20658,15 @@
 J.my=function(a,b){return J.RE(a).sQl(a,b)}
 J.mz=function(a,b){return J.RE(a).scH(a,b)}
 J.n0=function(a,b){return J.RE(a).Rf(a,b)}
-J.n8=function(a){return J.RE(a).gUo(a)}
 J.n9=function(a){return J.RE(a).gQq(a)}
 J.nA=function(a,b){return J.RE(a).sPL(a,b)}
 J.nC=function(a,b){return J.RE(a).sCd(a,b)}
-J.nE1=function(a,b){return J.w1(a).ou(a,b)}
 J.nG=function(a){return J.RE(a).gv8(a)}
 J.nb=function(a){return J.RE(a).gyX(a)}
 J.nq=function(a){return J.RE(a).gFL(a)}
 J.o4=function(a){return J.RE(a).gAS(a)}
+J.o8=function(a,b){return J.RE(a).sqF(a,b)}
+J.o9=function(a){return J.RE(a).gP2(a)}
 J.oD=function(a,b){return J.RE(a).hP(a,b)}
 J.oJ=function(a,b){return J.RE(a).srs(a,b)}
 J.oN=function(a){return J.RE(a).gj4(a)}
@@ -20279,22 +20683,21 @@
 J.pm=function(a){return J.RE(a).gt0(a)}
 J.q0=function(a,b){return J.RE(a).syG(a,b)}
 J.q8=function(a){return J.U6(a).gB(a)}
-J.qA=function(a){return J.w1(a).br(a)}
-J.qD=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.ql=function(a){return J.RE(a).gaB(a)}
 J.qq=function(a){return J.RE(a).dQ(a)}
 J.qv=function(a){return J.RE(a).pj(a)}
+J.qy=function(a){return J.RE(a).gA0(a)}
 J.r0=function(a){return J.RE(a).gi6(a)}
-J.rA=function(a,b){return J.w1(a).Nk(a,b)}
+J.r5=function(a,b,c){return J.RE(a).aD(a,b,c)}
+J.r8=function(a,b){return J.w1(a).Nk(a,b)}
 J.ra=function(a){return J.RE(a).gJ6(a)}
+J.rg=function(a,b){return J.RE(a).Gy(a,b)}
 J.rr=function(a){return J.rY(a).bS(a)}
 J.rw=function(a){return J.RE(a).gMl(a)}
-J.ry=function(a){return J.RE(a).gYe(a)}
 J.t3=function(a,b){return J.RE(a).sa4(a,b)}
 J.t8=function(a){return J.RE(a).gYQ(a)}
-J.tC=function(a){return J.RE(a).gjY(a)}
+J.tC=function(a){return J.RE(a).gj8(a)}
 J.tH=function(a,b){return J.RE(a).sHy(a,b)}
-J.tO=function(a){return J.w1(a).Jd(a)}
 J.tQ=function(a,b){return J.RE(a).swv(a,b)}
 J.tT=function(a,b,c){return J.RE(a).X6(a,b,c)}
 J.ta=function(a,b){return J.RE(a).sP(a,b)}
@@ -20305,7 +20708,6 @@
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
 J.uH=function(a,b){return J.RE(a).sP2(a,b)}
-J.uM=function(a,b){return J.RE(a).sod(a,b)}
 J.uP=function(a,b){return J.RE(a).sJ6(a,b)}
 J.uW=function(a){return J.RE(a).gyG(a)}
 J.uY=function(a){return J.w1(a).grZ(a)}
@@ -20314,13 +20716,12 @@
 J.up=function(a){return J.RE(a).gkh(a)}
 J.uy=function(a){return J.RE(a).gHm(a)}
 J.v1=function(a){return J.x(a).giO(a)}
+J.vI=function(a){return J.RE(a).gVX(a)}
 J.vJ=function(a,b){return J.RE(a).spM(a,b)}
 J.vP=function(a){return J.RE(a).My(a)}
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
-J.vc=function(a,b){return J.RE(a).sG5(a,b)}
 J.vi=function(a){return J.RE(a).gNa(a)}
-J.w4=function(a,b){return J.RE(a).x4(a,b)}
 J.w7=function(a,b){return J.RE(a).syW(a,b)}
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wD=function(a,b){return J.w1(a).sIr(a,b)}
@@ -20340,13 +20741,15 @@
 J.xQ=function(a,b){return J.RE(a).sGd(a,b)}
 J.xR=function(a){return J.RE(a).ghf(a)}
 J.xW=function(a,b){return J.RE(a).sZm(a,b)}
+J.xZ=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
+return J.Wx(a).D(a,b)}
 J.xa=function(a){return J.RE(a).geS(a)}
 J.xe=function(a){return J.RE(a).gPB(a)}
 J.xo=function(a){return J.RE(a).gJN(a)}
 J.xp=function(a,b){return J.w1(a).zV(a,b)}
 J.y2=function(a,b){return J.RE(a).mx(a,b)}
 J.yH=function(a){return J.Wx(a).Vy(a)}
-J.yI=function(a){return J.RE(a).gLf(a)}
+J.yI=function(a){return J.RE(a).gih(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
 J.yc=function(a){return J.RE(a).guS(a)}
 J.yd=function(a){return J.RE(a).xO(a)}
@@ -20355,8 +20758,6 @@
 J.yz=function(a){return J.RE(a).gLF(a)}
 J.z1=function(a){return J.RE(a).gXr(a)}
 J.z2=function(a){return J.RE(a).gG1(a)}
-J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
-return J.Wx(a).D(a,b)}
 J.zF=function(a){return J.RE(a).gHL(a)}
 J.zH=function(a){return J.RE(a).gIs(a)}
 J.zN=function(a){return J.RE(a).gM6(a)}
@@ -20367,9 +20768,10 @@
 C.Df=X.hV.prototype
 C.Gkp=Y.q6.prototype
 C.Mw=B.G6.prototype
+C.FC=T.vr.prototype
 C.ic=A.wM.prototype
 C.YZz=Q.eW.prototype
-C.RD=O.eo.prototype
+C.fe=O.eo.prototype
 C.ka=Z.ak.prototype
 C.tWO=O.VY.prototype
 C.ux=F.Be.prototype
@@ -20378,21 +20780,21 @@
 C.Jh=L.nJ.prototype
 C.qL=R.Eg.prototype
 C.MC=D.i7.prototype
-C.D4=A.Gk.prototype
+C.LTI=A.Gk.prototype
 C.ls6=X.MJ.prototype
 C.MO0=X.J3.prototype
 C.Xo=U.DK.prototype
 C.p0=N.BS.prototype
-C.Cs=O.Vb.prototype
+C.wc=O.Vb.prototype
 C.Vc=K.Ly.prototype
 C.W3=W.fJ.prototype
 C.bP=E.WS.prototype
-C.GII=E.H8.prototype
+C.tO=E.H8.prototype
 C.Ie=E.mO.prototype
 C.Ig=E.DE.prototype
-C.x4=E.U1.prototype
+C.VLs=E.U1.prototype
 C.lX=E.qM.prototype
-C.Wa=E.av.prototype
+C.OkI=E.av.prototype
 C.bZ=E.uz.prototype
 C.iR=E.Ma.prototype
 C.RVQ=E.wN.prototype
@@ -20417,8 +20819,8 @@
 C.OoF=D.St.prototype
 C.Xe=L.qk.prototype
 C.Nm=J.Q.prototype
-C.YI=J.VA.prototype
-C.jn=J.Xh.prototype
+C.YI=J.VA7.prototype
+C.jn=J.imn.prototype
 C.jN=J.CDU.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
@@ -20426,12 +20828,12 @@
 C.ct=A.UK.prototype
 C.Z3=R.LU.prototype
 C.MG=M.CX.prototype
-C.S2=W.H9.prototype
+C.S2=W.x76.prototype
 C.yp=H.eEV.prototype
 C.kD=A.md.prototype
-C.pl=A.ye.prototype
+C.br=A.ye.prototype
 C.IG=A.Bm.prototype
-C.Nk=A.Ya.prototype
+C.nn=A.Ya.prototype
 C.Mn=A.NK.prototype
 C.L8=A.Zx.prototype
 C.Y6=A.Ww.prototype
@@ -20449,8 +20851,8 @@
 C.HRc=Q.xI.prototype
 C.zb=Q.CY.prototype
 C.dX=K.nm.prototype
-C.wB=X.uw.prototype
-C.lx=A.G1.prototype
+C.uC=X.uw.prototype
+C.OKl=A.G1.prototype
 C.vB=J.kdQ.prototype
 C.aXh=V.D2.prototype
 C.J57=V.Pa.prototype
@@ -20458,13 +20860,13 @@
 C.dm=U.el.prototype
 C.ol=W.K5.prototype
 C.KZ=new H.hJ()
-C.OL=new U.WH()
+C.x4=new U.WH()
 C.MS=new H.FuS()
-C.Eq=new P.qn()
-C.qY=new T.yy()
+C.Eq=new P.k5C()
+C.qY=new T.WM()
 C.ZB=new P.yRf()
 C.pr=new P.mgb()
-C.dV=new L.iNc()
+C.aZ=new L.iNc()
 C.NU=new P.R81()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
@@ -20490,8 +20892,8 @@
 C.UZ=H.IL('qC')
 C.b7=new A.ES(C.Zg,C.BM,!1,C.UZ,!1,C.ucP)
 C.SR=new H.tx("map")
-C.MR1=H.IL('vO')
-C.S9=new A.ES(C.SR,C.BM,!1,C.MR1,!1,C.ucP)
+C.MR=H.IL('vO')
+C.S9=new A.ES(C.SR,C.BM,!1,C.MR,!1,C.ucP)
 C.ld=new H.tx("events")
 C.Gsc=H.IL('wn')
 C.Gw=new A.ES(C.ld,C.BM,!1,C.Gsc,!1,C.ucP)
@@ -20519,6 +20921,9 @@
 C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.esx)
 C.zU=new H.tx("uncheckedText")
 C.uT=new A.ES(C.zU,C.BM,!1,C.Gh,!1,C.ucP)
+C.VI=new H.tx("line")
+C.lhY=H.IL('c2')
+C.w6=new A.ES(C.VI,C.BM,!1,C.lhY,!1,C.ucP)
 C.IT=new H.tx("startPos")
 C.yw=H.IL('KN')
 C.NL=new A.ES(C.IT,C.BM,!1,C.yw,!1,C.ucP)
@@ -20532,6 +20937,8 @@
 C.rB=new H.tx("isolate")
 C.a2p=H.IL('bv')
 C.xY=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.esx)
+C.mJ=new H.tx("color")
+C.Qu=new A.ES(C.mJ,C.BM,!1,C.Gh,!1,C.ucP)
 C.bz=new H.tx("isolateChanged")
 C.Bk=new A.ES(C.bz,C.hU,!1,C.yQP,!1,C.dn)
 C.CG=new H.tx("posChanged")
@@ -20541,10 +20948,15 @@
 C.lJ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.ucP)
 C.Gs=new H.tx("sampleCount")
 C.iO=new A.ES(C.Gs,C.BM,!1,C.Gh,!1,C.esx)
+C.uG=new H.tx("linesReady")
+C.K1=new A.ES(C.uG,C.BM,!1,C.HL,!1,C.esx)
 C.oj=new H.tx("httpServer")
-C.GT=new A.ES(C.oj,C.BM,!1,C.MR1,!1,C.ucP)
+C.GT=new A.ES(C.oj,C.BM,!1,C.MR,!1,C.ucP)
 C.td=new H.tx("object")
 C.Zk=new A.ES(C.td,C.BM,!1,C.SmN,!1,C.ucP)
+C.ft=new H.tx("target")
+C.NBK=H.IL('Z5')
+C.Gz=new A.ES(C.ft,C.BM,!1,C.NBK,!1,C.ucP)
 C.TW=new H.tx("tagSelector")
 C.H0=new A.ES(C.TW,C.BM,!1,C.Gh,!1,C.esx)
 C.He=new H.tx("hideTagsChecked")
@@ -20558,11 +20970,11 @@
 C.mr=new H.tx("expanded")
 C.HE=new A.ES(C.mr,C.BM,!1,C.HL,!1,C.esx)
 C.kw=new H.tx("trace")
-C.oC=new A.ES(C.kw,C.BM,!1,C.MR1,!1,C.ucP)
+C.oC=new A.ES(C.kw,C.BM,!1,C.MR,!1,C.ucP)
 C.qX=new H.tx("fragmentationChanged")
 C.dO=new A.ES(C.qX,C.hU,!1,C.yQP,!1,C.dn)
 C.UX=new H.tx("msg")
-C.Pt=new A.ES(C.UX,C.BM,!1,C.MR1,!1,C.ucP)
+C.Pt=new A.ES(C.UX,C.BM,!1,C.MR,!1,C.ucP)
 C.rP=new H.tx("mapChanged")
 C.Nt=new A.ES(C.rP,C.hU,!1,C.yQP,!1,C.dn)
 C.nf=new H.tx("function")
@@ -20593,20 +21005,17 @@
 C.t6=new H.tx("mapAsString")
 C.hr=new A.ES(C.t6,C.BM,!1,C.Gh,!1,C.esx)
 C.qs=new H.tx("io")
-C.MN=new A.ES(C.qs,C.BM,!1,C.MR1,!1,C.ucP)
+C.MN=new A.ES(C.qs,C.BM,!1,C.MR,!1,C.ucP)
 C.QH=new H.tx("fragmentation")
-C.C4=new A.ES(C.QH,C.BM,!1,C.MR1,!1,C.ucP)
-C.ft=new H.tx("target")
-C.I4j=H.IL('Z5')
-C.u3=new A.ES(C.ft,C.BM,!1,C.I4j,!1,C.ucP)
+C.C4=new A.ES(C.QH,C.BM,!1,C.MR,!1,C.ucP)
 C.VK=new H.tx("devtools")
 C.Od=new A.ES(C.VK,C.BM,!1,C.HL,!1,C.ucP)
 C.uu=new H.tx("internal")
 C.yY=new A.ES(C.uu,C.BM,!1,C.HL,!1,C.ucP)
 C.yL=new H.tx("connection")
-C.j5=new A.ES(C.yL,C.BM,!1,C.MR1,!1,C.ucP)
+C.j5=new A.ES(C.yL,C.BM,!1,C.MR,!1,C.ucP)
 C.Wj=new H.tx("process")
-C.Ah=new A.ES(C.Wj,C.BM,!1,C.MR1,!1,C.ucP)
+C.Ah=new A.ES(C.Wj,C.BM,!1,C.MR,!1,C.ucP)
 C.S4=new H.tx("busy")
 C.FB=new A.ES(C.S4,C.BM,!1,C.HL,!1,C.esx)
 C.eh=new H.tx("lineMode")
@@ -20629,7 +21038,7 @@
 C.ox=new H.tx("countersChanged")
 C.Rh=new A.ES(C.ox,C.hU,!1,C.yQP,!1,C.dn)
 C.XM=new H.tx("path")
-C.Tt=new A.ES(C.XM,C.BM,!1,C.MR1,!1,C.ucP)
+C.Tt=new A.ES(C.XM,C.BM,!1,C.MR,!1,C.ucP)
 C.bJ=new H.tx("counters")
 C.UI=new A.ES(C.bJ,C.BM,!1,C.UZ,!1,C.ucP)
 C.bE=new H.tx("sampleDepth")
@@ -20642,14 +21051,14 @@
 C.wG=H.IL('dynamic')
 C.LC=new A.ES(C.YT,C.BM,!1,C.wG,!1,C.ucP)
 C.yB=new H.tx("instances")
-C.vZ=new A.ES(C.yB,C.BM,!1,C.MR1,!1,C.esx)
+C.vZ=new A.ES(C.yB,C.BM,!1,C.MR,!1,C.esx)
 C.xS=new H.tx("tagSelectorChanged")
 C.bB=new A.ES(C.xS,C.hU,!1,C.yQP,!1,C.dn)
 C.jU=new H.tx("file")
-C.bw=new A.ES(C.jU,C.BM,!1,C.MR1,!1,C.ucP)
+C.bw=new A.ES(C.jU,C.BM,!1,C.MR,!1,C.ucP)
 C.RU=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.ucP)
 C.YE=new H.tx("webSocket")
-C.Wl=new A.ES(C.YE,C.BM,!1,C.MR1,!1,C.ucP)
+C.Wl=new A.ES(C.YE,C.BM,!1,C.MR,!1,C.ucP)
 C.Dj=new H.tx("refreshTime")
 C.Ay=new A.ES(C.Dj,C.BM,!1,C.Gh,!1,C.esx)
 C.Gr=new H.tx("endPos")
@@ -20667,7 +21076,7 @@
 C.Gn=new H.tx("objectChanged")
 C.az=new A.ES(C.Gn,C.hU,!1,C.yQP,!1,C.dn)
 C.vp=new H.tx("list")
-C.o0=new A.ES(C.vp,C.BM,!1,C.MR1,!1,C.ucP)
+C.o0=new A.ES(C.vp,C.BM,!1,C.MR,!1,C.ucP)
 C.i4=new H.tx("code")
 C.pM=H.IL('kx')
 C.aJ=new A.ES(C.i4,C.BM,!1,C.pM,!1,C.ucP)
@@ -20690,13 +21099,13 @@
 C.oE=new H.tx("chromiumAddress")
 C.r2=new A.ES(C.oE,C.BM,!1,C.Gh,!1,C.ucP)
 C.WQ=new H.tx("field")
-C.ah=new A.ES(C.WQ,C.BM,!1,C.MR1,!1,C.ucP)
+C.ah=new A.ES(C.WQ,C.BM,!1,C.MR,!1,C.ucP)
 C.r1=new H.tx("expandChanged")
 C.nP=new A.ES(C.r1,C.hU,!1,C.yQP,!1,C.dn)
 C.Mc=new H.tx("flagList")
-C.f0=new A.ES(C.Mc,C.BM,!1,C.MR1,!1,C.ucP)
+C.f0=new A.ES(C.Mc,C.BM,!1,C.MR,!1,C.ucP)
 C.fn=new H.tx("instance")
-C.fz=new A.ES(C.fn,C.BM,!1,C.MR1,!1,C.ucP)
+C.fz=new A.ES(C.fn,C.BM,!1,C.MR,!1,C.ucP)
 C.rE=new H.tx("frame")
 C.KS=new A.ES(C.rE,C.BM,!1,C.UZ,!1,C.ucP)
 C.cg=new H.tx("anchor")
@@ -20713,7 +21122,7 @@
 C.Ul=new A.ES(C.yh,C.BM,!1,C.oqo,!1,C.ucP)
 C.Qp=new A.ES(C.AV,C.BM,!1,C.wG,!1,C.ucP)
 C.vb=new H.tx("profile")
-C.Mq=new A.ES(C.vb,C.BM,!1,C.MR1,!1,C.ucP)
+C.Mq=new A.ES(C.vb,C.BM,!1,C.MR,!1,C.ucP)
 C.ny=new P.a6(0)
 C.U3=H.VM(new W.FkO("change"),[W.ea])
 C.T1=H.VM(new W.FkO("click"),[W.AjY])
@@ -20884,7 +21293,7 @@
 C.Cd=I.uL([C.pzc])
 C.Fn=I.uL(["==","!=","<=",">=","||","&&"])
 C.jY=I.uL(["as","in","this"])
-C.to=I.uL([0,0,32722,12287,65534,34815,65534,18431])
+C.MM=I.uL([0,0,32722,12287,65534,34815,65534,18431])
 C.QC=I.uL(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
 C.bg=I.uL([43,45,42,47,33,38,37,60,61,62,63,94,124])
 C.B2=I.uL([0,0,24576,1023,65534,34815,65534,18431])
@@ -20896,8 +21305,8 @@
 C.lY=new H.Px(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zao)
 C.Vgv=I.uL(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 C.yt=new H.Px(14,{domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.Vgv)
-C.rWc=I.uL(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
-C.pv=new H.Px(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.rWc)
+C.OA=I.uL(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
+C.pv=new H.Px(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.OA)
 C.kKi=I.uL(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
 C.w0=new H.Px(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.kKi)
 C.CM=new H.Px(0,{},C.dn)
@@ -20917,7 +21326,7 @@
 C.BE=new H.tx("averageCollectionPeriodInMillis")
 C.IH=new H.tx("address")
 C.j2=new H.tx("app")
-C.ke=new H.tx("architecture")
+C.US=new H.tx("architecture")
 C.ET=new H.tx("assertsEnabled")
 C.WC=new H.tx("bpt")
 C.hR=new H.tx("breakpoint")
@@ -21019,7 +21428,6 @@
 C.GI=new H.tx("lastUpdate")
 C.ur=new H.tx("lib")
 C.VN=new H.tx("libraries")
-C.VI=new H.tx("line")
 C.cc=new H.tx("listening")
 C.DY=new H.tx("loading")
 C.Lx=new H.tx("localAddress")
@@ -21045,6 +21453,7 @@
 C.Ic=new H.tx("pause")
 C.yG=new H.tx("pauseEvent")
 C.uI=new H.tx("pid")
+C.Jf=new H.tx("possibleBpt")
 C.AY=new H.tx("protocol")
 C.AO=new H.tx("qualifiedName")
 C.Xd=new H.tx("reachable")
@@ -21071,6 +21480,9 @@
 C.jM=new H.tx("socketOwner")
 C.HO=new H.tx("stacktrace")
 C.W5=new H.tx("standalone")
+C.ks=new H.tx("stepInto")
+C.Om=new H.tx("stepOut")
+C.iC=new H.tx("stepOver")
 C.k5=new H.tx("subClasses")
 C.Nv=new H.tx("subclass")
 C.Cw=new H.tx("superClass")
@@ -21082,6 +21494,7 @@
 C.Ef=new H.tx("tipTime")
 C.QL=new H.tx("toString")
 C.RH=new H.tx("toStringAsFixed")
+C.SP=new H.tx("toggleBreakpoint")
 C.Q1=new H.tx("toggleExpand")
 C.ID=new H.tx("toggleExpanded")
 C.z6=new H.tx("tokenPos")
@@ -21109,7 +21522,7 @@
 C.Mf=H.IL('G1')
 C.q0S=H.IL('Dg')
 C.Dl=H.IL('F1')
-C.Jf=H.IL('Mb')
+C.mK=H.IL('Mb')
 C.UJ=H.IL('oa')
 C.uh=H.IL('aI')
 C.Y3=H.IL('CY')
@@ -21151,7 +21564,6 @@
 C.Yy=H.IL('uE')
 C.Yxm=H.IL('Pg')
 C.il=H.IL('xI')
-C.G0=H.IL('mJ')
 C.lp=H.IL('LU')
 C.oG=H.IL('ds')
 C.EG=H.IL('Oz')
@@ -21171,10 +21583,12 @@
 C.Zj=H.IL('U1')
 C.FG=H.IL('qh')
 C.bC=H.IL('D2')
+C.Nw=H.IL('vr')
 C.a8=H.IL('Zx')
 C.YZ=H.IL('zt')
 C.NR=H.IL('nm')
 C.DD=H.IL('Zn')
+C.Dv=H.IL('Un')
 C.qF=H.IL('mO')
 C.JA3=H.IL('b0B')
 C.Ey=H.IL('wM')
@@ -21215,11 +21629,11 @@
 C.Rt=new P.fM(C.NU,P.wLZ())
 C.Sq=new P.fM(C.NU,P.vRP())
 C.mc=new P.fM(C.NU,P.H2())
-C.uo=new P.fM(C.NU,P.hI())
+C.uo=new P.fM(C.NU,P.uy1())
 C.pj=new P.fM(C.NU,P.W7())
 C.F2=new P.fM(C.NU,P.lw())
 C.Gu=new P.fM(C.NU,P.xd())
-C.Yl=new P.fM(C.NU,P.MM())
+C.Yl=new P.fM(C.NU,P.J6())
 C.Zc=new P.fM(C.NU,P.G2())
 C.Kk=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null)
 $.libraries_to_load = {}
@@ -21231,7 +21645,7 @@
 $.lEO=null
 $.OK=0
 $.bf=null
-$.U9=null
+$.P4=null
 $.lcs=!1
 $.NF=null
 $.TX=null
@@ -21266,7 +21680,7 @@
 $.vU=null
 $.xV=null
 $.rK=!1
-$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.ZFP},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.fv},C.Jf,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Sm},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.TQ},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.fm},C.PT,M.CX,{created:M.SP},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.vn},C.PF,W.yyN,{},C.Th,U.fI,{created:U.UF},C.tU,E.L4,{created:E.p4t},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.vu,X.uw,{created:X.lt2},C.ca,D.Z4,{created:D.Oll},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.AW},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.Jv},C.lp,R.LU,{created:R.V4},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.lL},C.ou,Z.ak,{created:Z.lW},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.hm},C.FG,E.qh,{created:E.va},C.bC,V.D2,{created:V.NI},C.a8,A.Zx,{created:A.Ow},C.NR,K.nm,{created:K.an},C.DD,E.Zn,{created:E.kf},C.qF,E.mO,{created:E.Ch},C.JA3,H.b0B,{"":H.m6},C.Ey,A.wM,{created:A.GO},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.W1},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.tX},C.Jm,Y.q6,{created:Y.Ifw},C.Wz,B.pR,{created:B.lu},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.yU},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.cYO},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.oS},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
+$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.ZFP},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.Lu},C.mK,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Sm},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.TQ},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.fm},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.teo},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.vn},C.PF,W.yyN,{},C.Th,U.fI,{created:U.UF},C.tU,E.L4,{created:E.p4t},C.cK,X.I5,{created:X.yC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.vu,X.uw,{created:X.lt2},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.AW},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.Jv},C.lp,R.LU,{created:R.rA},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.lL},C.ou,Z.ak,{created:Z.zB},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.hm},C.FG,E.qh,{created:E.va},C.bC,V.D2,{created:V.NI},C.Nw,T.vr,{created:T.xA},C.a8,A.Zx,{created:A.yno},C.NR,K.nm,{created:K.an},C.DD,E.Zn,{created:E.kf},C.qF,E.mO,{created:E.Ch},C.JA3,H.b0B,{"":H.m6},C.Ey,A.wM,{created:A.GO},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.W1},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.tX},C.Jm,Y.q6,{created:Y.zE},C.Wz,B.pR,{created:B.lu},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rpj},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.yU},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.cYO},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
 I.$lazy($,"thisScript","SU","Zt",function(){return H.yl()})
 I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.qo(null),[P.KN])})
 I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
@@ -21284,9 +21698,9 @@
 I.$lazy($,"_completer","IQ","Ib",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
 I.$lazy($,"_storage","wZ","Vy",function(){return window.localStorage})
 I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.xg()})
-I.$lazy($,"_rootMap","ln","wb",function(){return P.YM(null,null,null,null,null)})
+I.$lazy($,"_rootMap","ln","OL",function(){return P.YM(null,null,null,null,null)})
 I.$lazy($,"_toStringVisiting","nM","Ex",function(){return[]})
-I.$lazy($,"webkitEvents","fDX","nn",function(){return P.EF(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],null,null)})
+I.$lazy($,"webkitEvents","Ha","Cs",function(){return P.EF(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],null,null)})
 I.$lazy($,"context","Lt","Si",function(){return P.ND(self)})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","kt","Iq",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
@@ -21297,13 +21711,13 @@
 I.$lazy($,"_logger","y7","S5",function(){return N.QM("Observable.dirtyCheck")})
 I.$lazy($,"_instance","qa","Js",function(){return new L.TV([])})
 I.$lazy($,"_pathRegExp","Ub","B8",function(){return new L.DOe().$0()})
-I.$lazy($,"_logger","y7Y","Nd",function(){return N.QM("observe.PathObserver")})
-I.$lazy($,"_pathCache","un","hW",function(){return P.L5(null,null,null,P.qU,L.Tv)})
+I.$lazy($,"_logger","y7Y","YLt",function(){return N.QM("observe.PathObserver")})
+I.$lazy($,"_pathCache","un","hW",function(){return P.L5(null,null,null,P.qU,L.Zl)})
 I.$lazy($,"_polymerSyntax","Kb","Ak",function(){return new A.Li(T.GF(null,C.qY),null)})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
 I.$lazy($,"_declarations","ef","vE",function(){return P.L5(null,null,null,P.qU,A.XP)})
 I.$lazy($,"_hasShadowDomPolyfill","Yx","Ep",function(){return $.Si().Eg("ShadowDOMPolyfill")})
-I.$lazy($,"_ShadowCss","qP","AM",function(){var z=$.Kc()
+I.$lazy($,"_ShadowCss","qP","lx",function(){var z=$.Kc()
 return z!=null?J.UQ(z,"ShadowCSS"):null})
 I.$lazy($,"_sheetLog","dz","QJ",function(){return N.QM("polymer.stylesheet")})
 I.$lazy($,"_changedMethodQueryOptions","SC","Sz",function(){return new A.Wq(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
@@ -21314,35 +21728,35 @@
 I.$lazy($,"_observeLog","DZ","mj",function(){return N.QM("polymer.observe")})
 I.$lazy($,"_eventsLog","fo","ay",function(){return N.QM("polymer.events")})
 I.$lazy($,"_unbindLog","eu","iX",function(){return N.QM("polymer.unbind")})
-I.$lazy($,"_bindLog","f2","zB",function(){return N.QM("polymer.bind")})
+I.$lazy($,"_bindLog","xz","fv",function(){return N.QM("polymer.bind")})
 I.$lazy($,"_PolymerGestures","XK","Po",function(){return J.UQ($.Si(),"PolymerGestures")})
 I.$lazy($,"_polymerElementProto","LW","XX",function(){return new A.Md().$0()})
 I.$lazy($,"_typeHandlers","lq","Rf",function(){return P.EF([C.Gh,new Z.lP(),C.GX,new Z.Ra(),C.Yc,new Z.wJY(),C.HL,new Z.zOQ(),C.yw,new Z.W6o(),C.pa,new Z.MdQ()],null,null)})
-I.$lazy($,"_BINARY_OPERATORS","HfW","YP",function(){return P.EF(["+",new K.w12(),"-",new K.w13(),"*",new K.w14(),"/",new K.w15(),"%",new K.w16(),"==",new K.w17(),"!=",new K.w18(),"===",new K.w19(),"!==",new K.w20(),">",new K.w21(),">=",new K.w22(),"<",new K.w23(),"<=",new K.w24(),"||",new K.w25(),"&&",new K.w26(),"|",new K.w27()],null,null)})
+I.$lazy($,"_BINARY_OPERATORS","HfW","Xa",function(){return P.EF(["+",new K.w12(),"-",new K.w13(),"*",new K.w14(),"/",new K.w15(),"%",new K.w16(),"==",new K.w17(),"!=",new K.w18(),"===",new K.w19(),"!==",new K.w20(),">",new K.w21(),">=",new K.w22(),"<",new K.w23(),"<=",new K.w24(),"||",new K.w25(),"&&",new K.w26(),"|",new K.w27()],null,null)})
 I.$lazy($,"_UNARY_OPERATORS","oQ","EU",function(){return P.EF(["+",new K.w5(),"-",new K.w10(),"!",new K.w11()],null,null)})
-I.$lazy($,"_instance","b3","At",function(){return new K.me()})
+I.$lazy($,"_instance","jCU","bq",function(){return new K.me()})
 I.$lazy($,"_currentIsolateMatcher","vf","fA",function(){return new H.VR("isolates/\\d+",H.v4("isolates/\\d+",!1,!0,!1),null,null)})
 I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"kRegularFunction","Ij","is",function(){return new D.Hk("function")})
-I.$lazy($,"kClosureFunction","jX","xq",function(){return new D.Hk("closure function")})
-I.$lazy($,"kGetterFunction","F0","GG",function(){return new D.Hk("getter function")})
-I.$lazy($,"kSetterFunction","Bs","Kw",function(){return new D.Hk("setter function")})
-I.$lazy($,"kConstructor","G8","kj",function(){return new D.Hk("constructor")})
-I.$lazy($,"kImplicitGetterFunction","xs","d9",function(){return new D.Hk("implicit getter function")})
-I.$lazy($,"kImplicitSetterFunction","ab","nE",function(){return new D.Hk("implicit setter function")})
-I.$lazy($,"kStaticInitializer","Sp","y5",function(){return new D.Hk("static initializer")})
-I.$lazy($,"kMethodExtractor","Et","Ot",function(){return new D.Hk("method extractor")})
-I.$lazy($,"kNoSuchMethodDispatcher","Ll","E7",function(){return new D.Hk("noSuchMethod dispatcher")})
-I.$lazy($,"kInvokeFieldDispatcher","HU","f6",function(){return new D.Hk("invoke field dispatcher")})
-I.$lazy($,"kCollected","bt","b1",function(){return new D.Hk("Collected")})
-I.$lazy($,"kNative","wp","l3",function(){return new D.Hk("Native")})
-I.$lazy($,"kTag","z3","zx",function(){return new D.Hk("Tag")})
-I.$lazy($,"kReused","Yb","MQ",function(){return new D.Hk("Reused")})
-I.$lazy($,"kUNKNOWN","ve","lC",function(){return new D.Hk("UNKNOWN")})
+I.$lazy($,"kRegularFunction","Ij","is",function(){return new D.ma("function")})
+I.$lazy($,"kClosureFunction","jX","xq",function(){return new D.ma("closure function")})
+I.$lazy($,"kGetterFunction","F0","GG",function(){return new D.ma("getter function")})
+I.$lazy($,"kSetterFunction","Bs","Kw",function(){return new D.ma("setter function")})
+I.$lazy($,"kConstructor","G8","kj",function(){return new D.ma("constructor")})
+I.$lazy($,"kImplicitGetterFunction","xs","d9",function(){return new D.ma("implicit getter function")})
+I.$lazy($,"kImplicitSetterFunction","ab","nE",function(){return new D.ma("implicit setter function")})
+I.$lazy($,"kStaticInitializer","Sp","y5",function(){return new D.ma("static initializer")})
+I.$lazy($,"kMethodExtractor","Et","Ot",function(){return new D.ma("method extractor")})
+I.$lazy($,"kNoSuchMethodDispatcher","Ll","E7",function(){return new D.ma("noSuchMethod dispatcher")})
+I.$lazy($,"kInvokeFieldDispatcher","HU","f6",function(){return new D.ma("invoke field dispatcher")})
+I.$lazy($,"kCollected","bt","b1",function(){return new D.ma("Collected")})
+I.$lazy($,"kNative","wp","l3",function(){return new D.ma("Native")})
+I.$lazy($,"kTag","z3","zx",function(){return new D.ma("Tag")})
+I.$lazy($,"kReused","Yb","MQ",function(){return new D.ma("Reused")})
+I.$lazy($,"kUNKNOWN","ve","lC",function(){return new D.ma("UNKNOWN")})
 I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
 I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
 I.$lazy($,"symbolConverter","qe","Mg",function(){return D.kP()})
-I.$lazy($,"_DEFAULT","ac","HT",function(){return new M.VE(null)})
+I.$lazy($,"_DEFAULT","ac","Bu",function(){return new M.VE(null)})
 I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.Raa().$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.qo(null),[null])})
 I.$lazy($,"_ownerStagingDocument","v2","we",function(){return H.VM(new P.qo(null),[null])})
@@ -21353,8 +21767,8 @@
 I.$lazy($,"_isStagingDocument","Fg","Ks",function(){return H.VM(new P.qo(null),[null])})
 I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.qo("template_binding"),[null])})
 
-init.functionAliases={Sa:226}
-init.metadata=["object","sender","e",{func:"pd",args:[P.qU]},{func:"bg",ret:P.FK},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"a0",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"pA",void:true,args:[P.dl,P.e4y,P.dl,null,P.BpP]},"self","parent","zone",{func:"QN",args:[P.dl,P.e4y,P.dl,{func:"NT"}]},"f",{func:"aE",args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"Ls",args:[null,null]},null,null]},{func:"rl",ret:{func:"NT"},args:[P.dl,P.e4y,P.dl,{func:"NT"}]},{func:"XRR",ret:{func:"l4",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]}]},{func:"Gt",ret:{func:"Ls",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"Ls",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"NT"}]},{func:"zo",ret:P.Xa,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"vl",ret:P.Xa,args:[P.dl,P.e4y,P.dl,P.a6,{func:"JX",void:true,args:[P.Xa]}]},{func:"Xg",void:true,args:[P.dl,P.e4y,P.dl,P.qU]},"line",{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.n7,P.Z0]},"specification","zoneValues",{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},{func:"xh",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.IN]},"symbol","v","x",{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Hc",ret:P.KN,args:[D.af,D.af]},{func:"Br",ret:P.qU},"invocation","fractionDigits",{func:"NT"},{func:"rz",args:[P.EH]},"code","key","val",{func:"Ls",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.a2,args:[null]},"oldEvent",{func:"f4",void:true,args:[W.f5]},"obj","i","responseText",{func:"uC",args:[U.Z5,U.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"PK",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"KDY",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"lQ",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.BpP]},"theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"jt",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"lk",ret:P.KN,args:[null,null]},"byteString","xhr",{func:"QO",void:true,args:[W.AjY]},"result",{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"event","response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Oj",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"kd",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"uW2",ret:P.QV,args:[P.qU]}]},"s",{func:"W7",void:true,args:[P.a2,null]},"expand","m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"XO",args:[N.HV]},{func:"d4C",void:true,args:[W.AjY,null,W.h4]},{func:"Ij",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"h6",ret:P.a2,args:[P.qU]},"type",{func:"Aa",args:[P.e4y,P.dl]},{func:"h2",args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]}]},{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Tv,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"rd",void:true,args:[P.qU,P.qU]},{func:"Da",void:true,args:[P.WO,P.Z0,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},{func:"QY",void:true,args:[[P.QV,A.OC]]},"changes","jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.a2]},{func:"Hb",args:[null],named:{skipChanges:P.a2}},!1,"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.Ip,U.Ip]},{func:"Aq",args:[U.Ip]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"JC",args:[V.qC]},{func:"rt",ret:P.b8},"scriptCoverage","owningIsolate",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"lB",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer",{func:"H6",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"JQ",void:true,args:[W.BI]},"Event",{func:"WEz",void:true,args:[W.Hy]},{func:"T2",void:true,args:[P.qU,U.U2]},{func:"js",args:[P.qU,U.U2]},"msg","details","ref",{func:"K7",void:true,args:[[P.WO,G.DA]]},"splices",{func:"k2G",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values","targets",{func:"w9",ret:P.b8,args:[P.qU]},];$=null
+init.functionAliases={Sa:230}
+init.metadata=["object","sender","e",{func:"pd",args:[P.qU]},{func:"bg",ret:P.FK},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"a0",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"pA",void:true,args:[P.dl,P.AN,P.dl,null,P.BpP]},"self","parent","zone",{func:"QN",args:[P.dl,P.AN,P.dl,{func:"NT"}]},"f",{func:"aE",args:[P.dl,P.AN,P.dl,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.AN,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"rl",ret:{func:"NT"},args:[P.dl,P.AN,P.dl,{func:"NT"}]},{func:"XRR",ret:{func:"l4",args:[null]},args:[P.dl,P.AN,P.dl,{func:"l4",args:[null]}]},{func:"Gt",ret:{func:"bh",args:[null,null]},args:[P.dl,P.AN,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.AN,P.dl,{func:"NT"}]},{func:"zo",ret:P.kWp,args:[P.dl,P.AN,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"vl",ret:P.kWp,args:[P.dl,P.AN,P.dl,P.a6,{func:"pe",void:true,args:[P.kWp]}]},{func:"Xg",void:true,args:[P.dl,P.AN,P.dl,P.qU]},"line",{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.AN,P.dl,P.n7,P.Z0]},"specification","zoneValues",{func:"Glb",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},{func:"xh",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"b3",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.IN]},"symbol","v","x",{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Tx",ret:P.KN,args:[D.af,D.af]},{func:"Br",ret:P.qU},"invocation","fractionDigits",{func:"NT"},{func:"rz",args:[P.EH]},"code","key","val",{func:"bh",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c",{func:"Ab",void:true,args:[D.Mk]},"event",{func:"If",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.a2,args:[null]},"oldEvent",{func:"f4",void:true,args:[W.f5]},"obj","i","responseText",{func:"mI",args:[L.Z5,L.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"PK",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"KDY",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"lQ",args:[D.kx]},{func:"pG",args:[{func:"kl",void:true}]},"data",{func:"uu",void:true,args:[P.a],opt:[P.BpP]},"theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"xA",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"lk",ret:P.KN,args:[null,null]},"byteString",{func:"lu",void:true,args:[P.qU],opt:[null]},"xhr",{func:"uG",void:true,args:[W.AjY]},"result",{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Oj",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"kd",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"uW",ret:P.QV,args:[P.qU]}]},"s",{func:"W7",void:true,args:[P.a2,null]},"expand","m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"Fe",void:true,args:[W.AjY,null,W.h4]},{func:"Ij",ret:P.qU,args:[P.qU]},"url",{func:"le",ret:P.qU,args:[P.CP]},"time",{func:"BN",ret:P.a2,args:[P.qU]},"type",{func:"B4",args:[P.AN,P.dl]},{func:"h2",args:[P.dl,P.AN,P.dl,{func:"l4",args:[null]}]},{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Zl,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"Rb",void:true,args:[P.qU,P.qU]},{func:"Da",void:true,args:[P.WO,P.Z0,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},{func:"QY",void:true,args:[[P.QV,A.OC]]},"changes","jsElem","extendee",{func:"PF",args:[null,P.qU,P.qU]},{func:"EW",args:[null,W.KV,P.a2]},{func:"Hb",args:[null],named:{skipChanges:P.a2}},!1,"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"ppm",ret:U.zX,args:[U.Ip,U.Ip]},{func:"Aq",args:[U.Ip]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"JC",args:[V.qC]},{func:"rt",ret:P.b8},"scriptCoverage","owningIsolate",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"lB",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer","newBpts",{func:"H6",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"T2",void:true,args:[P.qU,L.U2]},{func:"js",args:[P.qU,L.U2]},"CloseEvent","Event",{func:"cOy",args:[W.Hy]},"msg","details","ref",{func:"K7",void:true,args:[[P.WO,G.DA]]},"splices",{func:"H3",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values","targets",{func:"WrM",ret:P.b8,args:[P.qU]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
@@ -21385,22 +21799,6 @@
 X = convertToFastObject(X)
 Y = convertToFastObject(Y)
 Z = convertToFastObject(Z)
-!function(){function intern(a){var u={}
-u[a]=1
-return Object.keys(convertToFastObject(u))[0]}init.getIsolateTag=function(a){return intern("___dart_"+a+init.isolateTag)}
-var z="___dart_isolate_tags_"
-var y=Object[z]||(Object[z]=Object.create(null))
-var x="_ZxYxX"
-for(var w=0;;w++){var v=intern(x+"_"+w+"_")
-if(!(v in y)){y[v]=1
-init.isolateTag=v
-break}}}()
-init.dispatchPropertyName=init.getIsolateTag("dispatch_record")
-;(function(a){if(typeof document==="undefined"){a(null)
-return}if(document.currentScript){a(document.currentScript)
-return}var z=document.scripts
-function onLoad(b){for(var x=0;x<z.length;++x){z[x].removeEventListener("load",onLoad,false)}a(b.target)}for(var y=0;y<z.length;++y){z[y].addEventListener("load",onLoad,false)}})(function(a){init.currentScript=a
-if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.Ke(E.jk(),b)},[])}else{(function(b){H.Ke(E.jk(),b)})([])}})
 function init(){I.p={}
 function generateAccessor(a,b,c){var y=a.split("-")
 var x=y[0]
@@ -21516,4 +21914,20 @@
 Isolate.$finishClasses=a.$finishClasses
 Isolate.uL=a.uL
 return Isolate}}
+!function(){function intern(a){var u={}
+u[a]=1
+return Object.keys(convertToFastObject(u))[0]}init.getIsolateTag=function(a){return intern("___dart_"+a+init.isolateTag)}
+var z="___dart_isolate_tags_"
+var y=Object[z]||(Object[z]=Object.create(null))
+var x="_ZxYxX"
+for(var w=0;;w++){var v=intern(x+"_"+w+"_")
+if(!(v in y)){y[v]=1
+init.isolateTag=v
+break}}}()
+init.dispatchPropertyName=init.getIsolateTag("dispatch_record")
+;(function(a){if(typeof document==="undefined"){a(null)
+return}if(document.currentScript){a(document.currentScript)
+return}var z=document.scripts
+function onLoad(b){for(var x=0;x<z.length;++x){z[x].removeEventListener("load",onLoad,false)}a(b.target)}for(var y=0;y<z.length;++y){z[y].addEventListener("load",onLoad,false)}})(function(a){init.currentScript=a
+if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.Ke(E.jk(),b)},[])}else{(function(b){H.Ke(E.jk(),b)})([])}})
 })()
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index 1ee9434..4fd626f 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -978,10 +978,15 @@
       .idle {
         color: #0489c3;
         cursor: pointer;
+        text-decoration: none;
+      }
+      .idle:hover {
+        text-decoration: underline;
       }
       .busy {
         color: #aaa;
         cursor: wait;
+        text-decoration: none;
       }
     </style>
 
@@ -989,7 +994,12 @@
       <span class="busy">[{{ label }}]</span>
     </template>
     <template if="{{ !busy }}">
-      <span class="idle"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
+      <template if="{{ color == null }}">
+        <span class="idle"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
+      </template>
+      <template if="{{ color != null }}">
+        <span class="idle" style="color:{{ color }}"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
+      </template>
     </template>
   </template>
 </polymer-element>
@@ -1002,6 +1012,7 @@
 
 
 
+
 <polymer-element name="nav-bar" extends="observatory-element">
   <template>
     <style>
@@ -1556,27 +1567,27 @@
         background: rgba(255,255,255,0.5);
       }
     </style>
-    <template if="{{ event.eventType == 'IsolateInterrupted' }}">
+    <template if="{{ event.eventType == 'IsolateInterrupted' ||
+                     event.eventType == 'BreakpointReached' ||
+                     event.eventType == 'ExceptionThrown' }}">
       <div class="item">
         Isolate
         <a class="link" on-click="{{ goto }}" href="{{ event.isolate.link }}">{{ event.isolate.name }}</a>
         is paused
-        <a class="boxclose" on-click="{{ closeItem }}">×</a>
-      </div>
-    </template>
-    <template if="{{ event.eventType == 'BreakpointReached' }}">
-      <div class="item">
-        Isolate
-        <a class="link" on-click="{{ goto }}" href="{{ event.isolate.link }}">{{ event.isolate.name }}</a>
-        is paused at breakpoint {{ event.breakpoint['id'] }}
-        <a class="boxclose" on-click="{{ closeItem }}">×</a>
-      </div>
-    </template>
-    <template if="{{ event.eventType == 'ExceptionThrown' }}">
-      <div class="item">
-        Isolate
-        <a class="link" on-click="{{ goto }}" href="{{ event.isolate.link }}">{{ event.isolate.name }}</a>
-        is paused at exception
+        <template if="{{ event.breakpoint != null }}">
+          at breakpoint
+        </template>
+        <template if="{{ event.eventType == 'ExceptionThrown' }}">
+          at exception
+        </template>
+
+        <br><br>
+        <action-link callback="{{ resume }}" label="resume" color="white">
+        </action-link>
+        <action-link callback="{{ stepInto }}" label="step" color="white">
+        </action-link>
+        <action-link callback="{{ stepOver }}" label="step&nbsp;over" color="white"></action-link>
+        <action-link callback="{{ stepOut }}" label="step&nbsp;out" color="white"></action-link>
         <a class="boxclose" on-click="{{ closeItem }}">×</a>
       </div>
     </template>
@@ -3450,24 +3461,39 @@
       <content></content>
       <div class="sourceBox" style="height:{{height}}">
         <div class="sourceTable">
-          <template repeat="{{ line in lines }}">
-            <div class="sourceRow" id="{{ makeLineId(line.line) }}">
-              <template if="{{ line.hits == null }}">
-                <div class="hitsNone">{{ line.line }}</div>
-              </template>
-              <template if="{{ line.hits == 0 }}">
-                <div class="hitsNotExecuted">{{ line.line }}</div>
-              </template>
-              <template if="{{ line.hits > 0 }}">
-                <div class="hitsExecuted">{{ line.line }}</div>
-              </template>
-              <div class="sourceItem">&nbsp;</div>
-              <template if="{{ line.line == currentLine }}">
-                <div id="currentLine" class="sourceItemCurrent">{{line.text}}</div>
-              </template>
-              <template if="{{ line.line != currentLine }}">
-                <div class="sourceItem">{{line.text}}</div>
-              </template>
+          <template if="{{ linesReady }}">
+            <template repeat="{{ line in lines }}">
+              <div class="sourceRow" id="{{ makeLineId(line.line) }}">
+                <breakpoint-toggle line="{{ line }}"></breakpoint-toggle>
+
+                <div class="sourceItem">&nbsp;</div>
+
+                <template if="{{ line.hits == null ||
+                              line.hits < 0 }}">
+                  <div class="hitsNone">{{ line.line }}</div>
+                </template>
+                <template if="{{ line.hits == 0 }}">
+                  <div class="hitsNotExecuted">{{ line.line }}</div>
+                </template>
+                <template if="{{ line.hits > 0 }}">
+                  <div class="hitsExecuted">{{ line.line }}</div>
+                </template>
+
+                <div class="sourceItem">&nbsp;</div>
+
+                <template if="{{ line.line == currentLine }}">
+                  <div class="sourceItemCurrent">{{line.text}}</div>
+                </template>
+                <template if="{{ line.line != currentLine }}">
+                  <div class="sourceItem">{{line.text}}</div>
+                </template>
+              </div>
+            </template>
+          </template>
+
+          <template if="{{ !linesReady }}">
+            <div class="sourceRow">
+              <div class="sourceItem">loading...</div>
             </div>
           </template>
         </div>
@@ -3476,6 +3502,68 @@
   </template>
 </polymer-element>
 
+<polymer-element name="breakpoint-toggle" extends="observatory-element">
+  <template>
+    <style>
+      .emptyBreakpoint, .possibleBreakpoint, .busyBreakpoint, .unresolvedBreakpoint, .resolvedBreakpoint  {
+        display: table-cell;
+        vertical-align: top;
+        font: 400 14px consolas, courier, monospace;
+        min-width: 1em;
+        text-align: center;
+        cursor: pointer;
+      }
+      .possibleBreakpoint {
+        color: #e0e0e0;
+      }
+      .possibleBreakpoint:hover {
+        color: white;
+        background-color: #777;
+      }
+      .busyBreakpoint {
+        color: white;
+        background-color: black;
+        cursor: wait;
+      }
+      .unresolvedBreakpoint {
+        color: white;
+        background-color: #cac;
+      }
+      .resolvedBreakpoint {
+        color: white;
+        background-color: #e66;
+      }
+    </style>
+
+    <template if="{{ line.possibleBpt &amp;&amp; busy}}">
+      <div class="busyBreakpoint">B</div>
+    </template>
+
+    <template if="{{ line.bpt == null &amp;&amp; !line.possibleBpt }}">
+      <div class="emptyBreakpoint">&nbsp;</div>
+    </template>
+
+    <template if="{{ line.bpt == null &amp;&amp; line.possibleBpt &amp;&amp; !busy}}">
+      <div class="possibleBreakpoint">
+        <a on-click="{{ toggleBreakpoint }}">B</a>
+      </div>
+    </template>
+
+    <template if="{{ line.bpt != null &amp;&amp; !line.bpt['resolved'] &amp;&amp; !busy}}">
+      <div class="unresolvedBreakpoint">
+        <a on-click="{{ toggleBreakpoint }}">B</a>
+      </div>
+    </template>
+
+    <template if="{{ line.bpt != null &amp;&amp; line.bpt['resolved'] &amp;&amp; !busy}}">
+      <div class="resolvedBreakpoint">
+        <a on-click="{{ toggleBreakpoint }}">B</a>
+      </div>
+    </template>
+
+  </template>
+</polymer-element>
+
 
 
 
@@ -12751,10 +12839,10 @@
       <div class="flex-item-10-percent">
         <isolate-ref ref="{{ isolate }}"></isolate-ref>
       </div>
-      <div class="flex-item-20-percent">
+      <div class="flex-item-30-percent">
         <isolate-run-state isolate="{{ isolate }}"></isolate-run-state>
       </div>
-      <div class="flex-item-50-percent">
+      <div class="flex-item-40-percent">
         <isolate-location isolate="{{ isolate }}"></isolate-location>
       </div>
       <div class="flex-item-10-percent">
@@ -12779,6 +12867,10 @@
     <template if="{{ isolate.pauseEvent != null }}">
       <strong>paused</strong>
       <action-link callback="{{ resume }}" label="resume"></action-link>
+
+      <action-link callback="{{ stepInto }}" label="step"></action-link>
+      <action-link callback="{{ stepOver }}" label="step&nbsp;over"></action-link>
+      <action-link callback="{{ stepOut }}" label="step&nbsp;out"></action-link>
     </template>
 
     <template if="{{ isolate.running }}">
@@ -12803,27 +12895,25 @@
       <template if="{{ isolate.pauseEvent.eventType == 'IsolateCreated' }}">
         at isolate start
       </template>
+
       <template if="{{ isolate.pauseEvent.eventType == 'IsolateShutdown' }}">
         at isolate exit
       </template>
-      <template if="{{ isolate.pauseEvent.eventType == 'IsolateInterrupted' }}">
+
+      <template if="{{ isolate.pauseEvent.eventType == 'IsolateInterrupted' ||
+                       isolate.pauseEvent.eventType == 'BreakpointReached' ||
+                       isolate.pauseEvent.eventType == 'ExceptionThrown' }}">
+        <template if="{{ isolate.pauseEvent.breakpoint != null }}">
+          by breakpoint
+        </template>
+        <template if="{{ isolate.pauseEvent.eventType == 'ExceptionThrown' }}">
+          by exception
+        </template>
         at
         <function-ref ref="{{ isolate.topFrame['function'] }}">
         </function-ref>
         (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
       </template>
-      <template if="{{ isolate.pauseEvent.eventType == 'BreakpointReached' }}">
-        at breakpoint {{ isolate.pauseEvent.breakpoint['id'] }}
-        <function-ref ref="{{ isolate.topFrame['function'] }}">
-        </function-ref>
-        (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
-      </template>
-      <template if="{{ isolate.pauseEvent.eventType == 'ExceptionThrown' }}">
-        at exception
-        <function-ref ref="{{ isolate.topFrame['function'] }}">
-        </function-ref>
-        (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
-      </template>
     </template>
 
     <template if="{{ isolate.running }}">
@@ -13466,10 +13556,10 @@
     <div class="flex-row">
       <div class="flex-item-10-percent">
       </div>
-      <div class="flex-item-20-percent">
+      <div class="flex-item-30-percent">
         <isolate-run-state isolate="{{ isolate }}"></isolate-run-state>
       </div>
-      <div class="flex-item-60-percent">
+      <div class="flex-item-50-percent">
         <isolate-location isolate="{{ isolate }}"></isolate-location>
       </div>
       <div class="flex-item-10-percent">
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
index 7ae4b6c..a116f52 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
@@ -150,14 +150,14 @@
 var j=[]
 var i=[]
 processStatics(m)
-x.push([q,p,j,i,o,k,l,n])}})([["_foreign_helper","dart:_foreign_helper",,H,{
+x.push([q,p,j,i,o,k,l,n])}})([["","",,H,{
 "^":"",
 FK2:{
-"^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
+"^":"a;tT>"}}],["","",,J,{
 "^":"",
 x:function(a){return void 0},
-Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-aN:function(a){var z,y,x,w
+uM:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
+Dx:function(a){var z,y,x,w
 z=a[init.dispatchPropertyName]
 if(z==null)if($.Bv==null){H.XD()
 z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
@@ -165,7 +165,7 @@
 if(!0===y)return a
 x=Object.getPrototypeOf(a)
 if(y===x)return z.i
-if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.Gz(a)
+if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.Am(a)
 if(w==null){y=Object.getPrototypeOf(a)
 if(y==null||y===Object.prototype)return C.Sx
 else return C.vB}return w},
@@ -217,7 +217,8 @@
 iCW:{
 "^":"Ue1;"},
 kdQ:{
-"^":"Ue1;"},
+"^":"Ue1;",
+bu:[function(a){return String(a)},"$0","gAY",0,0,71]},
 Q:{
 "^":"Gv;",
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
@@ -238,7 +239,7 @@
 return!0}return!1},
 Nk:function(a,b){H.Ap(a,b)},
 ad:function(a,b){return H.VM(new H.U5(a,b),[null])},
-lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},30],
+lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"RS",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},30],
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(a,z.gl())},
 V1:function(a){this.sB(a,0)},
@@ -256,11 +257,11 @@
 return a[b]},
 aM:function(a,b,c){if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))
-if(b===c)return H.VM([],[H.Oq(a,0)])
-return H.VM(a.slice(b,c),[H.Oq(a,0)])},
+if(b===c)return H.VM([],[H.u3(a,0)])
+return H.VM(a.slice(b,c),[H.u3(a,0)])},
 Mu:function(a,b,c){H.xF(a,b,c)
 return H.c1(a,b,c,null)},
-gTw:function(a){if(a.length>0)return a[0]
+gne:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
@@ -272,12 +273,12 @@
 if(c<b||c>z)throw H.b(P.TE(c,b,z))
 H.tb(a,c,a,b,z-c)
 this.sB(a,z-(c-b))},
-ou:function(a,b){return H.Ck(a,b)},
+Vr:function(a,b){return H.CkK(a,b)},
 GT:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
 H.rd(a,b)},
 Jd:function(a){return this.GT(a,null)},
 XU:function(a,b,c){return H.TK(a,b,c,a.length)},
-kJ:function(a,b){return this.XU(a,b,0)},
+Mw:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){return H.lO(a,b,a.length-1)},
 cn:function(a,b){return this.Pk(a,b,null)},
 tg:function(a,b){var z
@@ -287,15 +288,15 @@
 gor:function(a){return a.length!==0},
 bu:[function(a){return P.WE(a,"[","]")},"$0","gAY",0,0,71],
 tt:function(a,b){var z
-if(b)return H.VM(a.slice(),[H.Oq(a,0)])
-else{z=H.VM(a.slice(),[H.Oq(a,0)])
+if(b)return H.VM(a.slice(),[H.u3(a,0)])
+else{z=H.VM(a.slice(),[H.u3(a,0)])
 z.fixed$length=init
 return z}},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z=P.Ls(null,null,null,H.Oq(a,0))
+zH:function(a){var z=P.Ls(null,null,null,H.u3(a,0))
 z.FV(0,a)
 return z},
-gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Oq(a,0)])},
+gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)])},
 giO:function(a){return H.eQ(a)},
 gB:function(a){return a.length},
 sB:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
@@ -328,7 +329,7 @@
 return 1}else return-1},
 gzP:function(a){return a===0?1/a<0:a<0},
 gG0:function(a){return isNaN(a)},
-gzr:function(a){return isFinite(a)},
+gx8:function(a){return isFinite(a)},
 JV:function(a,b){return a%b},
 Vy:function(a){return Math.abs(a)},
 yu:function(a){var z
@@ -399,13 +400,13 @@
 gbx:function(a){return C.yT},
 $isFK:true,
 static:{"^":"SAz,N6l"}},
-Xh:{
+imn:{
 "^":"P;",
 gbx:function(a){return C.yw},
 $isCP:true,
 $isFK:true,
 $isKN:true},
-VA:{
+VA7:{
 "^":"P;",
 gbx:function(a){return C.pa},
 $isCP:true,
@@ -446,13 +447,14 @@
 if(z>a.length)return!1
 return b===a.substring(c,z)},
 nC:function(a,b){return this.lV(a,b,0)},
-Nj:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
+Nj:function(a,b,c){var z
+if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(c==null)c=a.length
 if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
-if(b<0)throw H.b(P.N(b))
-if(typeof c!=="number")return H.s(c)
-if(b>c)throw H.b(P.N(b))
-if(c>a.length)throw H.b(P.N(c))
+z=J.Wx(b)
+if(z.C(b,0))throw H.b(P.N(b))
+if(z.D(b,c))throw H.b(P.N(b))
+if(J.xZ(c,a.length))throw H.b(P.N(c))
 return a.substring(b,c)},
 yn:function(a,b){return this.Nj(a,b,null)},
 hc:function(a){return a.toLowerCase()},
@@ -484,7 +486,7 @@
 if(!!z.$isVR){y=b.yk(a,c)
 return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
 return-1},
-kJ:function(a,b){return this.XU(a,b,0)},
+Mw:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){var z,y
 c=a.length
 z=b.length
@@ -540,7 +542,7 @@
 $asark:function(){return[P.KN]},
 $asIr:function(){return[P.KN]},
 $asWO:function(){return[P.KN]},
-$asQV:function(){return[P.KN]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+$asQV:function(){return[P.KN]}}}],["","",,H,{
 "^":"",
 dB:function(a,b){var z=a.vV(0,b)
 init.globalState.Xz.bL()
@@ -686,7 +688,7 @@
 self.dartPrint=self.dartPrint||function(b){return function(c){if(self.console&&self.console.log){self.console.log(c)}else{self.postMessage(b(c))}}}(H.wI)}},
 static:{wI:[function(a){return H.t0(P.EF(["command","print","msg",a],null,null))},"$1","UB",2,0,null,0]}},
 aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,C9<,lJ,CN,M2,mf,pa,ir",
+"^":"a;jO>,Gx,Lp,En<,EE<,um,PX,xF?,UF<,C9<,lJ,CN,M2,mf,pa,ir",
 oz:function(a,b){if(!this.um.n(0,a))return
 if(this.lJ.h(0,b)&&!this.UF)this.UF=!0
 this.PC()},
@@ -786,18 +788,18 @@
 O9:function(a,b){var z=this.Gx
 if(z.x4(0,a))throw H.b(P.FM("Registry: ports must be registered only once."))
 z.u(0,a,b)},
-PC:function(){if(this.Gx.X5-this.fW.X5>0||this.UF||!this.xF)init.globalState.iR.u(0,this.jO,this)
+PC:function(){if(this.Gx.X5-this.Lp.X5>0||this.UF||!this.xF)init.globalState.iR.u(0,this.jO,this)
 else this.Dm()},
 Dm:[function(){var z,y
 z=this.M2
 if(z!=null)z.V1(0)
-for(z=this.Gx,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Oq(y,0),H.Oq(y,1)]);y.G();)y.lo.pr()
+for(z=this.Gx,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.u3(y,0),H.u3(y,1)]);y.G();)y.lo.pr()
 z.V1(0)
-this.fW.V1(0)
+this.Lp.V1(0)
 init.globalState.iR.Rz(0,this.jO)
 this.ir.V1(0)
 z=this.CN
-if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.H4(z.lo,null)
+if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.H4(z.lo,null)
 this.CN=null}},"$0","gIm",0,0,17],
 $isaX:true},
 NY:{
@@ -806,11 +808,11 @@
 $isEH:true},
 cC:{
 "^":"a;Rk>,GL",
-mj:function(){var z=this.Rk
+MK:function(){var z=this.Rk
 if(z.av===z.eZ)return
 return z.AR()},
 xB:function(){var z,y,x
-z=this.mj()
+z=this.MK()
 if(z==null){if(init.globalState.Nr!=null&&init.globalState.iR.x4(0,init.globalState.Nr.jO)&&init.globalState.da===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
 y=init.globalState
 if(y.EF===!0&&y.iR.X5===0&&y.Xz.GL===0){y=y.rj
@@ -832,7 +834,7 @@
 Rm:{
 "^":"TpZ:17;a",
 $0:[function(){if(!this.a.xB())return
-P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
+P.cH(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;od*,i3,G1>",
@@ -921,7 +923,7 @@
 z=init.globalState.N0
 y=this.x6
 z.Gx.Rz(0,y)
-z.fW.Rz(0,y)
+z.Lp.Rz(0,y)
 z.PC()},
 Rf:function(a,b){if(this.KS)return
 this.wy(b)},
@@ -984,8 +986,8 @@
 if(!!z.$isZ0)return this.TI(a)
 if(!!z.$ispW)return this.DE(a)
 if(!!z.$ishq)return this.yf(a)
-return this.N1(a)},
-N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
+return this.YZ(a)},
+YZ:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
 ooy:{
 "^":"HU5;",
 Pq:function(a){return a},
@@ -1031,7 +1033,7 @@
 y=this.Ao++
 this.mR.u(0,a,y)
 x=J.RE(a)
-return["map",y,this.mE(J.qA(x.gvc(a))),this.mE(J.qA(x.gUQ(a)))]},
+return["map",y,this.mE(J.Nd(x.gvc(a))),this.mE(J.Nd(x.gUQ(a)))]},
 mE:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
@@ -1143,7 +1145,7 @@
 y=b.x6
 return z==null?y==null:z===y}return!1},
 $iskuS:true,
-$ishq:true}}],["_js_helper","dart:_js_helper",,H,{
+$ishq:true}}],["","",,H,{
 "^":"",
 Gp:function(a,b){var z
 if(b!=null){z=b.x
@@ -1159,7 +1161,7 @@
 eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},
-rj:[function(a){throw H.b(P.cD(a))},"$1","kk",2,0,3],
+rj:[function(a){throw H.b(P.cD(a,null,null))},"$1","kk",2,0,3],
 BU:function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.kk()
 if(typeof a!=="string")H.vh(P.u(a))
@@ -1223,14 +1225,14 @@
 z=[]
 z.$builtinTypeInfo=[P.KN]
 y=new H.a7(a,a.length,0,null)
-y.$builtinTypeInfo=[H.Oq(a,0)]
+y.$builtinTypeInfo=[H.u3(a,0)]
 for(;y.G();){x=y.lo
 if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
 if(x<=65535)z.push(x)
 else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
 z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},
 LY:function(a){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Oq(a,0)]);z.G();){y=z.lo
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.lo
 if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
 if(y<0)throw H.b(P.u(y))
 if(y>65535)return H.XZ(a)}return H.RF(a)},
@@ -1304,7 +1306,7 @@
 tM:[function(){return J.AG(this.dartException)},"$0","nR",0,0,null],
 vh:function(a){throw H.b(a)},
 Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=new H.Am(a)
+z=new H.Hk(a)
 if(a==null)return
 if(typeof a!=="object")return a
 if("dartException" in a)return z.$1(a.dartException)
@@ -1436,9 +1438,9 @@
 return e.apply(f(this),h)}}(d,z,y)}},
 Hf:function(a,b){var z,y,x,w,v,u,t,s
 z=H.bO()
-y=$.U9
+y=$.P4
 if(y==null){y=H.bd("receiver")
-$.U9=y}x=b.$stubName
+$.P4=y}x=b.$stubName
 w=b.length
 v=typeof dart_precompiled=="function"
 u=a[x]
@@ -1466,7 +1468,7 @@
 KT:function(a,b,c){return new H.GN(a,b,c,null)},
 Og:function(a,b){var z=a.name
 if(b==null||b.length===0)return new H.Hs(z)
-return new H.fw(z,b,null)},
+return new H.KEA(z,b,null)},
 G3:function(){return C.KZ},
 IL:function(a){return new H.cu(a,null)},
 VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
@@ -1476,7 +1478,7 @@
 IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},
 ip:function(a,b,c){var z=H.IM(a,b)
 return z==null?null:z[c]},
-Oq:function(a,b){var z=H.oX(a)
+u3:function(a,b){var z=H.oX(a)
 return z==null?null:z[b]},
 Ko:function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
@@ -1581,11 +1583,11 @@
 n=u[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},
 ml:function(a,b,c){return a.apply(b,c)},
-Pq:function(a){var z=$.NF
+CE:function(a){var z=$.NF
 return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
 wzi:function(a){return H.eQ(a)},
 fc:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
-Gz:function(a){var z,y,x,w,v,u
+Am:function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
 y=$.q4[z]
 if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
@@ -1613,13 +1615,13 @@
 return u.i}else return H.B1(a,x)},
 B1:function(a,b){var z,y
 z=Object.getPrototypeOf(a)
-y=J.Qu(b,z,null,null)
+y=J.uM(b,z,null,null)
 Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
 return b},
-Va:function(a){return J.Qu(a,!1,null,!!a.$isXj)},
+Va:function(a){return J.uM(a,!1,null,!!a.$isXj)},
 ow:function(a,b,c){var z=b.prototype
-if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},
+if(init.leafTags[a]===true)return J.uM(z,!1,null,!!z.$isXj)
+else return J.uM(z,c,null,null)},
 XD:function(){if(!0===$.Bv)return
 $.Bv=!0
 H.Z1()},
@@ -1703,8 +1705,8 @@
 z=this.tc
 for(y=0;y<z.length;++y){x=z[y]
 b.$2(x,this.TZ(x))}},
-gvc:function(a){return H.VM(new H.XR(this),[H.Oq(this,0)])},
-gUQ:function(a){return H.K1(this.tc,new H.hY(this),H.Oq(this,0),H.Oq(this,1))},
+gvc:function(a){return H.VM(new H.XR(this),[H.u3(this,0)])},
+gUQ:function(a){return H.fR(this.tc,new H.hY(this),H.u3(this,0),H.u3(this,1))},
 $isyN:true},
 hY:{
 "^":"TpZ:12;a",
@@ -1857,7 +1859,7 @@
 "^":"XS;K9",
 bu:[function(a){var z=this.K9
 return C.xB.gl0(z)?"Error":"Error: "+z},"$0","gAY",0,0,71]},
-Am:{
+Hk:{
 "^":"TpZ:12;a",
 $1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
 return a},
@@ -1911,7 +1913,7 @@
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
 return J.UN(y,H.eQ(this.jm))},
 $isv:true,
-static:{"^":"bf,U9",uj:function(a){return a.nw},HY:function(a){return a.cR},bO:function(){var z=$.bf
+static:{"^":"bf,P4",uj:function(a){return a.nw},HY:function(a){return a.cR},bO:function(){var z=$.bf
 if(z==null){z=H.bd("self")
 $.bf=z}return z},bd:function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
@@ -1985,7 +1987,7 @@
 if(y==null)throw H.b("no type for '"+H.d(z)+"'")
 return y},
 bu:[function(a){return this.oc},"$0","gAY",0,0,71]},
-fw:{
+KEA:{
 "^":"lbp;oc>,re,Et",
 za:function(){var z,y
 z=this.Et
@@ -1994,7 +1996,7 @@
 y=[init.allClasses[z]]
 if(0>=y.length)return H.e(y,0)
 if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
-for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)y.push(z.lo.za())
+for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)y.push(z.lo.za())
 this.Et=y
 return y},
 bu:[function(a){return H.d(this.oc)+"<"+J.xp(this.re,", ")+">"},"$0","gAY",0,0,71]},
@@ -2041,7 +2043,7 @@
 if(typeof a!=="string")H.vh(P.u(a))
 z=this.Ej.exec(a)
 if(z==null)return
-return H.Mr(this,z)},
+return H.yx(this,z)},
 zD:function(a){if(typeof a!=="string")H.vh(P.u(a))
 return this.Ej.test(a)},
 dd:function(a,b){return new H.KW(this,b)},
@@ -2050,7 +2052,7 @@
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
-return H.Mr(this,y)},
+return H.yx(this,y)},
 Bh:function(a,b){var z,y,x,w
 z=this.gAT()
 z.lastIndex=b
@@ -2061,7 +2063,7 @@
 if(w<0)return H.e(y,w)
 if(y[w]!=null)return
 C.Nm.sB(y,w)
-return H.Mr(this,y)},
+return H.yx(this,y)},
 wL:function(a,b,c){var z
 if(c>=0){z=J.q8(b)
 if(typeof z!=="number")return H.s(z)
@@ -2078,7 +2080,7 @@
 w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))}}},
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v,null,null))}}},
 EK:{
 "^":"a;zO,QK",
 t:function(a,b){var z=this.QK
@@ -2086,7 +2088,7 @@
 return z[b]},
 VO:function(a,b){},
 $isns:true,
-static:{Mr:function(a,b){var z=new H.EK(a,b)
+static:{yx:function(a,b){var z=new H.EK(a,b)
 z.VO(a,b)
 return z}}},
 KW:{
@@ -2115,10 +2117,10 @@
 "^":"a;M,f1,zO",
 t:function(a,b){if(!J.xC(b,0))H.vh(P.N(b))
 return this.zO},
-$isns:true}}],["action_link_element","package:observatory/src/elements/action_link.dart",,X,{
+$isns:true}}],["","",,X,{
 "^":"",
 hV:{
-"^":"LPc;IF,Qw,cw,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"LPc;IF,Qw,cw,oX,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gv8:function(a){return a.IF},
 sv8:function(a,b){a.IF=this.ct(a,C.S4,a.IF,b)},
 gFR:function(a){return a.Qw},
@@ -2127,6 +2129,8 @@
 sFR:function(a,b){a.Qw=this.ct(a,C.AV,a.Qw,b)},
 gph:function(a){return a.cw},
 sph:function(a,b){a.cw=this.ct(a,C.hf,a.cw,b)},
+gih:function(a){return a.oX},
+sih:function(a,b){a.oX=this.ct(a,C.mJ,a.oX,b)},
 F6:[function(a,b,c,d){var z=a.IF
 if(z===!0)return
 if(a.Qw!=null){a.IF=this.ct(a,C.S4,z,!0)
@@ -2138,8 +2142,9 @@
 a.IF=!1
 a.Qw=null
 a.cw="action"
+a.oX=null
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -2153,7 +2158,7 @@
 "^":"TpZ:74;a",
 $0:[function(){var z=this.a
 z.IF=J.Q5(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["app","package:observatory/app.dart",,G,{
+$isEH:true}}],["","",,G,{
 "^":"",
 m7:[function(a){var z
 N.QM("").To("Google Charts API loaded")
@@ -2163,7 +2168,7 @@
 DUC:function(a){var z=$.Vy().getItem(a)
 if(z==null)return
 return C.xr.kV(z)},
-FI:function(a){if(a==null)return P.Vu(null,null,null)
+n8:function(a){if(a==null)return P.Vu(null,null,null)
 return W.Kn("/crdptargets/"+P.jW(C.yD,a,C.xM,!1),null,null).ml(new G.KF()).OA(new G.XN())},
 dj:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"},
 o1:function(a,b){var z
@@ -2205,23 +2210,24 @@
 if(x!==0)return""+x+"m "+w+"s"
 return""+w+"s"},
 mL:{
-"^":"Pi;OJ,Ef,Z6,Eh,m2<,Eb,bn,Pv,cC,AP,fn",
+"^":"Pi;OJ,Ef,Z6,Eh,m2<,Eb,bn,Pv,pW,AP,fn",
 gwv:function(a){return this.Eh},
-swv:function(a,b){var z
+swv:function(a,b){var z,y
 if(J.xC(this.Eh,b))return
-z=this.Eh
-if(z!=null)J.tw(z)
-if(b!=null){N.QM("").To("Registering new VM callbacks")
+if(this.Eh!=null){J.Z8(this.pW)
+J.tw(this.Eh)}if(b!=null){N.QM("").To("Registering new VM callbacks")
 b.gEH().ml(this.gwn())
-J.d7(b).ml(this.gkq())
-z=b.gG2()
-H.VM(new P.Ik(z),[H.Oq(z,0)]).yI(this.gbf())
+z=J.RE(b)
+z.giG(b).ml(this.gkq())
+y=b.gG2()
+H.VM(new P.Ik(y),[H.u3(y,0)]).yI(this.gbf())
+J.Sr(z.gRk(b)).yI(this.gI2())
 z=b.gLi()
-H.VM(new P.Ik(z),[H.Oq(z,0)]).yI(this.gVG())}this.Eh=b},
+H.VM(new P.Ik(z),[H.u3(z,0)]).yI(this.gVG())}this.Eh=b},
 god:function(a){return this.Eb},
 sod:function(a,b){this.Eb=F.Wi(this,C.rB,this.Eb,b)},
-gvK:function(){return this.cC},
-svK:function(a){this.cC=F.Wi(this,C.c6,this.cC,a)},
+gvK:function(){return this.pW},
+svK:function(a){this.pW=F.Wi(this,C.c6,this.pW,a)},
 AQ:function(a){var z,y
 $.Kh=this
 z=this.OJ
@@ -2232,14 +2238,25 @@
 z=this.Z6
 z.ec=this
 y=H.VM(new W.RO(window,C.yf.Ph,!1),[null])
-H.VM(new W.Ov(0,y.DK,y.Ph,W.aF(z.gbQ()),y.Sg),[H.Oq(y,0)]).Zz()
+H.VM(new W.Ov(0,y.bi,y.Ph,W.aF(z.gbQ()),y.Sg),[H.u3(y,0)]).Zz()
 z.Cy()},
-x3:function(a){J.rA(this.cC,new G.xE(a,new G.cE()))},
+x3:function(a){J.r8(this.pW,new G.xE(a,new G.cE()))},
+Vu:[function(a){var z=J.RE(a)
+switch(z.gfG(a)){case"IsolateCreated":break
+case"IsolateShutdown":this.x3(z.god(a))
+break
+case"BreakpointResolved":z.god(a).Xb()
+break
+case"BreakpointReached":case"IsolateInterrupted":case"ExceptionThrown":this.x3(z.god(a))
+J.bi(this.pW,a)
+break
+default:N.QM("").YX("Unrecognized event type: "+H.d(z.gfG(a)))
+break}},"$1","gI2",2,0,84,85],
 yS:[function(a){this.Pv=a
-this.og("error/",null)},"$1","gbf",2,0,84,23],
+this.og("error/",null)},"$1","gbf",2,0,86,23],
 kI:[function(a){this.Pv=a
 if(J.xC(J.Iz(a),"NetworkException"))this.Z6.bo(0,"#/vm-connect/")
-else this.og("error/",null)},"$1","gVG",2,0,85,86],
+else this.og("error/",null)},"$1","gVG",2,0,87,88],
 og:function(a,b){var z,y,x,w,v
 z=b==null?P.Fl(null,null):P.Ms(b,C.xM)
 for(y=this.OJ,x=0;x<y.length;++x){w=y[x]
@@ -2264,43 +2281,43 @@
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.RG,w,x)
 w.$builtinTypeInfo=[null]
 this.nq(this,w)}this.Ef=x},
-mn:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gwn",2,0,87,88],
-aO:[function(a){if(!J.xC(this.Eh,a))return
+mn:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gwn",2,0,89,90],
+fu:[function(a){if(!J.xC(this.Eh,a))return
 this.swv(0,null)
-this.Z6.bo(0,"#/vm-connect/")},"$1","gkq",2,0,87,88],
+this.Z6.bo(0,"#/vm-connect/")},"$1","gkq",2,0,89,90],
 Ty:function(a){var z=this.m2.TY
-z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 this.swv(0,z)
 this.AQ(!1)},
-E0:function(a){var z=new U.dS(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),P.L5(null,null,null,P.qU,P.A5),0,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+E0:function(a){var z=new U.dS(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),P.L5(null,null,null,P.qU,P.A0),0,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.ZH()
 this.swv(0,z)
 this.AQ(!0)},
 static:{"^":"Kh<"}},
 cE:{
-"^":"TpZ:89;",
+"^":"TpZ:91;",
 $1:function(a){var z=J.RE(a)
 return J.xC(z.gfG(a),"IsolateInterrupted")||J.xC(z.gfG(a),"BreakpointReached")||J.xC(z.gfG(a),"ExceptionThrown")},
 $isEH:true},
 xE:{
 "^":"TpZ:12;a,b",
-$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,90,"call"],
+$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 Kf:{
-"^":"a;KJ",
-goH:function(){return this.KJ.nQ("getNumberOfColumns")},
-gvp:function(a){return this.KJ.nQ("getNumberOfRows")},
-Ai:function(){var z=this.KJ
+"^":"a;Yb",
+goH:function(){return this.Yb.nQ("getNumberOfColumns")},
+gvp:function(a){return this.Yb.nQ("getNumberOfRows")},
+Ai:function(){var z=this.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
 Id:function(a,b){var z=[]
 C.Nm.FV(z,J.kl(b,P.En()))
-this.KJ.V7("addRow",[H.VM(new P.GD(z),[null])])}},
+this.Yb.V7("addRow",[H.VM(new P.GD(z),[null])])}},
 qu:{
 "^":"a;vR,bG",
 W2:function(a){var z=P.jT(this.bG)
-this.vR.V7("draw",[a.KJ,z])}},
+this.vR.V7("draw",[a.Yb,z])}},
 yVe:{
 "^":"d3;",
 bo:function(a,b){var z
@@ -2319,7 +2336,7 @@
 if(y>1&&!J.xC(z[1],"")){if(1>=z.length)return H.e(z,1)
 x=z[1]}else x=null}else x=null
 this.ec.og(a,x)},
-WV:function(a,b,c){var z,y,x
+Cz:function(a,b,c){var z,y,x
 z=J.Vs(c).MW.getAttribute("href")
 y=J.RE(a)
 x=y.gpL(a)
@@ -2333,7 +2350,7 @@
 if(window.location.hash===""||window.location.hash==="#")z="#"+this.MP
 window.history.pushState(z,document.title,z)
 this.lU(window.location.hash)},
-y0:[function(a){this.lU(window.location.hash)},"$1","gbQ",2,0,91,13],
+y0:[function(a){this.lU(window.location.hash)},"$1","gbQ",2,0,93,13],
 wa:function(a){return"#"+H.d(a)}},
 OS:{
 "^":"Pi;i6>,yF<",
@@ -2351,7 +2368,7 @@
 VU:function(a){return!0}},
 mo:{
 "^":"TpZ:12;a",
-$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,92,"call"],
+$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,94,"call"],
 $isEH:true},
 Go5:{
 "^":"TpZ:12;",
@@ -2362,15 +2379,15 @@
 ci:function(){if(this.yF==null){var z=W.r3("class-tree",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 qY:function(a){a=J.ZZ(a,11)
-this.i6.Eh.cv(a).ml(new G.Za(this)).OA(new G.ha())},
+this.i6.Eh.cv(a).ml(new G.Za(this)).OA(new G.aY())},
 VU:function(a){return J.co(a,"class-tree/")},
 static:{"^":"rjk"}},
 Za:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a.yF
-if(z!=null)J.uM(z,a)},"$1",null,2,0,null,93,"call"],
+if(z!=null)J.Rp(z,a)},"$1",null,2,0,null,95,"call"],
 $isEH:true},
-ha:{
+aY:{
 "^":"TpZ:12;",
 $1:[function(a){N.QM("").YX("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
@@ -2402,29 +2419,29 @@
 while(!0){w=y.gB(z)
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
-y.u(z,x,U.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,94,"call"],
+y.u(z,x,L.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,96,"call"],
 $isEH:true},
 XN:{
 "^":"TpZ:12;",
 $1:[function(a){},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 nD:{
-"^":"d3;wu,jY>,TY,ro,fb,pt",
+"^":"d3;wu,bq>,TY,ro,fb,pt",
 BZ:function(){return"ws://"+H.d(window.location.host)+"/ws"},
 TP:function(a){var z=this.MG(a)
 if(z!=null)return z
-z=new U.Z5(0,!1,null,a)
+z=new L.Z5(0,!1,null,a)
 z.oc=a
 return z},
 MG:function(a){var z,y
 z={}
 z.a=null
-y=this.jY
-y.aN(y,new G.Un(z,a))
+y=this.bq
+y.aN(y,new G.La(z,a))
 return z.a},
 h:function(a,b){var z,y
 if(b.gA9()===!0)return
-z=this.jY
+z=this.bq
 if(z.tg(z,b))return
 z.h(0,b)
 this.XT()
@@ -2432,16 +2449,16 @@
 y=this.wu.IU+".history"
 $.Vy().setItem(y,C.xr.KP(z))},
 Rz:function(a,b){var z,y
-z=this.jY
+z=this.bq
 z.Rz(0,b)
 this.XT()
 this.XT()
 y=this.wu.IU+".history"
 $.Vy().setItem(y,C.xr.KP(z))},
-XT:function(){var z=this.jY
+XT:function(){var z=this.bq
 z.GT(z,new G.jQ())},
 UJ:function(){var z,y,x,w,v
-z=this.jY
+z=this.bq
 z.V1(z)
 y=G.DUC(this.wu.IU+".history")
 if(y==null)return
@@ -2450,19 +2467,19 @@
 while(!0){v=x.gB(y)
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
-x.u(y,w,U.K9(x.t(y,w)));++w}z.FV(0,y)
+x.u(y,w,L.K9(x.t(y,w)));++w}z.FV(0,y)
 this.XT()},
-XA:function(){this.UJ()
+Ff:function(){this.UJ()
 var z=this.TP(this.BZ())
 this.TY=z
 this.h(0,z)},
 static:{"^":"dI"}},
-Un:{
+La:{
 "^":"TpZ:12;a,b",
 $1:function(a){if(J.xC(a.gw8(),this.b)&&J.xC(a.gA9(),!1))this.a.a=a},
 $isEH:true},
 jQ:{
-"^":"TpZ:95;",
+"^":"TpZ:97;",
 $2:function(a,b){return J.FW(b.geX(),a.geX())},
 $isEH:true},
 Y2:{
@@ -2480,7 +2497,7 @@
 return this.yq},
 k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Pn,this.aZ,"visibility:hidden;")},
 $isY2:true},
-xK:{
+iY:{
 "^":"Pi;vp>,AP,fn",
 mA:function(a){var z,y
 z=this.vp
@@ -2492,7 +2509,7 @@
 z=this.vp
 y=J.U6(z)
 x=y.t(z,a)
-if(x.r8()===!0)y.oF(z,y.kJ(z,x)+1,J.Mx(x))
+if(x.r8()===!0)y.oF(z,y.Mw(z,x)+1,J.Mx(x))
 else this.FS(x)},
 FS:function(a){var z,y,x,w,v
 z=J.RE(a)
@@ -2502,9 +2519,9 @@
 z.soE(a,!1)
 z=this.vp
 w=J.U6(z)
-v=w.kJ(z,a)+1
+v=w.Mw(z,a)+1
 w.UZ(z,v,v+y)}},
-Kt:{
+Ktd:{
 "^":"a;ph>,xy<",
 static:{mb:[function(a){return a!=null?J.AG(a):"<null>"},"$1","ji",2,0,16]}},
 Ni:{
@@ -2520,17 +2537,17 @@
 F.Wi(this,C.JB,0,1)},
 eE:function(a,b){var z=this.vp
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.U8(z[a]),b)},
+return J.UQ(J.hI(z[a]),b)},
 PV:[function(a,b){var z=this.eE(a,this.pT)
-return J.FW(this.eE(b,this.pT),z)},"$2","gpPX",4,0,96],
-zF:[function(a,b){return J.FW(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","gCa",4,0,96],
+return J.FW(this.eE(b,this.pT),z)},"$2","gCS",4,0,98],
+zF:[function(a,b){return J.FW(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","glq",4,0,98],
 Jd:function(a){var z,y
 H.PA()
 $.xj=$.zIm
 new P.VV(null,null).wE(0)
 z=this.zz
-if(this.jV){y=this.gpPX()
-H.rd(z,y)}else{y=this.gCa()
+if(this.jV){y=this.gCS()
+H.rd(z,y)}else{y=this.glq()
 H.rd(z,y)}},
 Ai:function(){C.Nm.sB(this.vp,0)
 C.Nm.sB(this.zz,0)},
@@ -2540,7 +2557,7 @@
 Gu:function(a,b){var z,y
 z=this.vp
 if(a>=z.length)return H.e(z,a)
-y=J.UQ(J.U8(z[a]),b)
+y=J.UQ(J.hI(z[a]),b)
 z=this.oH
 if(b>=z.length)return H.e(z,b)
 return z[b].gxy().$1(y)},
@@ -2550,18 +2567,18 @@
 return J.ew(J.Yq(z[a]),"\u2003")}z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 z=J.Yq(z[a])
-return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,14,97]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
+return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,14,99]}}],["","",,E,{
 "^":"",
 Jz:[function(){var z,y,x,w,v
-z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.Zg,new E.ed(),C.ET,new E.wa(),C.BE,new E.Or(),C.WC,new E.YL(),C.hR,new E.wf(),C.S4,new E.Oa(),C.Ro,new E.emv(),C.hN,new E.Lbd(),C.AV,new E.QAa(),C.bV,new E.CvS(),C.C0,new E.edy(),C.eZ,new E.waE(),C.bk,new E.Ore(),C.lH,new E.YLa(),C.am,new E.wfa(),C.oE,new E.Oaa(),C.kG,new E.e0(),C.OI,new E.e1(),C.I9,new E.e2(),C.To,new E.e3(),C.XA,new E.e4(),C.i4,new E.e5(),C.qt,new E.e6(),C.p1,new E.e7(),C.yJ,new E.e8(),C.la,new E.e9(),C.yL,new E.e10(),C.bJ,new E.e11(),C.ox,new E.e12(),C.Je,new E.e13(),C.kI,new E.e14(),C.vY,new E.e15(),C.Rs,new E.e16(),C.Lw,new E.e17(),C.eR,new E.e18(),C.iE,new E.e19(),C.f4,new E.e20(),C.VK,new E.e21(),C.aH,new E.e22(),C.aK,new E.e23(),C.GP,new E.e24(),C.vs,new E.e25(),C.Gr,new E.e26(),C.TU,new E.e27(),C.Fe,new E.e28(),C.tP,new E.e29(),C.yh,new E.e30(),C.Zb,new E.e31(),C.u7,new E.e32(),C.p8,new E.e33(),C.qR,new E.e34(),C.ld,new E.e35(),C.ne,new E.e36(),C.B0,new E.e37(),C.r1,new E.e38(),C.mr,new E.e39(),C.Ek,new E.e40(),C.Pn,new E.e41(),C.YT,new E.e42(),C.h7,new E.e43(),C.R3,new E.e44(),C.WQ,new E.e45(),C.fV,new E.e46(),C.jU,new E.e47(),C.OO,new E.e48(),C.Mc,new E.e49(),C.FP,new E.e50(),C.kF,new E.e51(),C.UD,new E.e52(),C.Aq,new E.e53(),C.DS,new E.e54(),C.C9,new E.e55(),C.VF,new E.e56(),C.uU,new E.e57(),C.YJ,new E.e58(),C.eF,new E.e59(),C.oI,new E.e60(),C.ST,new E.e61(),C.QH,new E.e62(),C.qX,new E.e63(),C.rE,new E.e64(),C.nf,new E.e65(),C.EI,new E.e66(),C.JB,new E.e67(),C.RY,new E.e68(),C.d4,new E.e69(),C.cF,new E.e70(),C.SI,new E.e71(),C.zS,new E.e72(),C.YA,new E.e73(),C.Ge,new E.e74(),C.A7,new E.e75(),C.He,new E.e76(),C.im,new E.e77(),C.Ss,new E.e78(),C.k6,new E.e79(),C.oj,new E.e80(),C.PJ,new E.e81(),C.q2,new E.e82(),C.d2,new E.e83(),C.kN,new E.e84(),C.fn,new E.e85(),C.yB,new E.e86(),C.eJ,new E.e87(),C.iG,new E.e88(),C.Py,new E.e89(),C.pC,new E.e90(),C.uu,new E.e91(),C.qs,new E.e92(),C.XH,new E.e93(),C.tJ,new E.e94(),C.F8,new E.e95(),C.C1,new E.e96(),C.Nr,new E.e97(),C.nL,new E.e98(),C.a0,new E.e99(),C.Yg,new E.e100(),C.bR,new E.e101(),C.ai,new E.e102(),C.ob,new E.e103(),C.MY,new E.e104(),C.Iv,new E.e105(),C.Wg,new E.e106(),C.tD,new E.e107(),C.nZ,new E.e108(),C.Of,new E.e109(),C.Vl,new E.e110(),C.pY,new E.e111(),C.XL,new E.e112(),C.LA,new E.e113(),C.AT,new E.e114(),C.Lk,new E.e115(),C.dK,new E.e116(),C.xf,new E.e117(),C.rB,new E.e118(),C.bz,new E.e119(),C.Jx,new E.e120(),C.b5,new E.e121(),C.Lc,new E.e122(),C.hf,new E.e123(),C.uk,new E.e124(),C.Zi,new E.e125(),C.TN,new E.e126(),C.GI,new E.e127(),C.Wn,new E.e128(),C.ur,new E.e129(),C.VN,new E.e130(),C.EV,new E.e131(),C.VI,new E.e132(),C.eh,new E.e133(),C.SA,new E.e134(),C.kV,new E.e135(),C.vp,new E.e136(),C.cc,new E.e137(),C.DY,new E.e138(),C.Lx,new E.e139(),C.M3,new E.e140(),C.wT,new E.e141(),C.JK,new E.e142(),C.SR,new E.e143(),C.t6,new E.e144(),C.rP,new E.e145(),C.pX,new E.e146(),C.VD,new E.e147(),C.NN,new E.e148(),C.UX,new E.e149(),C.YS,new E.e150(),C.pu,new E.e151(),C.BJ,new E.e152(),C.c6,new E.e153(),C.td,new E.e154(),C.Gn,new E.e155(),C.zO,new E.e156(),C.vg,new E.e157(),C.YV,new E.e158(),C.If,new E.e159(),C.Ys,new E.e160(),C.zm,new E.e161(),C.nX,new E.e162(),C.xP,new E.e163(),C.XM,new E.e164(),C.Ic,new E.e165(),C.yG,new E.e166(),C.uI,new E.e167(),C.O9,new E.e168(),C.ba,new E.e169(),C.tW,new E.e170(),C.CG,new E.e171(),C.Wj,new E.e172(),C.vb,new E.e173(),C.UL,new E.e174(),C.AY,new E.e175(),C.QK,new E.e176(),C.AO,new E.e177(),C.Xd,new E.e178(),C.I7,new E.e179(),C.kY,new E.e180(),C.Wm,new E.e181(),C.GR,new E.e182(),C.KX,new E.e183(),C.ja,new E.e184(),C.Dj,new E.e185(),C.ir,new E.e186(),C.dx,new E.e187(),C.ni,new E.e188(),C.X2,new E.e189(),C.F3,new E.e190(),C.UY,new E.e191(),C.Aa,new E.e192(),C.nY,new E.e193(),C.tg,new E.e194(),C.HD,new E.e195(),C.iU,new E.e196(),C.eN,new E.e197(),C.ue,new E.e198(),C.nh,new E.e199(),C.L2,new E.e200(),C.Gs,new E.e201(),C.bE,new E.e202(),C.YD,new E.e203(),C.PX,new E.e204(),C.N8,new E.e205(),C.EA,new E.e206(),C.oW,new E.e207(),C.hd,new E.e208(),C.pH,new E.e209(),C.Ve,new E.e210(),C.jM,new E.e211(),C.W5,new E.e212(),C.uX,new E.e213(),C.nt,new E.e214(),C.IT,new E.e215(),C.li,new E.e216(),C.PM,new E.e217(),C.k5,new E.e218(),C.Nv,new E.e219(),C.Cw,new E.e220(),C.TW,new E.e221(),C.xS,new E.e222(),C.ft,new E.e223(),C.QF,new E.e224(),C.mi,new E.e225(),C.zz,new E.e226(),C.hO,new E.e227(),C.ei,new E.e228(),C.HK,new E.e229(),C.je,new E.e230(),C.Ef,new E.e231(),C.QL,new E.e232(),C.RH,new E.e233(),C.Q1,new E.e234(),C.ID,new E.e235(),C.z6,new E.e236(),C.bc,new E.e237(),C.kw,new E.e238(),C.ep,new E.e239(),C.J2,new E.e240(),C.zU,new E.e241(),C.OU,new E.e242(),C.bn,new E.e243(),C.mh,new E.e244(),C.Fh,new E.e245(),C.yv,new E.e246(),C.LP,new E.e247(),C.jh,new E.e248(),C.fj,new E.e249(),C.xw,new E.e250(),C.zn,new E.e251(),C.RJ,new E.e252(),C.Tc,new E.e253(),C.YE,new E.e254(),C.Uy,new E.e255()],null,null)
-y=P.EF([C.aP,new E.e256(),C.cg,new E.e257(),C.Zg,new E.e258(),C.S4,new E.e259(),C.AV,new E.e260(),C.bk,new E.e261(),C.lH,new E.e262(),C.am,new E.e263(),C.oE,new E.e264(),C.kG,new E.e265(),C.XA,new E.e266(),C.i4,new E.e267(),C.yL,new E.e268(),C.bJ,new E.e269(),C.kI,new E.e270(),C.vY,new E.e271(),C.VK,new E.e272(),C.aH,new E.e273(),C.vs,new E.e274(),C.Gr,new E.e275(),C.Fe,new E.e276(),C.tP,new E.e277(),C.yh,new E.e278(),C.Zb,new E.e279(),C.p8,new E.e280(),C.ld,new E.e281(),C.ne,new E.e282(),C.B0,new E.e283(),C.mr,new E.e284(),C.YT,new E.e285(),C.WQ,new E.e286(),C.jU,new E.e287(),C.OO,new E.e288(),C.Mc,new E.e289(),C.QH,new E.e290(),C.rE,new E.e291(),C.nf,new E.e292(),C.Ge,new E.e293(),C.A7,new E.e294(),C.He,new E.e295(),C.oj,new E.e296(),C.d2,new E.e297(),C.fn,new E.e298(),C.yB,new E.e299(),C.Py,new E.e300(),C.uu,new E.e301(),C.qs,new E.e302(),C.rB,new E.e303(),C.hf,new E.e304(),C.uk,new E.e305(),C.Zi,new E.e306(),C.TN,new E.e307(),C.ur,new E.e308(),C.EV,new E.e309(),C.eh,new E.e310(),C.SA,new E.e311(),C.kV,new E.e312(),C.vp,new E.e313(),C.SR,new E.e314(),C.t6,new E.e315(),C.UX,new E.e316(),C.YS,new E.e317(),C.c6,new E.e318(),C.td,new E.e319(),C.zO,new E.e320(),C.YV,new E.e321(),C.If,new E.e322(),C.Ys,new E.e323(),C.nX,new E.e324(),C.XM,new E.e325(),C.Ic,new E.e326(),C.O9,new E.e327(),C.tW,new E.e328(),C.Wj,new E.e329(),C.vb,new E.e330(),C.QK,new E.e331(),C.Xd,new E.e332(),C.kY,new E.e333(),C.GR,new E.e334(),C.KX,new E.e335(),C.ja,new E.e336(),C.Dj,new E.e337(),C.X2,new E.e338(),C.UY,new E.e339(),C.Aa,new E.e340(),C.nY,new E.e341(),C.tg,new E.e342(),C.HD,new E.e343(),C.iU,new E.e344(),C.eN,new E.e345(),C.Gs,new E.e346(),C.bE,new E.e347(),C.YD,new E.e348(),C.PX,new E.e349(),C.pH,new E.e350(),C.Ve,new E.e351(),C.jM,new E.e352(),C.uX,new E.e353(),C.nt,new E.e354(),C.IT,new E.e355(),C.PM,new E.e356(),C.Nv,new E.e357(),C.Cw,new E.e358(),C.TW,new E.e359(),C.ft,new E.e360(),C.mi,new E.e361(),C.zz,new E.e362(),C.z6,new E.e363(),C.kw,new E.e364(),C.zU,new E.e365(),C.OU,new E.e366(),C.RJ,new E.e367(),C.YE,new E.e368()],null,null)
-x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.ou,C.Mt,C.oT,C.il,C.jR,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.Qb,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.MI,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.qZ,C.il,C.Zj,C.Mt,C.he,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.Jf,C.il,C.EZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.l4,C.ms,C.Mt,C.FA,C.Mt,C.Qt,C.Mt,C.a8,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.qJ,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.X8,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.bC,C.Mt,C.ws,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.l4,C.al,C.il],null,null)
-w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.Qp,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,C.CM,C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.Qp,C.B0,C.b6,C.r1,C.nP,C.mr,C.HE],null,null),C.KO,P.EF([C.yh,C.zd],null,null),C.wk,P.EF([C.AV,C.fr,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.ah],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.Qb,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.QK,C.Yo],null,null),C.te,P.EF([C.nf,C.wR],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.mM],null,null),C.Wz,C.CM,C.MI,P.EF([C.fn,C.fz,C.XM,C.Tt,C.tg,C.DC],null,null),C.pF,C.CM,C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.qZ,C.CM,C.Zj,P.EF([C.oj,C.GT],null,null),C.he,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.Fk],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,C.CM,C.oG,P.EF([C.jU,C.bw],null,null),C.Jf,C.CM,C.EZ,P.EF([C.vp,C.o0],null,null),C.FG,C.CM,C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,C.CM,C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.oV,C.vb,C.Mq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bB,C.zz,C.lS],null,null),C.UJ,C.CM,C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.hr,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.ZQ],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.p4],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.p4],null,null),C.vw,P.EF([C.uk,C.p4,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Ce],null,null),C.NW,C.CM,C.ms,P.EF([C.cg,C.ll,C.uk,C.p4,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.xD,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.p4],null,null),C.Dl,P.EF([C.VK,C.Od],null,null),C.l4,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.ON,P.EF([C.kI,C.JM,C.vY,C.ZS,C.Rs,C.EW,C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.A7,C.SD,C.SA,C.KI,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS,C.IT,C.NL,C.li,C.Tz],null,null),C.Sb,P.EF([C.tW,C.kH,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.rZ],null,null),C.il,P.EF([C.uu,C.yY,C.kY,C.TO,C.Wm,C.QW],null,null),C.X8,P.EF([C.Zg,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Ud,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.rE,C.KS],null,null),C.vu,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.ft,C.u3],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.Ul,C.RJ,C.BP],null,null)],null,null)
-v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.Zg,"args",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.I9,"closeItem",C.To,"closing",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.kI,"currentLine",C.vY,"currentPos",C.Rs,"currentPosChanged",C.Lw,"deleteVm",C.eR,"deoptimizations",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.WQ,"field",C.fV,"fields",C.jU,"file",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.Ge,"hashLinkWorkaround",C.A7,"height",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.tJ,"isBool",C.F8,"isChromeTarget",C.C1,"isComment",C.Nr,"isConst",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.MY,"isInlinable",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.Vl,"isOptimizable",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.AT,"isStatic",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.JK,"makeLineId",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.YV,"owningClass",C.If,"owningLibrary",C.Ys,"pad",C.zm,"padding",C.nX,"parent",C.xP,"parseInt",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.kY,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.IT,"startPos",C.li,"startPosChanged",C.PM,"status",C.k5,"subClasses",C.Nv,"subclass",C.Cw,"superClass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.ft,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.QL,"toString",C.RH,"toStringAsFixed",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.OU,"unoptimizedCode",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.yv,"usageCounter",C.LP,"used",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),!1))
+z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.Zg,new E.ed(),C.ET,new E.wa(),C.BE,new E.Or(),C.WC,new E.YL(),C.hR,new E.wf(),C.S4,new E.Oa(),C.Ro,new E.emv(),C.hN,new E.Lbd(),C.AV,new E.QAa(),C.bV,new E.CvS(),C.C0,new E.edy(),C.eZ,new E.waE(),C.bk,new E.Ore(),C.lH,new E.YLa(),C.am,new E.wfa(),C.oE,new E.Oaa(),C.kG,new E.e0(),C.OI,new E.e1(),C.I9,new E.e2(),C.To,new E.e3(),C.XA,new E.e4(),C.i4,new E.e5(),C.mJ,new E.e6(),C.qt,new E.e7(),C.p1,new E.e8(),C.yJ,new E.e9(),C.la,new E.e10(),C.yL,new E.e11(),C.bJ,new E.e12(),C.ox,new E.e13(),C.Je,new E.e14(),C.kI,new E.e15(),C.vY,new E.e16(),C.Rs,new E.e17(),C.Lw,new E.e18(),C.eR,new E.e19(),C.iE,new E.e20(),C.f4,new E.e21(),C.VK,new E.e22(),C.aH,new E.e23(),C.aK,new E.e24(),C.GP,new E.e25(),C.vs,new E.e26(),C.Gr,new E.e27(),C.TU,new E.e28(),C.Fe,new E.e29(),C.tP,new E.e30(),C.yh,new E.e31(),C.Zb,new E.e32(),C.u7,new E.e33(),C.p8,new E.e34(),C.qR,new E.e35(),C.ld,new E.e36(),C.ne,new E.e37(),C.B0,new E.e38(),C.r1,new E.e39(),C.mr,new E.e40(),C.Ek,new E.e41(),C.Pn,new E.e42(),C.YT,new E.e43(),C.h7,new E.e44(),C.R3,new E.e45(),C.WQ,new E.e46(),C.fV,new E.e47(),C.jU,new E.e48(),C.OO,new E.e49(),C.Mc,new E.e50(),C.FP,new E.e51(),C.kF,new E.e52(),C.UD,new E.e53(),C.Aq,new E.e54(),C.DS,new E.e55(),C.C9,new E.e56(),C.VF,new E.e57(),C.uU,new E.e58(),C.YJ,new E.e59(),C.eF,new E.e60(),C.oI,new E.e61(),C.ST,new E.e62(),C.QH,new E.e63(),C.qX,new E.e64(),C.rE,new E.e65(),C.nf,new E.e66(),C.EI,new E.e67(),C.JB,new E.e68(),C.RY,new E.e69(),C.d4,new E.e70(),C.cF,new E.e71(),C.SI,new E.e72(),C.zS,new E.e73(),C.YA,new E.e74(),C.Ge,new E.e75(),C.A7,new E.e76(),C.He,new E.e77(),C.im,new E.e78(),C.Ss,new E.e79(),C.k6,new E.e80(),C.oj,new E.e81(),C.PJ,new E.e82(),C.q2,new E.e83(),C.d2,new E.e84(),C.kN,new E.e85(),C.fn,new E.e86(),C.yB,new E.e87(),C.eJ,new E.e88(),C.iG,new E.e89(),C.Py,new E.e90(),C.pC,new E.e91(),C.uu,new E.e92(),C.qs,new E.e93(),C.XH,new E.e94(),C.tJ,new E.e95(),C.F8,new E.e96(),C.C1,new E.e97(),C.Nr,new E.e98(),C.nL,new E.e99(),C.a0,new E.e100(),C.Yg,new E.e101(),C.bR,new E.e102(),C.ai,new E.e103(),C.ob,new E.e104(),C.MY,new E.e105(),C.Iv,new E.e106(),C.Wg,new E.e107(),C.tD,new E.e108(),C.nZ,new E.e109(),C.Of,new E.e110(),C.Vl,new E.e111(),C.pY,new E.e112(),C.XL,new E.e113(),C.LA,new E.e114(),C.AT,new E.e115(),C.Lk,new E.e116(),C.dK,new E.e117(),C.xf,new E.e118(),C.rB,new E.e119(),C.bz,new E.e120(),C.Jx,new E.e121(),C.b5,new E.e122(),C.Lc,new E.e123(),C.hf,new E.e124(),C.uk,new E.e125(),C.Zi,new E.e126(),C.TN,new E.e127(),C.GI,new E.e128(),C.Wn,new E.e129(),C.ur,new E.e130(),C.VN,new E.e131(),C.EV,new E.e132(),C.VI,new E.e133(),C.eh,new E.e134(),C.SA,new E.e135(),C.uG,new E.e136(),C.kV,new E.e137(),C.vp,new E.e138(),C.cc,new E.e139(),C.DY,new E.e140(),C.Lx,new E.e141(),C.M3,new E.e142(),C.wT,new E.e143(),C.JK,new E.e144(),C.SR,new E.e145(),C.t6,new E.e146(),C.rP,new E.e147(),C.pX,new E.e148(),C.VD,new E.e149(),C.NN,new E.e150(),C.UX,new E.e151(),C.YS,new E.e152(),C.pu,new E.e153(),C.BJ,new E.e154(),C.c6,new E.e155(),C.td,new E.e156(),C.Gn,new E.e157(),C.zO,new E.e158(),C.vg,new E.e159(),C.YV,new E.e160(),C.If,new E.e161(),C.Ys,new E.e162(),C.zm,new E.e163(),C.nX,new E.e164(),C.xP,new E.e165(),C.XM,new E.e166(),C.Ic,new E.e167(),C.yG,new E.e168(),C.uI,new E.e169(),C.O9,new E.e170(),C.ba,new E.e171(),C.tW,new E.e172(),C.CG,new E.e173(),C.Jf,new E.e174(),C.Wj,new E.e175(),C.vb,new E.e176(),C.UL,new E.e177(),C.AY,new E.e178(),C.QK,new E.e179(),C.AO,new E.e180(),C.Xd,new E.e181(),C.I7,new E.e182(),C.kY,new E.e183(),C.Wm,new E.e184(),C.GR,new E.e185(),C.KX,new E.e186(),C.ja,new E.e187(),C.Dj,new E.e188(),C.ir,new E.e189(),C.dx,new E.e190(),C.ni,new E.e191(),C.X2,new E.e192(),C.F3,new E.e193(),C.UY,new E.e194(),C.Aa,new E.e195(),C.nY,new E.e196(),C.tg,new E.e197(),C.HD,new E.e198(),C.iU,new E.e199(),C.eN,new E.e200(),C.ue,new E.e201(),C.nh,new E.e202(),C.L2,new E.e203(),C.Gs,new E.e204(),C.bE,new E.e205(),C.YD,new E.e206(),C.PX,new E.e207(),C.N8,new E.e208(),C.EA,new E.e209(),C.oW,new E.e210(),C.hd,new E.e211(),C.pH,new E.e212(),C.Ve,new E.e213(),C.jM,new E.e214(),C.W5,new E.e215(),C.uX,new E.e216(),C.nt,new E.e217(),C.IT,new E.e218(),C.li,new E.e219(),C.PM,new E.e220(),C.ks,new E.e221(),C.Om,new E.e222(),C.iC,new E.e223(),C.k5,new E.e224(),C.Nv,new E.e225(),C.Cw,new E.e226(),C.TW,new E.e227(),C.xS,new E.e228(),C.ft,new E.e229(),C.QF,new E.e230(),C.mi,new E.e231(),C.zz,new E.e232(),C.hO,new E.e233(),C.ei,new E.e234(),C.HK,new E.e235(),C.je,new E.e236(),C.Ef,new E.e237(),C.QL,new E.e238(),C.RH,new E.e239(),C.SP,new E.e240(),C.Q1,new E.e241(),C.ID,new E.e242(),C.z6,new E.e243(),C.bc,new E.e244(),C.kw,new E.e245(),C.ep,new E.e246(),C.J2,new E.e247(),C.zU,new E.e248(),C.OU,new E.e249(),C.bn,new E.e250(),C.mh,new E.e251(),C.Fh,new E.e252(),C.yv,new E.e253(),C.LP,new E.e254(),C.jh,new E.e255(),C.fj,new E.e256(),C.xw,new E.e257(),C.zn,new E.e258(),C.RJ,new E.e259(),C.Tc,new E.e260(),C.YE,new E.e261(),C.Uy,new E.e262()],null,null)
+y=P.EF([C.aP,new E.e263(),C.cg,new E.e264(),C.Zg,new E.e265(),C.S4,new E.e266(),C.AV,new E.e267(),C.bk,new E.e268(),C.lH,new E.e269(),C.am,new E.e270(),C.oE,new E.e271(),C.kG,new E.e272(),C.XA,new E.e273(),C.i4,new E.e274(),C.mJ,new E.e275(),C.yL,new E.e276(),C.bJ,new E.e277(),C.kI,new E.e278(),C.vY,new E.e279(),C.VK,new E.e280(),C.aH,new E.e281(),C.vs,new E.e282(),C.Gr,new E.e283(),C.Fe,new E.e284(),C.tP,new E.e285(),C.yh,new E.e286(),C.Zb,new E.e287(),C.p8,new E.e288(),C.ld,new E.e289(),C.ne,new E.e290(),C.B0,new E.e291(),C.mr,new E.e292(),C.YT,new E.e293(),C.WQ,new E.e294(),C.jU,new E.e295(),C.OO,new E.e296(),C.Mc,new E.e297(),C.QH,new E.e298(),C.rE,new E.e299(),C.nf,new E.e300(),C.Ge,new E.e301(),C.A7,new E.e302(),C.He,new E.e303(),C.oj,new E.e304(),C.d2,new E.e305(),C.fn,new E.e306(),C.yB,new E.e307(),C.Py,new E.e308(),C.uu,new E.e309(),C.qs,new E.e310(),C.rB,new E.e311(),C.hf,new E.e312(),C.uk,new E.e313(),C.Zi,new E.e314(),C.TN,new E.e315(),C.ur,new E.e316(),C.EV,new E.e317(),C.VI,new E.e318(),C.eh,new E.e319(),C.SA,new E.e320(),C.uG,new E.e321(),C.kV,new E.e322(),C.vp,new E.e323(),C.SR,new E.e324(),C.t6,new E.e325(),C.UX,new E.e326(),C.YS,new E.e327(),C.c6,new E.e328(),C.td,new E.e329(),C.zO,new E.e330(),C.YV,new E.e331(),C.If,new E.e332(),C.Ys,new E.e333(),C.nX,new E.e334(),C.XM,new E.e335(),C.Ic,new E.e336(),C.O9,new E.e337(),C.tW,new E.e338(),C.Wj,new E.e339(),C.vb,new E.e340(),C.QK,new E.e341(),C.Xd,new E.e342(),C.kY,new E.e343(),C.GR,new E.e344(),C.KX,new E.e345(),C.ja,new E.e346(),C.Dj,new E.e347(),C.X2,new E.e348(),C.UY,new E.e349(),C.Aa,new E.e350(),C.nY,new E.e351(),C.tg,new E.e352(),C.HD,new E.e353(),C.iU,new E.e354(),C.eN,new E.e355(),C.Gs,new E.e356(),C.bE,new E.e357(),C.YD,new E.e358(),C.PX,new E.e359(),C.pH,new E.e360(),C.Ve,new E.e361(),C.jM,new E.e362(),C.uX,new E.e363(),C.nt,new E.e364(),C.IT,new E.e365(),C.PM,new E.e366(),C.ks,new E.e367(),C.Om,new E.e368(),C.iC,new E.e369(),C.Nv,new E.e370(),C.Cw,new E.e371(),C.TW,new E.e372(),C.ft,new E.e373(),C.mi,new E.e374(),C.zz,new E.e375(),C.z6,new E.e376(),C.kw,new E.e377(),C.zU,new E.e378(),C.OU,new E.e379(),C.RJ,new E.e380(),C.YE,new E.e381()],null,null)
+x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.ou,C.Mt,C.oT,C.il,C.jR,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.Qb,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.MI,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.qZ,C.il,C.Zj,C.Mt,C.he,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.mK,C.il,C.EZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.l4,C.ms,C.Mt,C.FA,C.Mt,C.Qt,C.Mt,C.a8,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.qJ,C.Nw,C.Mt,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.X8,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.bC,C.Mt,C.ws,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.l4,C.al,C.il],null,null)
+w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.Qp,C.mJ,C.Qu,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,C.CM,C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.Qp,C.B0,C.b6,C.r1,C.nP,C.mr,C.HE],null,null),C.KO,P.EF([C.yh,C.zd],null,null),C.wk,P.EF([C.AV,C.fr,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.ah],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.Qb,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.QK,C.Yo],null,null),C.te,P.EF([C.nf,C.wR],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.mM],null,null),C.Wz,C.CM,C.MI,P.EF([C.fn,C.fz,C.XM,C.Tt,C.tg,C.DC],null,null),C.pF,C.CM,C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.qZ,C.CM,C.Zj,P.EF([C.oj,C.GT],null,null),C.he,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.Fk],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,C.CM,C.oG,P.EF([C.jU,C.bw],null,null),C.mK,C.CM,C.EZ,P.EF([C.vp,C.o0],null,null),C.FG,C.CM,C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,C.CM,C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.oV,C.vb,C.Mq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bB,C.zz,C.lS],null,null),C.UJ,C.CM,C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.hr,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.ZQ],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.p4],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.p4],null,null),C.vw,P.EF([C.uk,C.p4,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Ce],null,null),C.NW,C.CM,C.ms,P.EF([C.cg,C.ll,C.uk,C.p4,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.xD,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.p4],null,null),C.Dl,P.EF([C.VK,C.Od],null,null),C.l4,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.Nw,P.EF([C.S4,C.FB,C.VI,C.w6],null,null),C.ON,P.EF([C.kI,C.JM,C.vY,C.ZS,C.Rs,C.EW,C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.A7,C.SD,C.SA,C.KI,C.uG,C.K1,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS,C.IT,C.NL,C.li,C.Tz],null,null),C.Sb,P.EF([C.tW,C.kH,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.rZ],null,null),C.il,P.EF([C.uu,C.yY,C.kY,C.TO,C.Wm,C.QW],null,null),C.X8,P.EF([C.Zg,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Ud,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.rE,C.KS],null,null),C.vu,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.ft,C.Gz],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.Ul,C.RJ,C.BP],null,null)],null,null)
+v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.Zg,"args",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.I9,"closeItem",C.To,"closing",C.XA,"cls",C.i4,"code",C.mJ,"color",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.kI,"currentLine",C.vY,"currentPos",C.Rs,"currentPosChanged",C.Lw,"deleteVm",C.eR,"deoptimizations",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.WQ,"field",C.fV,"fields",C.jU,"file",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.Ge,"hashLinkWorkaround",C.A7,"height",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.tJ,"isBool",C.F8,"isChromeTarget",C.C1,"isComment",C.Nr,"isConst",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.MY,"isInlinable",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.Vl,"isOptimizable",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.AT,"isStatic",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.uG,"linesReady",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.JK,"makeLineId",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.YV,"owningClass",C.If,"owningLibrary",C.Ys,"pad",C.zm,"padding",C.nX,"parent",C.xP,"parseInt",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Jf,"possibleBpt",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.kY,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.IT,"startPos",C.li,"startPosChanged",C.PM,"status",C.ks,"stepInto",C.Om,"stepOut",C.iC,"stepOver",C.k5,"subClasses",C.Nv,"subclass",C.Cw,"superClass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.ft,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.QL,"toString",C.RH,"toStringAsFixed",C.SP,"toggleBreakpoint",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.OU,"unoptimizedCode",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.yv,"usageCounter",C.LP,"used",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),!1))
 $.j8=new O.fH(z,y,C.CM)
 $.Yv=new O.bY(x,w,!1)
 $.qe=v
-$.M6=[new E.e369(),new E.e370(),new E.e371(),new E.e372(),new E.e373(),new E.e374(),new E.e375(),new E.e376(),new E.e377(),new E.e378(),new E.e379(),new E.e380(),new E.e381(),new E.e382(),new E.e383(),new E.e384(),new E.e385(),new E.e386(),new E.e387(),new E.e388(),new E.e389(),new E.e390(),new E.e391(),new E.e392(),new E.e393(),new E.e394(),new E.e395(),new E.e396(),new E.e397(),new E.e398(),new E.e399(),new E.e400(),new E.e401(),new E.e402(),new E.e403(),new E.e404(),new E.e405(),new E.e406(),new E.e407(),new E.e408(),new E.e409(),new E.e410(),new E.e411(),new E.e412(),new E.e413(),new E.e414(),new E.e415(),new E.e416(),new E.e417(),new E.e418(),new E.e419(),new E.e420(),new E.e421(),new E.e422(),new E.e423(),new E.e424(),new E.e425(),new E.e426(),new E.e427(),new E.e428(),new E.e429(),new E.e430(),new E.e431(),new E.e432(),new E.e433(),new E.e434(),new E.e435(),new E.e436(),new E.e437(),new E.e438(),new E.e439(),new E.e440(),new E.e441(),new E.e442(),new E.e443(),new E.e444(),new E.e445(),new E.e446()]
+$.M6=[new E.e382(),new E.e383(),new E.e384(),new E.e385(),new E.e386(),new E.e387(),new E.e388(),new E.e389(),new E.e390(),new E.e391(),new E.e392(),new E.e393(),new E.e394(),new E.e395(),new E.e396(),new E.e397(),new E.e398(),new E.e399(),new E.e400(),new E.e401(),new E.e402(),new E.e403(),new E.e404(),new E.e405(),new E.e406(),new E.e407(),new E.e408(),new E.e409(),new E.e410(),new E.e411(),new E.e412(),new E.e413(),new E.e414(),new E.e415(),new E.e416(),new E.e417(),new E.e418(),new E.e419(),new E.e420(),new E.e421(),new E.e422(),new E.e423(),new E.e424(),new E.e425(),new E.e426(),new E.e427(),new E.e428(),new E.e429(),new E.e430(),new E.e431(),new E.e432(),new E.e433(),new E.e434(),new E.e435(),new E.e436(),new E.e437(),new E.e438(),new E.e439(),new E.e440(),new E.e441(),new E.e442(),new E.e443(),new E.e444(),new E.e445(),new E.e446(),new E.e447(),new E.e448(),new E.e449(),new E.e450(),new E.e451(),new E.e452(),new E.e453(),new E.e454(),new E.e455(),new E.e456(),new E.e457(),new E.e458(),new E.e459(),new E.e460()]
 $.UG=!0
 F.E2()},"$0","jk",0,0,17],
 em:{
@@ -2670,1780 +2687,1836 @@
 $isEH:true},
 e6:{
 "^":"TpZ:12;",
-$1:function(a){return J.SM(a)},
+$1:function(a){return J.yI(a)},
 $isEH:true},
 e7:{
 "^":"TpZ:12;",
-$1:function(a){return a.goH()},
+$1:function(a){return J.SM(a)},
 $isEH:true},
 e8:{
 "^":"TpZ:12;",
-$1:function(a){return J.Mh(a)},
+$1:function(a){return a.goH()},
 $isEH:true},
 e9:{
 "^":"TpZ:12;",
-$1:function(a){return J.jO(a)},
+$1:function(a){return J.dw(a)},
 $isEH:true},
 e10:{
 "^":"TpZ:12;",
-$1:function(a){return J.xe(a)},
+$1:function(a){return J.jO(a)},
 $isEH:true},
 e11:{
 "^":"TpZ:12;",
-$1:function(a){return J.OT(a)},
+$1:function(a){return J.xe(a)},
 $isEH:true},
 e12:{
 "^":"TpZ:12;",
-$1:function(a){return J.Ok(a)},
+$1:function(a){return J.OT(a)},
 $isEH:true},
 e13:{
 "^":"TpZ:12;",
-$1:function(a){return a.gl()},
+$1:function(a){return J.Ok(a)},
 $isEH:true},
 e14:{
 "^":"TpZ:12;",
-$1:function(a){return J.h6(a)},
+$1:function(a){return a.gl()},
 $isEH:true},
 e15:{
 "^":"TpZ:12;",
-$1:function(a){return J.Jr(a)},
+$1:function(a){return J.h6(a)},
 $isEH:true},
 e16:{
 "^":"TpZ:12;",
-$1:function(a){return J.Cg(a)},
+$1:function(a){return J.Jr(a)},
 $isEH:true},
 e17:{
 "^":"TpZ:12;",
-$1:function(a){return J.o4(a)},
+$1:function(a){return J.Cg(a)},
 $isEH:true},
 e18:{
 "^":"TpZ:12;",
-$1:function(a){return a.guh()},
+$1:function(a){return J.o4(a)},
 $isEH:true},
 e19:{
 "^":"TpZ:12;",
-$1:function(a){return a.gP9()},
+$1:function(a){return a.guh()},
 $isEH:true},
 e20:{
 "^":"TpZ:12;",
-$1:function(a){return a.guH()},
+$1:function(a){return a.gP9()},
 $isEH:true},
 e21:{
 "^":"TpZ:12;",
-$1:function(a){return J.mP(a)},
+$1:function(a){return a.guH()},
 $isEH:true},
 e22:{
 "^":"TpZ:12;",
-$1:function(a){return J.BT(a)},
+$1:function(a){return J.mP(a)},
 $isEH:true},
 e23:{
 "^":"TpZ:12;",
-$1:function(a){return J.vi(a)},
+$1:function(a){return J.BT(a)},
 $isEH:true},
 e24:{
 "^":"TpZ:12;",
-$1:function(a){return J.nq(a)},
+$1:function(a){return J.vi(a)},
 $isEH:true},
 e25:{
 "^":"TpZ:12;",
-$1:function(a){return J.k0(a)},
+$1:function(a){return J.nq(a)},
 $isEH:true},
 e26:{
 "^":"TpZ:12;",
-$1:function(a){return J.rw(a)},
+$1:function(a){return J.k0(a)},
 $isEH:true},
 e27:{
 "^":"TpZ:12;",
-$1:function(a){return J.lk(a)},
+$1:function(a){return J.rw(a)},
 $isEH:true},
 e28:{
 "^":"TpZ:12;",
-$1:function(a){return a.gej()},
+$1:function(a){return J.lk(a)},
 $isEH:true},
 e29:{
 "^":"TpZ:12;",
-$1:function(a){return a.gw2()},
+$1:function(a){return a.gej()},
 $isEH:true},
 e30:{
 "^":"TpZ:12;",
-$1:function(a){return J.w8(a)},
+$1:function(a){return a.gw2()},
 $isEH:true},
 e31:{
 "^":"TpZ:12;",
-$1:function(a){return J.zk(a)},
+$1:function(a){return J.w8(a)},
 $isEH:true},
 e32:{
 "^":"TpZ:12;",
-$1:function(a){return J.kv(a)},
+$1:function(a){return J.zk(a)},
 $isEH:true},
 e33:{
 "^":"TpZ:12;",
-$1:function(a){return J.a3(a)},
+$1:function(a){return J.kv(a)},
 $isEH:true},
 e34:{
 "^":"TpZ:12;",
-$1:function(a){return J.Ts(a)},
+$1:function(a){return J.a3(a)},
 $isEH:true},
 e35:{
 "^":"TpZ:12;",
-$1:function(a){return J.Ky(a)},
+$1:function(a){return J.Ts(a)},
 $isEH:true},
 e36:{
 "^":"TpZ:12;",
-$1:function(a){return J.io(a)},
+$1:function(a){return J.Ky(a)},
 $isEH:true},
 e37:{
 "^":"TpZ:12;",
-$1:function(a){return J.kE(a)},
+$1:function(a){return J.io(a)},
 $isEH:true},
 e38:{
 "^":"TpZ:12;",
-$1:function(a){return J.Gl(a)},
+$1:function(a){return J.kE(a)},
 $isEH:true},
 e39:{
 "^":"TpZ:12;",
-$1:function(a){return J.Mz(a)},
+$1:function(a){return J.Gl(a)},
 $isEH:true},
 e40:{
 "^":"TpZ:12;",
-$1:function(a){return J.nb(a)},
+$1:function(a){return J.Mz(a)},
 $isEH:true},
 e41:{
 "^":"TpZ:12;",
-$1:function(a){return a.gty()},
+$1:function(a){return J.nb(a)},
 $isEH:true},
 e42:{
 "^":"TpZ:12;",
-$1:function(a){return J.yn(a)},
+$1:function(a){return a.gty()},
 $isEH:true},
 e43:{
 "^":"TpZ:12;",
-$1:function(a){return a.gMX()},
+$1:function(a){return J.yn(a)},
 $isEH:true},
 e44:{
 "^":"TpZ:12;",
-$1:function(a){return a.gx5()},
+$1:function(a){return a.gMX()},
 $isEH:true},
 e45:{
 "^":"TpZ:12;",
-$1:function(a){return J.pm(a)},
+$1:function(a){return a.gx5()},
 $isEH:true},
 e46:{
 "^":"TpZ:12;",
-$1:function(a){return a.gtJ()},
+$1:function(a){return J.pm(a)},
 $isEH:true},
 e47:{
 "^":"TpZ:12;",
-$1:function(a){return J.Ec(a)},
+$1:function(a){return a.gtJ()},
 $isEH:true},
 e48:{
 "^":"TpZ:12;",
-$1:function(a){return J.ra(a)},
+$1:function(a){return J.Ec(a)},
 $isEH:true},
 e49:{
 "^":"TpZ:12;",
-$1:function(a){return J.YH(a)},
+$1:function(a){return J.ra(a)},
 $isEH:true},
 e50:{
 "^":"TpZ:12;",
-$1:function(a){return J.WX(a)},
+$1:function(a){return J.YH(a)},
 $isEH:true},
 e51:{
 "^":"TpZ:12;",
-$1:function(a){return J.IP(a)},
+$1:function(a){return J.WX(a)},
 $isEH:true},
 e52:{
 "^":"TpZ:12;",
-$1:function(a){return a.gZd()},
+$1:function(a){return J.IP(a)},
 $isEH:true},
 e53:{
 "^":"TpZ:12;",
-$1:function(a){return J.TM(a)},
+$1:function(a){return a.gZd()},
 $isEH:true},
 e54:{
 "^":"TpZ:12;",
-$1:function(a){return J.xo(a)},
+$1:function(a){return J.TM(a)},
 $isEH:true},
 e55:{
 "^":"TpZ:12;",
-$1:function(a){return a.gkA()},
+$1:function(a){return J.xo(a)},
 $isEH:true},
 e56:{
 "^":"TpZ:12;",
-$1:function(a){return a.gGK()},
+$1:function(a){return a.gkA()},
 $isEH:true},
 e57:{
 "^":"TpZ:12;",
-$1:function(a){return a.gan()},
+$1:function(a){return a.gGK()},
 $isEH:true},
 e58:{
 "^":"TpZ:12;",
-$1:function(a){return a.gcQ()},
+$1:function(a){return a.gan()},
 $isEH:true},
 e59:{
 "^":"TpZ:12;",
-$1:function(a){return a.gS7()},
+$1:function(a){return a.gcQ()},
 $isEH:true},
 e60:{
 "^":"TpZ:12;",
-$1:function(a){return a.gJz()},
+$1:function(a){return a.gS7()},
 $isEH:true},
 e61:{
 "^":"TpZ:12;",
-$1:function(a){return J.PY(a)},
+$1:function(a){return a.gJz()},
 $isEH:true},
 e62:{
 "^":"TpZ:12;",
-$1:function(a){return J.bu(a)},
+$1:function(a){return J.PY(a)},
 $isEH:true},
 e63:{
 "^":"TpZ:12;",
-$1:function(a){return J.VL(a)},
+$1:function(a){return J.bu(a)},
 $isEH:true},
 e64:{
 "^":"TpZ:12;",
-$1:function(a){return J.zN(a)},
+$1:function(a){return J.m8(a)},
 $isEH:true},
 e65:{
 "^":"TpZ:12;",
-$1:function(a){return J.m4(a)},
+$1:function(a){return J.zN(a)},
 $isEH:true},
 e66:{
 "^":"TpZ:12;",
-$1:function(a){return a.gmu()},
+$1:function(a){return J.m4(a)},
 $isEH:true},
 e67:{
 "^":"TpZ:12;",
-$1:function(a){return a.gCO()},
+$1:function(a){return a.gmu()},
 $isEH:true},
 e68:{
 "^":"TpZ:12;",
-$1:function(a){return J.MB(a)},
+$1:function(a){return a.gCO()},
 $isEH:true},
 e69:{
 "^":"TpZ:12;",
-$1:function(a){return J.eU(a)},
+$1:function(a){return J.MB(a)},
 $isEH:true},
 e70:{
 "^":"TpZ:12;",
-$1:function(a){return J.DB(a)},
+$1:function(a){return J.eU(a)},
 $isEH:true},
 e71:{
 "^":"TpZ:12;",
-$1:function(a){return a.gGf()},
+$1:function(a){return J.DB(a)},
 $isEH:true},
 e72:{
 "^":"TpZ:12;",
-$1:function(a){return a.gvS()},
+$1:function(a){return a.gGf()},
 $isEH:true},
 e73:{
 "^":"TpZ:12;",
-$1:function(a){return a.gJL()},
+$1:function(a){return a.gvS()},
 $isEH:true},
 e74:{
 "^":"TpZ:12;",
-$1:function(a){return J.Er(a)},
+$1:function(a){return a.gMp()},
 $isEH:true},
 e75:{
 "^":"TpZ:12;",
-$1:function(a){return J.OB(a)},
+$1:function(a){return J.Er(a)},
 $isEH:true},
 e76:{
 "^":"TpZ:12;",
-$1:function(a){return J.YQ(a)},
+$1:function(a){return J.OB(a)},
 $isEH:true},
 e77:{
 "^":"TpZ:12;",
-$1:function(a){return J.tC(a)},
+$1:function(a){return J.YQ(a)},
 $isEH:true},
 e78:{
 "^":"TpZ:12;",
-$1:function(a){return a.gu9()},
+$1:function(a){return J.Xf(a)},
 $isEH:true},
 e79:{
 "^":"TpZ:12;",
-$1:function(a){return J.aW(a)},
+$1:function(a){return a.gu9()},
 $isEH:true},
 e80:{
 "^":"TpZ:12;",
-$1:function(a){return J.aB(a)},
+$1:function(a){return J.aW(a)},
 $isEH:true},
 e81:{
 "^":"TpZ:12;",
-$1:function(a){return a.gL4()},
+$1:function(a){return J.aB(a)},
 $isEH:true},
 e82:{
 "^":"TpZ:12;",
-$1:function(a){return a.gaj()},
+$1:function(a){return a.gL4()},
 $isEH:true},
 e83:{
 "^":"TpZ:12;",
-$1:function(a){return a.giq()},
+$1:function(a){return a.gaj()},
 $isEH:true},
 e84:{
 "^":"TpZ:12;",
-$1:function(a){return a.gBm()},
+$1:function(a){return a.giq()},
 $isEH:true},
 e85:{
 "^":"TpZ:12;",
-$1:function(a){return J.xR(a)},
+$1:function(a){return a.gBm()},
 $isEH:true},
 e86:{
 "^":"TpZ:12;",
-$1:function(a){return J.US(a)},
+$1:function(a){return J.xR(a)},
 $isEH:true},
 e87:{
 "^":"TpZ:12;",
-$1:function(a){return a.gNI()},
+$1:function(a){return J.AR(a)},
 $isEH:true},
 e88:{
 "^":"TpZ:12;",
-$1:function(a){return a.gva()},
+$1:function(a){return a.gNI()},
 $isEH:true},
 e89:{
 "^":"TpZ:12;",
-$1:function(a){return a.gKt()},
+$1:function(a){return a.gva()},
 $isEH:true},
 e90:{
 "^":"TpZ:12;",
-$1:function(a){return a.gp2()},
+$1:function(a){return a.gKt()},
 $isEH:true},
 e91:{
 "^":"TpZ:12;",
-$1:function(a){return J.IA(a)},
+$1:function(a){return a.gp2()},
 $isEH:true},
 e92:{
 "^":"TpZ:12;",
-$1:function(a){return J.Ew(a)},
+$1:function(a){return J.IA(a)},
 $isEH:true},
 e93:{
 "^":"TpZ:12;",
-$1:function(a){return a.gVM()},
+$1:function(a){return J.Ew(a)},
 $isEH:true},
 e94:{
 "^":"TpZ:12;",
-$1:function(a){return J.Xi(a)},
+$1:function(a){return a.gVM()},
 $isEH:true},
 e95:{
 "^":"TpZ:12;",
-$1:function(a){return J.bL(a)},
+$1:function(a){return J.Xi(a)},
 $isEH:true},
 e96:{
 "^":"TpZ:12;",
-$1:function(a){return a.gUB()},
+$1:function(a){return J.bL(a)},
 $isEH:true},
 e97:{
 "^":"TpZ:12;",
-$1:function(a){return a.gRs()},
+$1:function(a){return a.gUB()},
 $isEH:true},
 e98:{
 "^":"TpZ:12;",
-$1:function(a){return J.ix(a)},
+$1:function(a){return a.gRs()},
 $isEH:true},
 e99:{
 "^":"TpZ:12;",
-$1:function(a){return a.gni()},
+$1:function(a){return J.ix(a)},
 $isEH:true},
 e100:{
 "^":"TpZ:12;",
-$1:function(a){return a.gqy()},
+$1:function(a){return a.gni()},
 $isEH:true},
 e101:{
 "^":"TpZ:12;",
-$1:function(a){return J.wz(a)},
+$1:function(a){return a.gqy()},
 $isEH:true},
 e102:{
 "^":"TpZ:12;",
-$1:function(a){return J.FN(a)},
+$1:function(a){return J.wz(a)},
 $isEH:true},
 e103:{
 "^":"TpZ:12;",
-$1:function(a){return J.Wk(a)},
+$1:function(a){return J.FN(a)},
 $isEH:true},
 e104:{
 "^":"TpZ:12;",
-$1:function(a){return a.gho()},
+$1:function(a){return J.Wk(a)},
 $isEH:true},
 e105:{
 "^":"TpZ:12;",
-$1:function(a){return J.eT(a)},
+$1:function(a){return a.gho()},
 $isEH:true},
 e106:{
 "^":"TpZ:12;",
-$1:function(a){return J.C8(a)},
+$1:function(a){return J.eT(a)},
 $isEH:true},
 e107:{
 "^":"TpZ:12;",
-$1:function(a){return J.tf(a)},
+$1:function(a){return J.C8(a)},
 $isEH:true},
 e108:{
 "^":"TpZ:12;",
-$1:function(a){return J.pO(a)},
+$1:function(a){return J.tf(a)},
 $isEH:true},
 e109:{
 "^":"TpZ:12;",
-$1:function(a){return J.cU(a)},
+$1:function(a){return J.pO(a)},
 $isEH:true},
 e110:{
 "^":"TpZ:12;",
-$1:function(a){return a.gW1()},
+$1:function(a){return J.cU(a)},
 $isEH:true},
 e111:{
 "^":"TpZ:12;",
-$1:function(a){return a.gYG()},
+$1:function(a){return a.gW1()},
 $isEH:true},
 e112:{
 "^":"TpZ:12;",
-$1:function(a){return a.gi2()},
+$1:function(a){return a.gYG()},
 $isEH:true},
 e113:{
 "^":"TpZ:12;",
-$1:function(a){return a.gHY()},
+$1:function(a){return a.gi2()},
 $isEH:true},
 e114:{
 "^":"TpZ:12;",
-$1:function(a){return a.gFo()},
+$1:function(a){return a.gHY()},
 $isEH:true},
 e115:{
 "^":"TpZ:12;",
-$1:function(a){return J.j0(a)},
+$1:function(a){return a.gFo()},
 $isEH:true},
 e116:{
 "^":"TpZ:12;",
-$1:function(a){return J.ZN(a)},
+$1:function(a){return J.j0(a)},
 $isEH:true},
 e117:{
 "^":"TpZ:12;",
-$1:function(a){return J.xa(a)},
+$1:function(a){return J.ZN(a)},
 $isEH:true},
 e118:{
 "^":"TpZ:12;",
-$1:function(a){return J.aT(a)},
+$1:function(a){return J.xa(a)},
 $isEH:true},
 e119:{
 "^":"TpZ:12;",
-$1:function(a){return J.KG(a)},
+$1:function(a){return J.aT(a)},
 $isEH:true},
 e120:{
 "^":"TpZ:12;",
-$1:function(a){return a.giR()},
+$1:function(a){return J.KG(a)},
 $isEH:true},
 e121:{
 "^":"TpZ:12;",
-$1:function(a){return a.gEB()},
+$1:function(a){return a.giR()},
 $isEH:true},
 e122:{
 "^":"TpZ:12;",
-$1:function(a){return J.Iz(a)},
+$1:function(a){return a.gEB()},
 $isEH:true},
 e123:{
 "^":"TpZ:12;",
-$1:function(a){return J.Yq(a)},
+$1:function(a){return J.Iz(a)},
 $isEH:true},
 e124:{
 "^":"TpZ:12;",
-$1:function(a){return J.uY(a)},
+$1:function(a){return J.Yq(a)},
 $isEH:true},
 e125:{
 "^":"TpZ:12;",
-$1:function(a){return J.X7(a)},
+$1:function(a){return J.uY(a)},
 $isEH:true},
 e126:{
 "^":"TpZ:12;",
-$1:function(a){return J.IR(a)},
+$1:function(a){return J.X7(a)},
 $isEH:true},
 e127:{
 "^":"TpZ:12;",
-$1:function(a){return a.gPE()},
+$1:function(a){return J.IR(a)},
 $isEH:true},
 e128:{
 "^":"TpZ:12;",
-$1:function(a){return J.q8(a)},
+$1:function(a){return a.gPE()},
 $isEH:true},
 e129:{
 "^":"TpZ:12;",
-$1:function(a){return a.ghX()},
+$1:function(a){return J.q8(a)},
 $isEH:true},
 e130:{
 "^":"TpZ:12;",
-$1:function(a){return a.gvU()},
+$1:function(a){return a.ghX()},
 $isEH:true},
 e131:{
 "^":"TpZ:12;",
-$1:function(a){return J.jl(a)},
+$1:function(a){return a.gvU()},
 $isEH:true},
 e132:{
 "^":"TpZ:12;",
-$1:function(a){return a.gRd()},
+$1:function(a){return J.jl(a)},
 $isEH:true},
 e133:{
 "^":"TpZ:12;",
-$1:function(a){return J.zY(a)},
+$1:function(a){return J.f2(a)},
 $isEH:true},
 e134:{
 "^":"TpZ:12;",
-$1:function(a){return J.de(a)},
+$1:function(a){return J.zY(a)},
 $isEH:true},
 e135:{
 "^":"TpZ:12;",
-$1:function(a){return J.Ds(a)},
+$1:function(a){return J.de(a)},
 $isEH:true},
 e136:{
 "^":"TpZ:12;",
-$1:function(a){return J.cO(a)},
+$1:function(a){return J.fy(a)},
 $isEH:true},
 e137:{
 "^":"TpZ:12;",
-$1:function(a){return a.gzM()},
+$1:function(a){return J.Ds(a)},
 $isEH:true},
 e138:{
 "^":"TpZ:12;",
-$1:function(a){return a.gMN()},
+$1:function(a){return J.cO(a)},
 $isEH:true},
 e139:{
 "^":"TpZ:12;",
-$1:function(a){return a.giP()},
+$1:function(a){return a.gzM()},
 $isEH:true},
 e140:{
 "^":"TpZ:12;",
-$1:function(a){return a.gmd()},
+$1:function(a){return a.gMN()},
 $isEH:true},
 e141:{
 "^":"TpZ:12;",
-$1:function(a){return a.geH()},
+$1:function(a){return a.giP()},
 $isEH:true},
 e142:{
 "^":"TpZ:12;",
-$1:function(a){return J.yc(a)},
+$1:function(a){return a.gmd()},
 $isEH:true},
 e143:{
 "^":"TpZ:12;",
-$1:function(a){return J.Yf(a)},
+$1:function(a){return a.geH()},
 $isEH:true},
 e144:{
 "^":"TpZ:12;",
-$1:function(a){return J.Zq(a)},
+$1:function(a){return J.yc(a)},
 $isEH:true},
 e145:{
 "^":"TpZ:12;",
-$1:function(a){return J.ih(a)},
+$1:function(a){return J.Yf(a)},
 $isEH:true},
 e146:{
 "^":"TpZ:12;",
-$1:function(a){return J.z2(a)},
+$1:function(a){return J.Zq(a)},
 $isEH:true},
 e147:{
 "^":"TpZ:12;",
-$1:function(a){return J.ZF(a)},
+$1:function(a){return J.ih(a)},
 $isEH:true},
 e148:{
 "^":"TpZ:12;",
-$1:function(a){return J.Lh(a)},
+$1:function(a){return J.z2(a)},
 $isEH:true},
 e149:{
 "^":"TpZ:12;",
-$1:function(a){return J.Zv(a)},
+$1:function(a){return J.ZF(a)},
 $isEH:true},
 e150:{
 "^":"TpZ:12;",
-$1:function(a){return J.O6(a)},
+$1:function(a){return J.FY(a)},
 $isEH:true},
 e151:{
 "^":"TpZ:12;",
-$1:function(a){return J.Pf(a)},
+$1:function(a){return J.Zv(a)},
 $isEH:true},
 e152:{
 "^":"TpZ:12;",
-$1:function(a){return a.gUY()},
+$1:function(a){return J.O6(a)},
 $isEH:true},
 e153:{
 "^":"TpZ:12;",
-$1:function(a){return a.gvK()},
+$1:function(a){return J.Pf(a)},
 $isEH:true},
 e154:{
 "^":"TpZ:12;",
-$1:function(a){return J.Jj(a)},
+$1:function(a){return a.gUY()},
 $isEH:true},
 e155:{
 "^":"TpZ:12;",
-$1:function(a){return J.t8(a)},
+$1:function(a){return a.gvK()},
 $isEH:true},
 e156:{
 "^":"TpZ:12;",
-$1:function(a){return a.gL1()},
+$1:function(a){return J.Jj(a)},
 $isEH:true},
 e157:{
 "^":"TpZ:12;",
-$1:function(a){return a.gxQ()},
+$1:function(a){return J.t8(a)},
 $isEH:true},
 e158:{
 "^":"TpZ:12;",
-$1:function(a){return a.gEl()},
+$1:function(a){return a.gL1()},
 $isEH:true},
 e159:{
 "^":"TpZ:12;",
-$1:function(a){return a.gxH()},
+$1:function(a){return a.gxQ()},
 $isEH:true},
 e160:{
 "^":"TpZ:12;",
-$1:function(a){return J.ee(a)},
+$1:function(a){return a.gEl()},
 $isEH:true},
 e161:{
 "^":"TpZ:12;",
-$1:function(a){return J.JG(a)},
+$1:function(a){return a.gxH()},
 $isEH:true},
 e162:{
 "^":"TpZ:12;",
-$1:function(a){return J.Lp(a)},
+$1:function(a){return J.ee(a)},
 $isEH:true},
 e163:{
 "^":"TpZ:12;",
-$1:function(a){return J.z1(a)},
+$1:function(a){return J.JG(a)},
 $isEH:true},
 e164:{
 "^":"TpZ:12;",
-$1:function(a){return J.AF(a)},
+$1:function(a){return J.Lp(a)},
 $isEH:true},
 e165:{
 "^":"TpZ:12;",
-$1:function(a){return J.LB(a)},
+$1:function(a){return J.z1(a)},
 $isEH:true},
 e166:{
 "^":"TpZ:12;",
-$1:function(a){return J.Kl(a)},
+$1:function(a){return J.AF(a)},
 $isEH:true},
 e167:{
 "^":"TpZ:12;",
-$1:function(a){return a.gU6()},
+$1:function(a){return J.LB(a)},
 $isEH:true},
 e168:{
 "^":"TpZ:12;",
-$1:function(a){return J.cj(a)},
+$1:function(a){return J.Kl(a)},
 $isEH:true},
 e169:{
 "^":"TpZ:12;",
-$1:function(a){return J.br(a)},
+$1:function(a){return a.gcD()},
 $isEH:true},
 e170:{
 "^":"TpZ:12;",
-$1:function(a){return J.jL(a)},
+$1:function(a){return J.cj(a)},
 $isEH:true},
 e171:{
 "^":"TpZ:12;",
-$1:function(a){return J.L6(a)},
+$1:function(a){return J.tC(a)},
 $isEH:true},
 e172:{
 "^":"TpZ:12;",
-$1:function(a){return J.Qa(a)},
+$1:function(a){return J.jL(a)},
 $isEH:true},
 e173:{
 "^":"TpZ:12;",
-$1:function(a){return J.ks(a)},
+$1:function(a){return J.L6(a)},
 $isEH:true},
 e174:{
 "^":"TpZ:12;",
-$1:function(a){return J.CN(a)},
+$1:function(a){return a.gj9()},
 $isEH:true},
 e175:{
 "^":"TpZ:12;",
-$1:function(a){return J.ql(a)},
+$1:function(a){return J.Qa(a)},
 $isEH:true},
 e176:{
 "^":"TpZ:12;",
-$1:function(a){return J.ul(a)},
+$1:function(a){return J.Tv(a)},
 $isEH:true},
 e177:{
 "^":"TpZ:12;",
-$1:function(a){return a.gUx()},
+$1:function(a){return J.CN(a)},
 $isEH:true},
 e178:{
 "^":"TpZ:12;",
-$1:function(a){return J.id(a)},
+$1:function(a){return J.ql(a)},
 $isEH:true},
 e179:{
 "^":"TpZ:12;",
-$1:function(a){return a.gm8()},
+$1:function(a){return J.ul(a)},
 $isEH:true},
 e180:{
 "^":"TpZ:12;",
-$1:function(a){return J.BZ(a)},
+$1:function(a){return a.gUx()},
 $isEH:true},
 e181:{
 "^":"TpZ:12;",
-$1:function(a){return J.H1(a)},
+$1:function(a){return J.id(a)},
 $isEH:true},
 e182:{
 "^":"TpZ:12;",
-$1:function(a){return J.Cm(a)},
+$1:function(a){return a.gm8()},
 $isEH:true},
 e183:{
 "^":"TpZ:12;",
-$1:function(a){return J.fU(a)},
+$1:function(a){return J.BZ(a)},
 $isEH:true},
 e184:{
 "^":"TpZ:12;",
-$1:function(a){return J.GH(a)},
+$1:function(a){return J.H1(a)},
 $isEH:true},
 e185:{
 "^":"TpZ:12;",
-$1:function(a){return J.n8(a)},
+$1:function(a){return J.At(a)},
 $isEH:true},
 e186:{
 "^":"TpZ:12;",
-$1:function(a){return a.gLc()},
+$1:function(a){return J.fU(a)},
 $isEH:true},
 e187:{
 "^":"TpZ:12;",
-$1:function(a){return a.gNS()},
+$1:function(a){return J.GH(a)},
 $isEH:true},
 e188:{
 "^":"TpZ:12;",
-$1:function(a){return a.gVI()},
+$1:function(a){return J.bS(a)},
 $isEH:true},
 e189:{
 "^":"TpZ:12;",
-$1:function(a){return J.iL(a)},
+$1:function(a){return a.gua()},
 $isEH:true},
 e190:{
 "^":"TpZ:12;",
-$1:function(a){return J.k7(a)},
+$1:function(a){return a.gNS()},
 $isEH:true},
 e191:{
 "^":"TpZ:12;",
-$1:function(a){return J.uW(a)},
+$1:function(a){return a.gVI()},
 $isEH:true},
 e192:{
 "^":"TpZ:12;",
-$1:function(a){return J.W2(a)},
+$1:function(a){return J.iL(a)},
 $isEH:true},
 e193:{
 "^":"TpZ:12;",
-$1:function(a){return J.UT(a)},
+$1:function(a){return J.k7(a)},
 $isEH:true},
 e194:{
 "^":"TpZ:12;",
-$1:function(a){return J.Kd(a)},
+$1:function(a){return J.uW(a)},
 $isEH:true},
 e195:{
 "^":"TpZ:12;",
-$1:function(a){return J.pU(a)},
+$1:function(a){return J.W2(a)},
 $isEH:true},
 e196:{
 "^":"TpZ:12;",
-$1:function(a){return J.Tg(a)},
+$1:function(a){return J.UT(a)},
 $isEH:true},
 e197:{
 "^":"TpZ:12;",
-$1:function(a){return a.gVc()},
+$1:function(a){return J.Kd(a)},
 $isEH:true},
 e198:{
 "^":"TpZ:12;",
-$1:function(a){return a.gpF()},
+$1:function(a){return J.pU(a)},
 $isEH:true},
 e199:{
 "^":"TpZ:12;",
-$1:function(a){return J.TY(a)},
+$1:function(a){return J.Tg(a)},
 $isEH:true},
 e200:{
 "^":"TpZ:12;",
-$1:function(a){return a.gA6()},
+$1:function(a){return a.gVc()},
 $isEH:true},
 e201:{
 "^":"TpZ:12;",
-$1:function(a){return J.Ry(a)},
+$1:function(a){return a.gpF()},
 $isEH:true},
 e202:{
 "^":"TpZ:12;",
-$1:function(a){return J.UP(a)},
+$1:function(a){return J.TY(a)},
 $isEH:true},
 e203:{
 "^":"TpZ:12;",
-$1:function(a){return J.UA(a)},
+$1:function(a){return a.gA6()},
 $isEH:true},
 e204:{
 "^":"TpZ:12;",
-$1:function(a){return J.zH(a)},
+$1:function(a){return J.Ry(a)},
 $isEH:true},
 e205:{
 "^":"TpZ:12;",
-$1:function(a){return J.Zs(a)},
+$1:function(a){return J.UP(a)},
 $isEH:true},
 e206:{
 "^":"TpZ:12;",
-$1:function(a){return a.gXR()},
+$1:function(a){return J.o9(a)},
 $isEH:true},
 e207:{
 "^":"TpZ:12;",
-$1:function(a){return J.NB(a)},
+$1:function(a){return J.zH(a)},
 $isEH:true},
 e208:{
 "^":"TpZ:12;",
-$1:function(a){return a.gzS()},
+$1:function(a){return J.Zs(a)},
 $isEH:true},
 e209:{
 "^":"TpZ:12;",
-$1:function(a){return J.Cr(a)},
+$1:function(a){return a.gXR()},
 $isEH:true},
 e210:{
 "^":"TpZ:12;",
-$1:function(a){return J.oN(a)},
+$1:function(a){return J.NB(a)},
 $isEH:true},
 e211:{
 "^":"TpZ:12;",
-$1:function(a){return a.gV8()},
+$1:function(a){return a.gzS()},
 $isEH:true},
 e212:{
 "^":"TpZ:12;",
-$1:function(a){return a.gp8()},
+$1:function(a){return J.U8(a)},
 $isEH:true},
 e213:{
 "^":"TpZ:12;",
-$1:function(a){return J.F9(a)},
+$1:function(a){return J.oN(a)},
 $isEH:true},
 e214:{
 "^":"TpZ:12;",
-$1:function(a){return J.HB(a)},
+$1:function(a){return a.gV8()},
 $isEH:true},
 e215:{
 "^":"TpZ:12;",
-$1:function(a){return J.yI(a)},
+$1:function(a){return a.gp8()},
 $isEH:true},
 e216:{
 "^":"TpZ:12;",
-$1:function(a){return J.jx(a)},
+$1:function(a){return J.F9(a)},
 $isEH:true},
 e217:{
 "^":"TpZ:12;",
-$1:function(a){return J.jB(a)},
+$1:function(a){return J.HB(a)},
 $isEH:true},
 e218:{
 "^":"TpZ:12;",
-$1:function(a){return a.gS5()},
+$1:function(a){return J.bh(a)},
 $isEH:true},
 e219:{
 "^":"TpZ:12;",
-$1:function(a){return a.gDo()},
+$1:function(a){return J.jx(a)},
 $isEH:true},
 e220:{
 "^":"TpZ:12;",
-$1:function(a){return a.guj()},
+$1:function(a){return J.jB(a)},
 $isEH:true},
 e221:{
 "^":"TpZ:12;",
-$1:function(a){return J.j1(a)},
+$1:function(a){return J.C7(a)},
 $isEH:true},
 e222:{
 "^":"TpZ:12;",
-$1:function(a){return J.Aw(a)},
+$1:function(a){return J.vI(a)},
 $isEH:true},
 e223:{
 "^":"TpZ:12;",
-$1:function(a){return J.l2(a)},
+$1:function(a){return J.Pq(a)},
 $isEH:true},
 e224:{
 "^":"TpZ:12;",
-$1:function(a){return a.gm2()},
+$1:function(a){return a.gS5()},
 $isEH:true},
 e225:{
 "^":"TpZ:12;",
-$1:function(a){return J.dY(a)},
+$1:function(a){return a.gDo()},
 $isEH:true},
 e226:{
 "^":"TpZ:12;",
-$1:function(a){return J.yq(a)},
+$1:function(a){return a.guj()},
 $isEH:true},
 e227:{
 "^":"TpZ:12;",
-$1:function(a){return a.gki()},
+$1:function(a){return J.j1(a)},
 $isEH:true},
 e228:{
 "^":"TpZ:12;",
-$1:function(a){return a.gZn()},
+$1:function(a){return J.Aw(a)},
 $isEH:true},
 e229:{
 "^":"TpZ:12;",
-$1:function(a){return a.gvs()},
+$1:function(a){return J.l2(a)},
 $isEH:true},
 e230:{
 "^":"TpZ:12;",
-$1:function(a){return a.gVh()},
+$1:function(a){return a.gm2()},
 $isEH:true},
 e231:{
 "^":"TpZ:12;",
-$1:function(a){return a.gZX()},
+$1:function(a){return J.dY(a)},
 $isEH:true},
 e232:{
 "^":"TpZ:12;",
-$1:function(a){return J.Rg(a)},
+$1:function(a){return J.yq(a)},
 $isEH:true},
 e233:{
 "^":"TpZ:12;",
-$1:function(a){return J.d5(a)},
+$1:function(a){return a.gki()},
 $isEH:true},
 e234:{
 "^":"TpZ:12;",
-$1:function(a){return J.SG(a)},
+$1:function(a){return a.gZn()},
 $isEH:true},
 e235:{
 "^":"TpZ:12;",
-$1:function(a){return J.cs(a)},
+$1:function(a){return a.gvs()},
 $isEH:true},
 e236:{
 "^":"TpZ:12;",
-$1:function(a){return a.gVF()},
+$1:function(a){return a.gVh()},
 $isEH:true},
 e237:{
 "^":"TpZ:12;",
-$1:function(a){return a.gkw()},
+$1:function(a){return a.gZX()},
 $isEH:true},
 e238:{
 "^":"TpZ:12;",
-$1:function(a){return J.K2(a)},
+$1:function(a){return J.Rg(a)},
 $isEH:true},
 e239:{
 "^":"TpZ:12;",
-$1:function(a){return J.uy(a)},
+$1:function(a){return J.d5(a)},
 $isEH:true},
 e240:{
 "^":"TpZ:12;",
-$1:function(a){return a.gEy()},
+$1:function(a){return J.YG(a)},
 $isEH:true},
 e241:{
 "^":"TpZ:12;",
-$1:function(a){return J.XJ(a)},
+$1:function(a){return J.SG(a)},
 $isEH:true},
 e242:{
 "^":"TpZ:12;",
-$1:function(a){return a.gjW()},
+$1:function(a){return J.cs(a)},
 $isEH:true},
 e243:{
 "^":"TpZ:12;",
-$1:function(a){return J.P4(a)},
+$1:function(a){return a.gVF()},
 $isEH:true},
 e244:{
 "^":"TpZ:12;",
-$1:function(a){return a.gJk()},
+$1:function(a){return a.gkw()},
 $isEH:true},
 e245:{
 "^":"TpZ:12;",
-$1:function(a){return J.Q2(a)},
+$1:function(a){return J.K2(a)},
 $isEH:true},
 e246:{
 "^":"TpZ:12;",
-$1:function(a){return a.gSu()},
+$1:function(a){return J.uy(a)},
 $isEH:true},
 e247:{
 "^":"TpZ:12;",
-$1:function(a){return a.gSU()},
+$1:function(a){return a.gEy()},
 $isEH:true},
 e248:{
 "^":"TpZ:12;",
-$1:function(a){return a.gFc()},
+$1:function(a){return J.XJ(a)},
 $isEH:true},
 e249:{
 "^":"TpZ:12;",
-$1:function(a){return a.gYY()},
+$1:function(a){return a.gjW()},
 $isEH:true},
 e250:{
 "^":"TpZ:12;",
-$1:function(a){return a.gZ3()},
+$1:function(a){return J.Sl(a)},
 $isEH:true},
 e251:{
 "^":"TpZ:12;",
-$1:function(a){return J.ry(a)},
+$1:function(a){return a.gJk()},
 $isEH:true},
 e252:{
 "^":"TpZ:12;",
-$1:function(a){return J.I2(a)},
+$1:function(a){return J.Q2(a)},
 $isEH:true},
 e253:{
 "^":"TpZ:12;",
-$1:function(a){return a.gTX()},
+$1:function(a){return a.gSu()},
 $isEH:true},
 e254:{
 "^":"TpZ:12;",
-$1:function(a){return J.NC(a)},
+$1:function(a){return a.gSU()},
 $isEH:true},
 e255:{
 "^":"TpZ:12;",
-$1:function(a){return a.gV0()},
+$1:function(a){return a.gXA()},
 $isEH:true},
 e256:{
-"^":"TpZ:79;",
-$2:function(a,b){J.RX(a,b)},
+"^":"TpZ:12;",
+$1:function(a){return a.gYY()},
 $isEH:true},
 e257:{
-"^":"TpZ:79;",
-$2:function(a,b){J.L9(a,b)},
+"^":"TpZ:12;",
+$1:function(a){return a.gZ3()},
 $isEH:true},
 e258:{
-"^":"TpZ:79;",
-$2:function(a,b){J.NV(a,b)},
+"^":"TpZ:12;",
+$1:function(a){return J.Hg(a)},
 $isEH:true},
 e259:{
-"^":"TpZ:79;",
-$2:function(a,b){J.l7(a,b)},
+"^":"TpZ:12;",
+$1:function(a){return J.I2(a)},
 $isEH:true},
 e260:{
-"^":"TpZ:79;",
-$2:function(a,b){J.kB(a,b)},
+"^":"TpZ:12;",
+$1:function(a){return a.gTX()},
 $isEH:true},
 e261:{
-"^":"TpZ:79;",
-$2:function(a,b){J.Ae(a,b)},
+"^":"TpZ:12;",
+$1:function(a){return J.NC(a)},
 $isEH:true},
 e262:{
-"^":"TpZ:79;",
-$2:function(a,b){J.IX(a,b)},
+"^":"TpZ:12;",
+$1:function(a){return a.gV0()},
 $isEH:true},
 e263:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Ed(a,b)},
+$2:function(a,b){J.RX(a,b)},
 $isEH:true},
 e264:{
 "^":"TpZ:79;",
-$2:function(a,b){J.NE(a,b)},
+$2:function(a,b){J.L9(a,b)},
 $isEH:true},
 e265:{
 "^":"TpZ:79;",
-$2:function(a,b){J.WI(a,b)},
+$2:function(a,b){J.NV(a,b)},
 $isEH:true},
 e266:{
 "^":"TpZ:79;",
-$2:function(a,b){J.NZ(a,b)},
+$2:function(a,b){J.l7(a,b)},
 $isEH:true},
 e267:{
 "^":"TpZ:79;",
-$2:function(a,b){J.T5(a,b)},
+$2:function(a,b){J.kB(a,b)},
 $isEH:true},
 e268:{
 "^":"TpZ:79;",
-$2:function(a,b){J.i0(a,b)},
+$2:function(a,b){J.Ae(a,b)},
 $isEH:true},
 e269:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Sf(a,b)},
+$2:function(a,b){J.IX(a,b)},
 $isEH:true},
 e270:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Jl(a,b)},
+$2:function(a,b){J.Ed(a,b)},
 $isEH:true},
 e271:{
 "^":"TpZ:79;",
-$2:function(a,b){J.TP(a,b)},
+$2:function(a,b){J.NE(a,b)},
 $isEH:true},
 e272:{
 "^":"TpZ:79;",
-$2:function(a,b){J.LM(a,b)},
+$2:function(a,b){J.WI(a,b)},
 $isEH:true},
 e273:{
 "^":"TpZ:79;",
-$2:function(a,b){J.au(a,b)},
+$2:function(a,b){J.NZ(a,b)},
 $isEH:true},
 e274:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Ac(a,b)},
+$2:function(a,b){J.T5(a,b)},
 $isEH:true},
 e275:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Yz(a,b)},
+$2:function(a,b){J.FI(a,b)},
 $isEH:true},
 e276:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sej(b)},
+$2:function(a,b){J.i0(a,b)},
 $isEH:true},
 e277:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sw2(b)},
+$2:function(a,b){J.Sf(a,b)},
 $isEH:true},
 e278:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Qr(a,b)},
+$2:function(a,b){J.Jl(a,b)},
 $isEH:true},
 e279:{
 "^":"TpZ:79;",
-$2:function(a,b){J.xW(a,b)},
+$2:function(a,b){J.TP(a,b)},
 $isEH:true},
 e280:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Wy(a,b)},
+$2:function(a,b){J.LM(a,b)},
 $isEH:true},
 e281:{
 "^":"TpZ:79;",
-$2:function(a,b){J.i2(a,b)},
+$2:function(a,b){J.au(a,b)},
 $isEH:true},
 e282:{
 "^":"TpZ:79;",
-$2:function(a,b){J.BC(a,b)},
+$2:function(a,b){J.Ac(a,b)},
 $isEH:true},
 e283:{
 "^":"TpZ:79;",
-$2:function(a,b){J.pB(a,b)},
+$2:function(a,b){J.Yz(a,b)},
 $isEH:true},
 e284:{
 "^":"TpZ:79;",
-$2:function(a,b){J.NO(a,b)},
+$2:function(a,b){a.sej(b)},
 $isEH:true},
 e285:{
 "^":"TpZ:79;",
-$2:function(a,b){J.WB(a,b)},
+$2:function(a,b){a.sw2(b)},
 $isEH:true},
 e286:{
 "^":"TpZ:79;",
-$2:function(a,b){J.JZ(a,b)},
+$2:function(a,b){J.Qr(a,b)},
 $isEH:true},
 e287:{
 "^":"TpZ:79;",
-$2:function(a,b){J.fR(a,b)},
+$2:function(a,b){J.xW(a,b)},
 $isEH:true},
 e288:{
 "^":"TpZ:79;",
-$2:function(a,b){J.uP(a,b)},
+$2:function(a,b){J.Wy(a,b)},
 $isEH:true},
 e289:{
 "^":"TpZ:79;",
-$2:function(a,b){J.vJ(a,b)},
+$2:function(a,b){J.i2(a,b)},
 $isEH:true},
 e290:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Nf(a,b)},
+$2:function(a,b){J.BC(a,b)},
 $isEH:true},
 e291:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Pl(a,b)},
+$2:function(a,b){J.pB(a,b)},
 $isEH:true},
 e292:{
 "^":"TpZ:79;",
-$2:function(a,b){J.C3(a,b)},
+$2:function(a,b){J.NO(a,b)},
 $isEH:true},
 e293:{
 "^":"TpZ:79;",
-$2:function(a,b){J.AI(a,b)},
+$2:function(a,b){J.WB(a,b)},
 $isEH:true},
 e294:{
 "^":"TpZ:79;",
-$2:function(a,b){J.OE(a,b)},
+$2:function(a,b){J.JZ(a,b)},
 $isEH:true},
 e295:{
 "^":"TpZ:79;",
-$2:function(a,b){J.nA(a,b)},
+$2:function(a,b){J.OH(a,b)},
 $isEH:true},
 e296:{
 "^":"TpZ:79;",
-$2:function(a,b){J.fb(a,b)},
+$2:function(a,b){J.uP(a,b)},
 $isEH:true},
 e297:{
 "^":"TpZ:79;",
-$2:function(a,b){a.siq(b)},
+$2:function(a,b){J.vJ(a,b)},
 $isEH:true},
 e298:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Qy(a,b)},
+$2:function(a,b){J.Nf(a,b)},
 $isEH:true},
 e299:{
 "^":"TpZ:79;",
-$2:function(a,b){J.x0(a,b)},
+$2:function(a,b){J.Pl(a,b)},
 $isEH:true},
 e300:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sKt(b)},
+$2:function(a,b){J.C3(a,b)},
 $isEH:true},
 e301:{
 "^":"TpZ:79;",
-$2:function(a,b){J.cV(a,b)},
+$2:function(a,b){J.AI(a,b)},
 $isEH:true},
 e302:{
 "^":"TpZ:79;",
-$2:function(a,b){J.mU(a,b)},
+$2:function(a,b){J.OE(a,b)},
 $isEH:true},
 e303:{
 "^":"TpZ:79;",
-$2:function(a,b){J.uM(a,b)},
+$2:function(a,b){J.nA(a,b)},
 $isEH:true},
 e304:{
 "^":"TpZ:79;",
-$2:function(a,b){J.GZ(a,b)},
+$2:function(a,b){J.fb(a,b)},
 $isEH:true},
 e305:{
 "^":"TpZ:79;",
-$2:function(a,b){J.hS(a,b)},
+$2:function(a,b){a.siq(b)},
 $isEH:true},
 e306:{
 "^":"TpZ:79;",
-$2:function(a,b){J.mz(a,b)},
+$2:function(a,b){J.Qy(a,b)},
 $isEH:true},
 e307:{
 "^":"TpZ:79;",
-$2:function(a,b){J.pA(a,b)},
+$2:function(a,b){J.x0(a,b)},
 $isEH:true},
 e308:{
 "^":"TpZ:79;",
-$2:function(a,b){a.shX(b)},
+$2:function(a,b){a.sKt(b)},
 $isEH:true},
 e309:{
 "^":"TpZ:79;",
-$2:function(a,b){J.cl(a,b)},
+$2:function(a,b){J.cV(a,b)},
 $isEH:true},
 e310:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Ql(a,b)},
+$2:function(a,b){J.mU(a,b)},
 $isEH:true},
 e311:{
 "^":"TpZ:79;",
-$2:function(a,b){J.xQ(a,b)},
+$2:function(a,b){J.Rp(a,b)},
 $isEH:true},
 e312:{
 "^":"TpZ:79;",
-$2:function(a,b){J.MX(a,b)},
+$2:function(a,b){J.GZ(a,b)},
 $isEH:true},
 e313:{
 "^":"TpZ:79;",
-$2:function(a,b){J.A4(a,b)},
+$2:function(a,b){J.hS(a,b)},
 $isEH:true},
 e314:{
 "^":"TpZ:79;",
-$2:function(a,b){J.wD(a,b)},
+$2:function(a,b){J.mz(a,b)},
 $isEH:true},
 e315:{
 "^":"TpZ:79;",
-$2:function(a,b){J.wJ(a,b)},
+$2:function(a,b){J.pA(a,b)},
 $isEH:true},
 e316:{
 "^":"TpZ:79;",
-$2:function(a,b){J.oJ(a,b)},
+$2:function(a,b){a.shX(b)},
 $isEH:true},
 e317:{
 "^":"TpZ:79;",
-$2:function(a,b){J.DF(a,b)},
+$2:function(a,b){J.cl(a,b)},
 $isEH:true},
 e318:{
 "^":"TpZ:79;",
-$2:function(a,b){a.svK(b)},
+$2:function(a,b){J.BL(a,b)},
 $isEH:true},
 e319:{
 "^":"TpZ:79;",
-$2:function(a,b){J.h9(a,b)},
+$2:function(a,b){J.Ql(a,b)},
 $isEH:true},
 e320:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sL1(b)},
+$2:function(a,b){J.xQ(a,b)},
 $isEH:true},
 e321:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sEl(b)},
+$2:function(a,b){J.Mh(a,b)},
 $isEH:true},
 e322:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sxH(b)},
+$2:function(a,b){J.MX(a,b)},
 $isEH:true},
 e323:{
 "^":"TpZ:79;",
-$2:function(a,b){J.XF(a,b)},
+$2:function(a,b){J.A4(a,b)},
 $isEH:true},
 e324:{
 "^":"TpZ:79;",
-$2:function(a,b){J.A1(a,b)},
+$2:function(a,b){J.wD(a,b)},
 $isEH:true},
 e325:{
 "^":"TpZ:79;",
-$2:function(a,b){J.SF(a,b)},
+$2:function(a,b){J.wJ(a,b)},
 $isEH:true},
 e326:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Qv(a,b)},
+$2:function(a,b){J.oJ(a,b)},
 $isEH:true},
 e327:{
 "^":"TpZ:79;",
-$2:function(a,b){J.R8(a,b)},
+$2:function(a,b){J.DF(a,b)},
 $isEH:true},
 e328:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Xg(a,b)},
+$2:function(a,b){a.svK(b)},
 $isEH:true},
 e329:{
 "^":"TpZ:79;",
-$2:function(a,b){J.aw(a,b)},
+$2:function(a,b){J.h9(a,b)},
 $isEH:true},
 e330:{
 "^":"TpZ:79;",
-$2:function(a,b){J.CJ(a,b)},
+$2:function(a,b){a.sL1(b)},
 $isEH:true},
 e331:{
 "^":"TpZ:79;",
-$2:function(a,b){J.P2(a,b)},
+$2:function(a,b){a.sEl(b)},
 $isEH:true},
 e332:{
 "^":"TpZ:79;",
-$2:function(a,b){J.J0(a,b)},
+$2:function(a,b){a.sxH(b)},
 $isEH:true},
 e333:{
 "^":"TpZ:79;",
-$2:function(a,b){J.PP(a,b)},
+$2:function(a,b){J.XF(a,b)},
 $isEH:true},
 e334:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Sj(a,b)},
+$2:function(a,b){J.A1(a,b)},
 $isEH:true},
 e335:{
 "^":"TpZ:79;",
-$2:function(a,b){J.tv(a,b)},
+$2:function(a,b){J.SF(a,b)},
 $isEH:true},
 e336:{
 "^":"TpZ:79;",
-$2:function(a,b){J.w7(a,b)},
+$2:function(a,b){J.Qv(a,b)},
 $isEH:true},
 e337:{
 "^":"TpZ:79;",
-$2:function(a,b){J.ME(a,b)},
+$2:function(a,b){J.R8(a,b)},
 $isEH:true},
 e338:{
 "^":"TpZ:79;",
-$2:function(a,b){J.kX(a,b)},
+$2:function(a,b){J.Xg(a,b)},
 $isEH:true},
 e339:{
 "^":"TpZ:79;",
-$2:function(a,b){J.q0(a,b)},
+$2:function(a,b){J.aw(a,b)},
 $isEH:true},
 e340:{
 "^":"TpZ:79;",
-$2:function(a,b){J.EJ(a,b)},
+$2:function(a,b){J.CJ(a,b)},
 $isEH:true},
 e341:{
 "^":"TpZ:79;",
-$2:function(a,b){J.iH(a,b)},
+$2:function(a,b){J.P2(a,b)},
 $isEH:true},
 e342:{
 "^":"TpZ:79;",
-$2:function(a,b){J.SO(a,b)},
+$2:function(a,b){J.J0(a,b)},
 $isEH:true},
 e343:{
 "^":"TpZ:79;",
-$2:function(a,b){J.B9(a,b)},
+$2:function(a,b){J.PP(a,b)},
 $isEH:true},
 e344:{
 "^":"TpZ:79;",
-$2:function(a,b){J.PN(a,b)},
+$2:function(a,b){J.Sj(a,b)},
 $isEH:true},
 e345:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sVc(b)},
+$2:function(a,b){J.tv(a,b)},
 $isEH:true},
 e346:{
 "^":"TpZ:79;",
-$2:function(a,b){J.By(a,b)},
+$2:function(a,b){J.w7(a,b)},
 $isEH:true},
 e347:{
 "^":"TpZ:79;",
-$2:function(a,b){J.jd(a,b)},
+$2:function(a,b){J.ME(a,b)},
 $isEH:true},
 e348:{
 "^":"TpZ:79;",
-$2:function(a,b){J.uH(a,b)},
+$2:function(a,b){J.kX(a,b)},
 $isEH:true},
 e349:{
 "^":"TpZ:79;",
-$2:function(a,b){J.ZI(a,b)},
+$2:function(a,b){J.q0(a,b)},
 $isEH:true},
 e350:{
 "^":"TpZ:79;",
-$2:function(a,b){J.fa(a,b)},
+$2:function(a,b){J.EJ(a,b)},
 $isEH:true},
 e351:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Cu(a,b)},
+$2:function(a,b){J.iH(a,b)},
 $isEH:true},
 e352:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sV8(b)},
+$2:function(a,b){J.SO(a,b)},
 $isEH:true},
 e353:{
 "^":"TpZ:79;",
-$2:function(a,b){J.EC(a,b)},
+$2:function(a,b){J.B9(a,b)},
 $isEH:true},
 e354:{
 "^":"TpZ:79;",
-$2:function(a,b){J.xH(a,b)},
+$2:function(a,b){J.PN(a,b)},
 $isEH:true},
 e355:{
 "^":"TpZ:79;",
-$2:function(a,b){J.wu(a,b)},
+$2:function(a,b){a.sVc(b)},
 $isEH:true},
 e356:{
 "^":"TpZ:79;",
-$2:function(a,b){J.Tx(a,b)},
+$2:function(a,b){J.By(a,b)},
 $isEH:true},
 e357:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sDo(b)},
+$2:function(a,b){J.jd(a,b)},
 $isEH:true},
 e358:{
 "^":"TpZ:79;",
-$2:function(a,b){a.suj(b)},
+$2:function(a,b){J.uH(a,b)},
 $isEH:true},
 e359:{
 "^":"TpZ:79;",
-$2:function(a,b){J.H3(a,b)},
+$2:function(a,b){J.ZI(a,b)},
 $isEH:true},
 e360:{
 "^":"TpZ:79;",
-$2:function(a,b){J.TZ(a,b)},
+$2:function(a,b){J.fa(a,b)},
 $isEH:true},
 e361:{
 "^":"TpZ:79;",
-$2:function(a,b){J.t3(a,b)},
+$2:function(a,b){J.Cu(a,b)},
 $isEH:true},
 e362:{
 "^":"TpZ:79;",
-$2:function(a,b){J.my(a,b)},
+$2:function(a,b){a.sV8(b)},
 $isEH:true},
 e363:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sVF(b)},
+$2:function(a,b){J.EC(a,b)},
 $isEH:true},
 e364:{
 "^":"TpZ:79;",
-$2:function(a,b){J.yO(a,b)},
+$2:function(a,b){J.xH(a,b)},
 $isEH:true},
 e365:{
 "^":"TpZ:79;",
-$2:function(a,b){J.ZU(a,b)},
+$2:function(a,b){J.wu(a,b)},
 $isEH:true},
 e366:{
 "^":"TpZ:79;",
-$2:function(a,b){a.sjW(b)},
+$2:function(a,b){J.Tx(a,b)},
 $isEH:true},
 e367:{
 "^":"TpZ:79;",
-$2:function(a,b){J.tQ(a,b)},
+$2:function(a,b){J.HT(a,b)},
 $isEH:true},
 e368:{
 "^":"TpZ:79;",
-$2:function(a,b){J.tH(a,b)},
+$2:function(a,b){J.FH(a,b)},
 $isEH:true},
 e369:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.o8(a,b)},
 $isEH:true},
 e370:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){a.sDo(b)},
 $isEH:true},
 e371:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){a.suj(b)},
 $isEH:true},
 e372:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.H3(a,b)},
 $isEH:true},
 e373:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.TZ(a,b)},
 $isEH:true},
 e374:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.t3(a,b)},
 $isEH:true},
 e375:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.my(a,b)},
 $isEH:true},
 e376:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){a.sVF(b)},
 $isEH:true},
 e377:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.yO(a,b)},
 $isEH:true},
 e378:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.ZU(a,b)},
 $isEH:true},
 e379:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){a.sjW(b)},
 $isEH:true},
 e380:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.tQ(a,b)},
 $isEH:true},
 e381:{
-"^":"TpZ:74;",
-$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
+"^":"TpZ:79;",
+$2:function(a,b){J.tH(a,b)},
 $isEH:true},
 e382:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e383:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e384:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e385:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e386:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e387:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e388:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e389:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e390:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e391:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e392:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e393:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e394:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e395:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e396:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e397:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e398:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e399:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e400:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e401:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e402:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e403:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e404:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e405:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e406:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-ref",C.Jf)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e407:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("breakpoint-toggle",C.Nw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e408:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e409:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e410:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e411:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e412:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e413:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e414:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e415:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e416:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e417:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e418:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e419:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e420:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-ref",C.mK)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e421:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e422:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e423:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e424:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e425:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e426:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e427:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e428:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e429:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e430:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e431:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e432:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e433:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e434:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e435:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e436:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e437:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e438:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e439:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e440:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e441:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e442:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e443:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e444:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e445:{
 "^":"TpZ:74;",
-$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
+$0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e446:{
 "^":"TpZ:74;",
+$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e447:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e448:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e449:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e450:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e451:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e452:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e453:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e454:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e455:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e456:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e457:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e458:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e459:{
+"^":"TpZ:74;",
+$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e460:{
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"],
-$isEH:true}},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
+$isEH:true}},1],["","",,B,{
 "^":"",
 G6:{
-"^":"tu;BW,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"tu;BW,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 grs:function(a){return a.BW},
 srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
-SK:[function(a,b){J.cI(a.BW).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.BW).YM(b)},"$1","gvC",2,0,19,100],
 static:{Dw:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -4452,23 +4525,23 @@
 return a}}},
 tu:{
 "^":"uL+Pi;",
-$isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
+$isd3:true}}],["","",,Q,{
 "^":"",
 eW:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{rt:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.YZz.ZL(a)
 C.YZz.XI(a)
-return a}}}}],["class_tree_element","package:observatory/src/elements/class_tree.dart",,O,{
+return a}}}}],["","",,O,{
 "^":"",
 CZ:{
 "^":"Y2;od>,Ru>,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
@@ -4487,16 +4560,16 @@
 o8:function(){},
 Nh:function(){return J.q8(J.Mx(this.Ru))>0}},
 eo:{
-"^":"Dsd;CA,Hm=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"Dsd;CA,Hm=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 god:function(a){return a.CA},
 sod:function(a,b){a.CA=this.ct(a,C.rB,a.CA,b)},
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=R.tB([])
-a.Hm=new G.xK(z,null,null)
+a.Hm=new G.iY(z,null,null)
 z=a.CA
 if(z!=null)this.hP(a,z.gDZ())},
-GU:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","guz",2,0,12,59],
+vD:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","guz",2,0,12,59],
 hP:function(a,b){var z,y,x,w,v,u,t,s,r,q
 try{w=a.CA
 v=H.VM([],[G.Y2])
@@ -4516,8 +4589,8 @@
 x=new H.oP(q,null)
 N.QM("").wF("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,99,100],
-LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,99,100],
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,101,102],
+ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,101,102],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
@@ -4528,48 +4601,48 @@
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.oP(u,null)
-N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,101,2,102,103],
+N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,103,2,104,105],
 static:{l0:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.RD.ZL(a)
-C.RD.XI(a)
+C.fe.ZL(a)
+C.fe.XI(a)
 return a}}},
 Dsd:{
 "^":"uL+Pi;",
 $isd3:true},
 nc:{
 "^":"TpZ:12;a",
-$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,104,"call"],
-$isEH:true}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,106,"call"],
+$isEH:true}}],["","",,Z,{
 "^":"",
 ak:{
-"^":"tuj;yB,nJ,mN,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"tuj;yB,nJ,mN,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gRu:function(a){return a.yB},
 sRu:function(a,b){a.yB=this.ct(a,C.XA,a.yB,b)},
 gWt:function(a){return a.nJ},
 sWt:function(a,b){a.nJ=this.ct(a,C.yB,a.nJ,b)},
 gCF:function(a){return a.mN},
 sCF:function(a,b){a.mN=this.ct(a,C.tg,a.mN,b)},
-vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,105,106],
-tl:[function(a,b){return a.yB.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gR1",2,0,107,108],
-S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,107,109],
+vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,107,108],
+tl:[function(a,b){return a.yB.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gR1",2,0,109,110],
+S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,109,111],
 SK:[function(a,b){a.nJ=this.ct(a,C.yB,a.nJ,null)
 a.mN=this.ct(a,C.tg,a.mN,null)
-J.cI(a.yB).YM(b)},"$1","gvC",2,0,19,98],
-j9:[function(a,b){J.eg(a.yB).YM(b)},"$1","gDX",2,0,19,98],
-static:{lW:function(a){var z,y
+J.cI(a.yB).YM(b)},"$1","gvC",2,0,19,100],
+Ur:[function(a,b){J.eg(a.yB).YM(b)},"$1","gDX",2,0,19,100],
+static:{zB:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -4580,20 +4653,20 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ob:{
-"^":"TpZ:110;a",
+"^":"TpZ:112;a",
 $1:[function(a){var z=this.a
-z.nJ=J.Q5(z,C.yB,z.nJ,a)},"$1",null,2,0,null,92,"call"],
+z.nJ=J.Q5(z,C.yB,z.nJ,a)},"$1",null,2,0,null,94,"call"],
 $isEH:true},
 SS:{
-"^":"TpZ:110;a",
+"^":"TpZ:112;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,92,"call"],
-$isEH:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
+z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,94,"call"],
+$isEH:true}}],["","",,O,{
 "^":"",
 VY:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gtT:function(a){return a.tY},
 aV:[function(a,b){Q.xI.prototype.aV.call(this,a,b)
 this.ct(a,C.i4,0,1)},"$1","gLe",2,0,12,59],
@@ -4603,16 +4676,16 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.tWO.ZL(a)
 C.tWO.XI(a)
-return a}}}}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+return a}}}}],["","",,F,{
 "^":"",
 Be:{
-"^":"Vct;Xx,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"Vct;Xx,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gtT:function(a){return a.Xx},
 stT:function(a,b){a.Xx=this.ct(a,C.i4,a.Xx,b)},
 Es:function(a){var z
@@ -4620,7 +4693,7 @@
 z=a.Xx
 if(z==null)return
 J.SK(z).ml(new F.P9())},
-SK:[function(a,b){J.cI(a.Xx).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.Xx).YM(b)},"$1","gvC",2,0,19,100],
 b0:function(a,b){var z,y,x
 z=J.Vs(b).MW.getAttribute("data-jump-target")
 if(z==="")return
@@ -4628,18 +4701,18 @@
 x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
 if(x==null)return
 return x},
-YI:[function(a,b,c,d){var z=this.b0(a,d)
+Gm:[function(a,b,c,d){var z=this.b0(a,d)
 if(z==null)return
-J.Uf(z).h(0,"highlight")},"$3","gff",6,0,111,2,102,103],
+J.Uf(z).h(0,"highlight")},"$3","gKJ",6,0,113,2,104,105],
 Lk:[function(a,b,c,d){var z=this.b0(a,d)
 if(z==null)return
-J.Uf(z).Rz(0,"highlight")},"$3","gAF",6,0,111,2,102,103],
+J.Uf(z).Rz(0,"highlight")},"$3","gAF",6,0,113,2,104,105],
 static:{fm:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -4650,12 +4723,12 @@
 "^":"uL+Pi;",
 $isd3:true},
 P9:{
-"^":"TpZ:112;",
+"^":"TpZ:114;",
 $1:[function(a){a.OF()},"$1",null,2,0,null,83,"call"],
-$isEH:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
+$isEH:true}}],["","",,R,{
 "^":"",
 JI:{
-"^":"SaM;tH,uo,nx,oM,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"SaM;tH,uo,nx,oM,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 goE:function(a){return a.tH},
 soE:function(a,b){a.tH=this.ct(a,C.mr,a.tH,b)},
 gv8:function(a){return a.uo},
@@ -4676,7 +4749,7 @@
 if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
 this.AV(a,a.tH!==!0,this.gN2(a))}else{z=a.tH
 a.tH=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,82,49,50,83],
-static:{oS:function(a){var z,y
+static:{U9:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -4685,7 +4758,7 @@
 a.nx=null
 a.oM=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -4694,15 +4767,15 @@
 return a}}},
 SaM:{
 "^":"xc+Pi;",
-$isd3:true}}],["dart._internal","dart:_internal",,H,{
+$isd3:true}}],["","",,H,{
 "^":"",
 bQ:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Oq(a,0)]);z.G();)b.$1(z.lo)},
-Ck:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Oq(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b.$1(z.lo)},
+CkK:function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
 return!1},
 n3:function(a,b,c){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Oq(a,0)]);z.G();)b=c.$2(b,z.lo)
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b=c.$2(b,z.lo)
 return b},
 Ap:function(a,b){var z,y,x,w,v
 z=[]
@@ -4729,7 +4802,7 @@
 y=J.x(d)
 if(!!y.$isWO){x=e
 w=d}else{w=y.eR(d,e).tt(0,!1)
-x=0}if(J.z8(J.ew(x,z),J.q8(w)))throw H.b(H.ar())
+x=0}if(J.xZ(J.ew(x,z),J.q8(w)))throw H.b(H.ar())
 H.tb(w,x,a,b,z)},
 IC:function(a,b,c){var z,y,x,w
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
@@ -4771,7 +4844,7 @@
 w9:function(a,b,c,d){var z,y,x,w,v
 for(z=b+1,y=J.U6(a);z<=c;++z){x=y.t(a,z)
 w=z
-while(!0){if(!(w>b&&J.z8(d.$2(y.t(a,w-1),x),0)))break
+while(!0){if(!(w>b&&J.xZ(d.$2(y.t(a,w-1),x),0)))break
 v=w-1
 y.u(a,w,y.t(a,v))
 w=v}y.u(a,w,x)}},
@@ -4788,23 +4861,23 @@
 q=t.t(a,w)
 p=t.t(a,u)
 o=t.t(a,x)
-if(J.z8(d.$2(s,r),0)){n=r
+if(J.xZ(d.$2(s,r),0)){n=r
 r=s
-s=n}if(J.z8(d.$2(p,o),0)){n=o
+s=n}if(J.xZ(d.$2(p,o),0)){n=o
 o=p
-p=n}if(J.z8(d.$2(s,q),0)){n=q
+p=n}if(J.xZ(d.$2(s,q),0)){n=q
 q=s
-s=n}if(J.z8(d.$2(r,q),0)){n=q
+s=n}if(J.xZ(d.$2(r,q),0)){n=q
 q=r
-r=n}if(J.z8(d.$2(s,p),0)){n=p
+r=n}if(J.xZ(d.$2(s,p),0)){n=p
 p=s
-s=n}if(J.z8(d.$2(q,p),0)){n=p
+s=n}if(J.xZ(d.$2(q,p),0)){n=p
 p=q
-q=n}if(J.z8(d.$2(r,o),0)){n=o
+q=n}if(J.xZ(d.$2(r,o),0)){n=o
 o=r
-r=n}if(J.z8(d.$2(r,q),0)){n=q
+r=n}if(J.xZ(d.$2(r,q),0)){n=q
 q=r
-r=n}if(J.z8(d.$2(p,o),0)){n=o
+r=n}if(J.xZ(d.$2(p,o),0)){n=o
 o=p
 p=n}t.u(a,y,s)
 t.u(a,w,q)
@@ -4833,7 +4906,7 @@
 l=g
 break}}}}e=!0}else{for(k=m;k<=l;++k){j=t.t(a,k)
 if(J.u6(d.$2(j,r),0)){if(k!==m){t.u(a,k,t.t(a,m))
-t.u(a,m,j)}++m}else if(J.z8(d.$2(j,p),0))for(;!0;)if(J.z8(d.$2(t.t(a,l),p),0)){--l
+t.u(a,m,j)}++m}else if(J.xZ(d.$2(j,p),0))for(;!0;)if(J.xZ(d.$2(t.t(a,l),p),0)){--l
 if(l<k)break
 continue}else{g=l-1
 if(J.u6(d.$2(t.t(a,l),r),0)){t.u(a,k,t.t(a,m))
@@ -4885,7 +4958,7 @@
 y=0
 for(;y<z;++y){if(J.xC(this.Zv(0,y),b))return!0
 if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
-ou:function(a,b){var z,y
+Vr:function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=0
@@ -4918,6 +4991,7 @@
 x=0
 for(;x<z;++x){y=c.$2(y,this.Zv(0,x))
 if(z!==this.gB(this))throw H.b(P.a4(this))}return y},
+eR:function(a,b){return H.c1(this,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(this,"aL",0)])
 C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
@@ -4945,12 +5019,12 @@
 gMa:function(){var z,y
 z=J.q8(this.l6)
 y=this.AN
-if(y==null||J.z8(y,z))return z
+if(y==null||J.xZ(y,z))return z
 return y},
 gjX:function(){var z,y
 z=J.q8(this.l6)
 y=this.SH
-if(J.z8(y,z))return z
+if(J.xZ(y,z))return z
 return y},
 gB:function(a){var z,y,x
 z=J.q8(this.l6)
@@ -5006,7 +5080,7 @@
 grZ:function(a){return this.mb(J.uY(this.l6))},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
-static:{K1:function(a,b,c,d){if(!!J.x(a).$isyN)return H.VM(new H.xy(a,b),[c,d])
+static:{fR:function(a,b,c,d){if(!!J.x(a).$isyN)return H.VM(new H.xy(a,b),[c,d])
 return H.VM(new H.i1(a,b),[c,d])}}},
 xy:{
 "^":"i1;l6,T6",
@@ -5059,6 +5133,36 @@
 z=J.mY(this.mb(y.gl()))
 this.e0=z}else return!1}this.lo=this.e0.gl()
 return!0}},
+AM:{
+"^":"mW;l6,FT",
+eR:function(a,b){if(b<0)throw H.b(P.N(b))
+return H.ke(this.l6,this.FT+b,H.u3(this,0))},
+gA:function(a){var z=this.l6
+z=new H.ig(z.gA(z),this.FT)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+return z},
+jb:function(a,b,c){if(this.FT<0)throw H.b(P.KP(this.FT))},
+static:{ke:function(a,b,c){var z
+if(!!a.$isyN){z=H.VM(new H.wB(a,b),[c])
+z.jb(a,b,c)
+return z}return H.wb(a,b,c)},wb:function(a,b,c){var z=H.VM(new H.AM(a,b),[c])
+z.jb(a,b,c)
+return z}}},
+wB:{
+"^":"AM;l6,FT",
+gB:function(a){var z,y
+z=this.l6
+y=J.Hn(z.gB(z),this.FT)
+if(J.J5(y,0))return y
+return 0},
+$isyN:true},
+ig:{
+"^":"Anv;OI,FT",
+G:function(){var z,y
+for(z=this.OI,y=0;y<this.FT;++y)z.G()
+this.FT=0
+return z.G()},
+gl:function(){return this.OI.gl()}},
 FuS:{
 "^":"a;",
 G:function(){return!1},
@@ -5074,7 +5178,7 @@
 Nk:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
 UZ:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
-Zl:{
+ReL:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
@@ -5097,7 +5201,7 @@
 $isQV:true,
 $asQV:null},
 w2Y:{
-"^":"ark+Zl;",
+"^":"ark+ReL;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
@@ -5122,15 +5226,21 @@
 bu:[function(a){return"Symbol(\""+H.d(this.fN)+"\")"},"$0","gAY",0,0,74],
 $istx:true,
 $isIN:true,
-static:{"^":"RWj,ES1,quP,KGP,eD,fbV"}}}],["dart._js_names","dart:_js_names",,H,{
+static:{"^":"RWj,ES1,quP,KGP,eD,fbV"}}}],["","",,H,{
 "^":"",
 kU:function(a){var z=H.VM(function(b,c){var y=[]
 for(var x in b){if(c.call(b,x))y.push(x)}return y}(a,Object.prototype.hasOwnProperty),[null])
 z.fixed$length=init
-return z}}],["dart.async","dart:async",,P,{
+return z}}],["","",,P,{
 "^":"",
-xg:function(){if(self.scheduleImmediate!=null)return P.vd()
-return P.K7()},
+xg:function(){var z,y,x
+z={}
+if(self.scheduleImmediate!=null)return P.vd()
+if(self.MutationObserver!=null&&self.document!=null){y=self.document.createElement("div")
+x=self.document.createElement("span")
+z.a=null
+new self.MutationObserver(H.tR(new P.th(z),1)).observe(y,{childList:true})
+return new P.ha(z,y,x)}return P.K7()},
 ZV:[function(a){++init.globalState.Xz.GL
 self.scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,18],
 Bz:[function(a){P.YF(C.ny,a)},"$1","K7",2,0,18],
@@ -5139,7 +5249,7 @@
 if(z)return b.O8(a)
 else return b.wY(a)},
 Iw:function(a,b){var z=P.Dt(b)
-P.rT(C.ny,new P.Vq(a,z))
+P.cH(C.ny,new P.w4(a,z))
 return z},
 Ne:function(a,b){var z,y,x,w,v
 z={}
@@ -5149,7 +5259,7 @@
 z.d=null
 z.e=null
 y=new P.mQ(z,b)
-for(x=H.VM(new H.a7(a,a.length,0,null),[H.Oq(a,0)]);x.G();)x.lo.Rx(new P.Tw(z,b,z.c++),y)
+for(x=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);x.G();)x.lo.Rx(new P.Tw(z,b,z.c++),y)
 y=z.c
 if(y===0)return P.Ab(C.dn,null)
 w=Array(y)
@@ -5185,10 +5295,10 @@
 y=v
 x=new H.oP(w,null)
 $.X3.hk(y,x)}},
-HC:[function(a){},"$1","C7",2,0,19,20],
+QEz:[function(a){},"$1","yy",2,0,19,20],
 SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","Xq",2,2,21,22,23,24],
 dL:[function(){},"$0","v3",0,0,17],
-zE:function(a,b,c){var z,y,x,w
+FE:function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.oP(x,null)
@@ -5200,7 +5310,7 @@
 Bb:function(a,b,c){var z=a.ed()
 if(!!J.x(z).$isb8)z.YM(new P.QX(b,c))
 else b.rX(c)},
-rT:function(a,b){var z
+cH:function(a,b){var z
 if(J.xC($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
@@ -5223,7 +5333,7 @@
 if(J.xC($.X3,c))return d.$1(e)
 z=P.Us(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","MM",10,0,31,26,27,28,30,32],
+return y}finally{$.X3=z}},"$5","J6",10,0,31,26,27,28,30,32],
 Mu:[function(a,b,c,d,e,f){var z,y
 if(J.xC($.X3,c))return d.$2(e,f)
 z=P.Us(c)
@@ -5243,7 +5353,7 @@
 $.k8=y}},"$4","G2",8,0,37,26,27,28,30],
 PB:[function(a,b,c,d,e){return P.YF(d,C.NU!==c?c.ce(e):e)},"$5","vRP",10,0,38,26,27,28,39,40],
 PD:[function(a,b,c,d,e){return P.dp(d,C.NU!==c?c.UG(e):e)},"$5","oo",10,0,41,26,27,28,39,40],
-JjS:[function(a,b,c,d){H.qw(H.d(d))},"$4","hI",8,0,42,26,27,28,43],
+JjS:[function(a,b,c,d){H.qw(H.d(d))},"$4","uy1",8,0,42,26,27,28,43],
 CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,44],
 E1:[function(a,b,c,d,e){var z,y
 $.oK=P.jt()
@@ -5254,6 +5364,23 @@
 z.FV(0,e)}y=new P.FQ(null,null,null,null,null,null,null,null,null,null,null,null,null,c,z)
 y.UE(c,d,z)
 return y},"$5","H2",10,0,45,26,27,28,46,47],
+th:{
+"^":"TpZ:12;a",
+$1:[function(a){var z,y
+H.cv()
+z=this.a
+y=z.a
+z.a=null
+y.$0()},"$1",null,2,0,null,13,"call"],
+$isEH:true},
+ha:{
+"^":"TpZ:115;a,b,c",
+$1:function(a){var z,y;++init.globalState.Xz.GL
+this.a.a=a
+z=this.b
+y=this.c
+z.firstChild?z.removeChild(y):z.appendChild(y)},
+$isEH:true},
 C6:{
 "^":"TpZ:74;a",
 $0:[function(){H.cv()
@@ -5287,6 +5414,9 @@
 static:{"^":"E2b,HCK,VCd"}},
 WVu:{
 "^":"a;iE@,SJ@",
+gvq:function(a){var z=new P.Ik(this)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+return z},
 gUF:function(){return!1},
 SL:function(){var z=this.yx
 if(z!=null)return z
@@ -5309,7 +5439,7 @@
 y=d?1:0
 x=new P.LR(null,null,null,this,null,null,null,z,y,null,null)
 x.$builtinTypeInfo=this.$builtinTypeInfo
-x.aA(a,b,c,d,H.Oq(this,0))
+x.aA(a,b,c,d,H.u3(this,0))
 x.SJ=x
 x.iE=x
 y=this.SJ
@@ -5329,9 +5459,9 @@
 q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"$1","gL0",2,0,function(){return H.IGs(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"WVu")},113],
+this.Iv(b)},"$1","gL0",2,0,function(){return H.IGs(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"WVu")},116],
 ld:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.ld(a,null)},"JT","$2","$1","gGj",2,2,114,22,23,24],
+this.pb(a,b)},function(a){return this.ld(a,null)},"JT","$2","$1","gGj",2,2,117,22,23,24],
 xO:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.yx
@@ -5385,12 +5515,12 @@
 "^":"TpZ;a,b",
 $1:function(a){a.Rg(0,this.b)},
 $isEH:true,
-$signature:function(){return H.IGs(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
+$signature:function(){return H.IGs(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"zW")}},
 OR:{
 "^":"TpZ;a,b,c",
 $1:function(a){a.oJ(this.b,this.c)},
 $isEH:true,
-$signature:function(){return H.IGs(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
+$signature:function(){return H.IGs(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"zW")}},
 Bg:{
 "^":"TpZ;a",
 $1:function(a){a.Qj()},
@@ -5410,7 +5540,7 @@
 b8:{
 "^":"a;",
 $isb8:true},
-Vq:{
+w4:{
 "^":"TpZ:74;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
@@ -5427,10 +5557,10 @@
 x=--z.c
 if(y!=null)if(x===0||this.b)z.a.w0(a,b)
 else{z.d=a
-z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,115,116,"call"],
+z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,118,119,"call"],
 $isEH:true},
 Tw:{
-"^":"TpZ:117;a,c,d",
+"^":"TpZ:120;a,c,d",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=--z.c
@@ -5442,22 +5572,22 @@
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,20,"call"],
 $isEH:true},
-A5:{
+A0:{
 "^":"a;",
-$isA5:true},
+$isA0:true},
 Pf0:{
 "^":"a;",
-$isA5:true},
+$isA0:true},
 Zf:{
 "^":"Pf0;MM",
 j3:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,118,22,20],
+z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,121,22,20],
 w0:[function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,114,22,23,24]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,117,22,23,24]},
 Gc:{
 "^":"a;Gv,Lj<,jk,BQ@,OY?,As?,qV?,o4?",
 gcg:function(){return this.Gv>=4},
@@ -5514,7 +5644,7 @@
 P.HZ(this,z)},
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Qp","$2","$1","gaq",2,2,21,22,23,24],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"u3","$2","$1","gaq",2,2,21,22,23,24],
 OH:function(a){var z
 if(a==null);else{z=J.x(a)
 if(!!z.$isb8){if(!!z.$isGc){z=a.Gv
@@ -5536,7 +5666,7 @@
 return z},Vu:function(a,b,c){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
 return z},k3:function(a,b){b.swG(!0)
-a.Rx(new P.U7(b),new P.vr(b))},A9:function(a,b){b.swG(!0)
+a.Rx(new P.U7(b),new P.VL(b))},A9:function(a,b){b.swG(!0)
 if(a.Gv>=4)P.HZ(a,b)
 else a.au(b)},yE:function(a,b){var z
 do{z=b.gBQ()
@@ -5594,8 +5724,8 @@
 "^":"TpZ:12;a",
 $1:[function(a){this.a.R8(a)},"$1",null,2,0,null,20,"call"],
 $isEH:true},
-vr:{
-"^":"TpZ:119;b",
+VL:{
+"^":"TpZ:122;b",
 $2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,22,23,24,"call"],
 $isEH:true},
 cX:{
@@ -5611,7 +5741,7 @@
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"TpZ:120;b,d,e,f",
+"^":"TpZ:123;b,d,e,f",
 $0:function(){var z,y,x,w
 try{this.b.c=this.f.FI(this.d.gO1(),this.e)
 return!0}catch(x){w=H.Ru(x)
@@ -5678,10 +5808,10 @@
 $isEH:true},
 jZ:{
 "^":"TpZ:12;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,121,"call"],
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,124,"call"],
 $isEH:true},
 FZ:{
-"^":"TpZ:119;a,mG",
+"^":"TpZ:122;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isGc){y=P.Dt(null)
@@ -5693,8 +5823,8 @@
 Ki:function(a){return this.FR.$0()}},
 wS:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"bp",ret:P.wS,args:[{func:"Pw",args:[a]}]}},this.$receiver,"wS")},122],
-lM:[function(a,b){return H.VM(new P.AE(b,this),[H.ip(this,"wS",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"xv",ret:P.wS,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},122],
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"bp",ret:P.wS,args:[{func:"Pw",args:[a]}]}},this.$receiver,"wS")},125],
+lM:[function(a,b){return H.VM(new P.AE(b,this),[H.ip(this,"wS",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"xv",ret:P.wS,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},125],
 tg:function(a,b){var z,y
 z={}
 y=P.Dt(P.a2)
@@ -5707,7 +5837,7 @@
 z.a=null
 z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gaq())
 return y},
-ou:function(a,b){var z,y
+Vr:function(a,b){var z,y
 z={}
 y=P.Dt(P.a2)
 z.a=null
@@ -5730,6 +5860,9 @@
 y=P.Dt([P.xu,H.ip(this,"wS",0)])
 this.KR(new P.oY(this,z),!0,new P.yZ(z,y),y.gaq())
 return y},
+eR:function(a,b){var z=H.VM(new P.pt(b,this),[null])
+z.U6(this,b,null)
+return z},
 grZ:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"wS",0))
@@ -5743,7 +5876,7 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.zE(new P.Oh(this.c,a),new P.jvH(z,y),P.TB(z.a,y))},"$1",null,2,0,null,123,"call"],
+P.FE(new P.Oh(this.c,a),new P.jvH(z,y),P.TB(z.a,y))},"$1",null,2,0,null,126,"call"],
 $isEH:true,
 $signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 Oh:{
@@ -5751,7 +5884,7 @@
 $0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
 jvH:{
-"^":"TpZ:124;a,UI",
+"^":"TpZ:127;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 tG:{
@@ -5760,7 +5893,7 @@
 $isEH:true},
 lz:{
 "^":"TpZ;a,b,c,d",
-$1:[function(a){P.zE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,123,"call"],
+$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,126,"call"],
 $isEH:true,
 $signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 Rl:{
@@ -5780,7 +5913,7 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.zE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,123,"call"],
+P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,126,"call"],
 $isEH:true,
 $signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 WN:{
@@ -5788,7 +5921,7 @@
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 XPB:{
-"^":"TpZ:124;a,UI",
+"^":"TpZ:127;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 Ia:{
@@ -5813,7 +5946,7 @@
 $isEH:true},
 oY:{
 "^":"TpZ;a,b",
-$1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,113,"call"],
+$1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,116,"call"],
 $isEH:true,
 $signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
 yZ:{
@@ -5866,7 +5999,7 @@
 this.Gv=(z+128|4)>>>0
 if(b!=null)b.YM(this.gDQ(this))
 if(z<128&&this.Ri!=null)this.Ri.IO()
-if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,22,126],
+if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,128,22,129],
 QE:[function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
@@ -5961,7 +6094,7 @@
 this.fm(0,b)
 this.Bd=z.Al(c==null?P.v3():c)},
 $isyX:true,
-static:{"^":"Xx,kMJ,nS,Ir9,nav,Dr,JAK,vo,Pj",T6:function(a,b,c,d,e){var z,y
+static:{"^":"Xx,kMJ,nS,Ir9,nav,lkp,JAK,vo,Pj",T6:function(a,b,c,d,e){var z,y
 z=$.X3
 y=d?1:0
 y=H.VM(new P.KA(null,null,null,z,y,null,null),[e])
@@ -5974,15 +6107,15 @@
 y=z.Gv
 if((y&8)!==0&&(y&16)===0)return
 z.Gv=(y|32)>>>0
-y=z.Lj
-if(!y.fC($.X3))$.X3.hk(this.b,this.c)
-else{x=z.o7
-w=H.G3()
-w=H.KT(w,[w,w]).BD(x)
-v=z.o7
-u=this.b
-if(w)y.z8(v,u,this.c)
-else y.m1(v,u)}z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
+y=z.o7
+x=H.G3()
+x=H.KT(x,[x,x]).BD(y)
+w=z.Lj
+v=this.b
+u=z.o7
+if(x)w.z8(u,v,this.c)
+else w.m1(u,v)
+z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
 qB:{
 "^":"TpZ:17;a",
@@ -5999,7 +6132,7 @@
 KR:function(a,b,c,d){return this.ht(a,d,c,!0===b)},
 yI:function(a){return this.KR(a,null,null,null)},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
-ht:function(a,b,c,d){return P.T6(a,b,c,d,H.Oq(this,0))}},
+ht:function(a,b,c,d){return P.T6(a,b,c,d,H.u3(this,0))}},
 ti:{
 "^":"a;aw@"},
 fZ:{
@@ -6054,7 +6187,7 @@
 this.Gv=(this.Gv|2)>>>0},
 fm:function(a,b){},
 Fv:[function(a,b){this.Gv+=4
-if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,22,126],
+if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,128,22,129],
 QE:[function(a){var z=this.Gv
 if(z>=4){z-=4
 this.Gv=z
@@ -6073,7 +6206,7 @@
 $0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"TpZ:127;a,b",
+"^":"TpZ:130;a,b",
 $2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
 QX:{
@@ -6111,8 +6244,8 @@
 tA:function(){var z=this.Ee
 if(z!=null){this.Ee=null
 z.ed()}return},
-vx:[function(a){this.KQ.kM(a,this)},"$1","gOa",2,0,function(){return H.IGs(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},113],
-xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,128,23,24],
+vx:[function(a){this.KQ.kM(a,this)},"$1","gOa",2,0,function(){return H.IGs(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},116],
+xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,131,23,24],
 TE:[function(){this.Qj()},"$0","gH1",0,0,17],
 Xa:function(a,b,c,d,e,f,g){var z,y
 z=this.gOa()
@@ -6122,10 +6255,10 @@
 $asyX:function(a,b){return[b]}},
 nO:{
 "^":"og;ZP,Sb",
-Dr:function(a){return this.ZP.$1(a)},
+wW:function(a){return this.ZP.$1(a)},
 kM:function(a,b){var z,y,x,w,v
 z=null
-try{z=this.Dr(a)}catch(w){v=H.Ru(w)
+try{z=this.wW(a)}catch(w){v=H.Ru(w)
 y=v
 x=new H.oP(w,null)
 b.oJ(y,x)
@@ -6151,28 +6284,36 @@
 y=w
 x=new H.oP(v,null)
 b.oJ(y,x)}}},
-Xa:{
+pt:{
+"^":"og;Em,Sb",
+kM:function(a,b){var z=this.Em
+if(z>0){this.Em=z-1
+return}b.Rg(0,a)},
+U6:function(a,b,c){if(b<0)throw H.b(P.u(b))},
+$asog:function(a){return[a,a]},
+$aswS:null},
+kWp:{
 "^":"a;"},
 fM:{
-"^":"a;M5,ig>"},
+"^":"a;JR,ig>"},
 n7:{
 "^":"a;"},
 yQ:{
-"^":"a;E2,hY,U1,jH,Ka,Xp,at,rb,Zq,NW,mp,xk",
+"^":"a;E2,hY,U1,eoY,Ka,Xp,at,rb,Zq,NW,JS,xk",
 hk:function(a,b){return this.E2.$2(a,b)},
 Gr:function(a){return this.hY.$1(a)},
 FI:function(a,b){return this.U1.$2(a,b)},
-mg:function(a,b,c){return this.jH.$3(a,b,c)},
+mg:function(a,b,c){return this.eoY.$3(a,b,c)},
 Al:function(a){return this.Ka.$1(a)},
 wY:function(a){return this.Xp.$1(a)},
 O8:function(a){return this.at.$1(a)},
 wr:function(a){return this.rb.$1(a)},
 RK:function(a,b){return this.rb.$2(a,b)},
 uN:function(a,b){return this.Zq.$2(a,b)},
-Ch:function(a,b){return this.mp.$1(b)},
-qp:function(a){return this.xk.$1$specification(a)},
+Ch:function(a,b){return this.JS.$1(b)},
+iT:function(a){return this.xk.$1$specification(a)},
 $isyQ:true},
-e4y:{
+AN:{
 "^":"a;"},
 dl:{
 "^":"a;"},
@@ -6180,20 +6321,20 @@
 "^":"a;Fu",
 RK:function(a,b){var z,y
 z=this.Fu.gwe()
-y=z.M5
+y=z.JR
 z.ig.$4(y,P.HM(y),a,b)}},
 m0:{
 "^":"a;",
 fC:function(a){return this.gF7()===a.gF7()},
 $ism0:true},
 FQ:{
-"^":"m0;rA<,X2<,n8<,z0<,MQ<,CK<,we<,PN<,WB<,TL<,Pf<,Zo<,l5,eT>,Se<",
+"^":"m0;rA<,X2<,n8<,z0<,MQ<,CK<,we<,PN<,WB<,TL<,DK<,Zo<,l5,eT>,Se<",
 gQc:function(){var z=this.l5
 if(z!=null)return z
 z=new P.Id(this)
 this.l5=z
 return z},
-gF7:function(){return this.Zo.M5},
+gF7:function(){return this.Zo.JR},
 bH:function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
@@ -6233,58 +6374,58 @@
 return w}return},
 hk:function(a,b){var z,y,x
 z=this.Zo
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$5(y,x,this,a,b)},
 uI:function(a,b){var z,y,x
-z=this.Pf
-y=z.M5
+z=this.DK
+y=z.JR
 x=P.HM(y)
 return z.ig.$5(y,x,this,a,b)},
-qp:function(a){return this.uI(a,null)},
+iT:function(a){return this.uI(a,null)},
 Gr:function(a){var z,y,x
 z=this.X2
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$4(y,x,this,a)},
 FI:function(a,b){var z,y,x
 z=this.rA
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$5(y,x,this,a,b)},
 mg:function(a,b,c){var z,y,x
 z=this.n8
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$6(y,x,this,a,b,c)},
 Al:function(a){var z,y,x
 z=this.z0
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$4(y,x,this,a)},
 wY:function(a){var z,y,x
 z=this.MQ
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$4(y,x,this,a)},
 O8:function(a){var z,y,x
 z=this.CK
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$4(y,x,this,a)},
 wr:function(a){var z,y,x
 z=this.we
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$4(y,x,this,a)},
 uN:function(a,b){var z,y,x
 z=this.PN
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$5(y,x,this,a,b)},
 Ch:function(a,b){var z,y,x
 z=this.TL
-y=z.M5
+y=z.JR
 x=P.HM(y)
 return z.ig.$4(y,x,this,b)},
 UE:function(a,b,c){var z
@@ -6300,7 +6441,7 @@
 this.PN=this.eT.gPN()
 this.WB=this.eT.gWB()
 this.TL=this.eT.gTL()
-this.Pf=this.eT.gPf()
+this.DK=this.eT.gDK()
 this.Zo=this.eT.gZo()}},
 OJ:{
 "^":"TpZ:74;a,b",
@@ -6348,10 +6489,10 @@
 gPN:function(){return C.Sq},
 gWB:function(){return C.NA},
 gTL:function(){return C.uo},
-gPf:function(){return C.mc},
+gDK:function(){return C.mc},
 gZo:function(){return C.Rt},
 geT:function(a){return},
-gSe:function(){return $.wb()},
+gSe:function(){return $.OL()},
 gQc:function(){var z=$.Sk
 if(z!=null)return z
 z=new P.Id(this)
@@ -6390,7 +6531,7 @@
 t:function(a,b){return},
 hk:function(a,b){return P.CK(null,null,this,a,b)},
 uI:function(a,b){return P.E1(null,null,this,a,b)},
-qp:function(a){return this.uI(a,null)},
+iT:function(a){return this.uI(a,null)},
 Gr:function(a){if($.X3===C.NU)return a.$0()
 return P.T8(null,null,this,a)},
 FI:function(a,b){if($.X3===C.NU)return a.$1(b)
@@ -6427,7 +6568,7 @@
 dM:{
 "^":"TpZ:79;c,d",
 $2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
-$isEH:true}}],["dart.collection","dart:collection",,P,{
+$isEH:true}}],["","",,P,{
 "^":"",
 EF:function(a,b,c){return H.B7(a,H.VM(new P.YB(0,null,null,null,null,null,0),[b,c]))},
 Fl:function(a,b){return H.VM(new P.YB(0,null,null,null,null,null,0),[a,b])},
@@ -6520,8 +6661,8 @@
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
-gvc:function(a){return H.VM(new P.fG(this),[H.Oq(this,0)])},
-gUQ:function(a){return H.K1(H.VM(new P.fG(this),[H.Oq(this,0)]),new P.oi(this),H.Oq(this,0),H.Oq(this,1))},
+gvc:function(a){return H.VM(new P.fG(this),[H.u3(this,0)])},
+gUQ:function(a){return H.fR(H.VM(new P.fG(this),[H.u3(this,0)]),new P.oi(this),H.u3(this,0),H.u3(this,1))},
 x4:function(a,b){var z,y
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
@@ -6623,7 +6764,7 @@
 return z}}},
 oi:{
 "^":"TpZ:12;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,129,"call"],
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,132,"call"],
 $isEH:true},
 DJ:{
 "^":"TpZ;a",
@@ -6696,8 +6837,8 @@
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
-gvc:function(a){return H.VM(new P.i5(this),[H.Oq(this,0)])},
-gUQ:function(a){return H.K1(H.VM(new P.i5(this),[H.Oq(this,0)]),new P.a1(this),H.Oq(this,0),H.Oq(this,1))},
+gvc:function(a){return H.VM(new P.i5(this),[H.u3(this,0)])},
+gUQ:function(a){return H.fR(H.VM(new P.i5(this),[H.u3(this,0)]),new P.a1(this),H.u3(this,0),H.u3(this,1))},
 x4:function(a,b){var z,y
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)return!1
@@ -6811,13 +6952,13 @@
 return z}}},
 a1:{
 "^":"TpZ:12;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,129,"call"],
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,132,"call"],
 $isEH:true},
 pk:{
 "^":"TpZ;a",
 $2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,77,20,"call"],
 $isEH:true,
-$signature:function(){return H.IGs(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
+$signature:function(){return H.IGs(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"YB")}},
 db:{
 "^":"a;kh>,cA@,DG@,zQ@"},
 i5:{
@@ -6850,7 +6991,7 @@
 this.zq=this.zq.gDG()
 return!0}}}},
 jg:{
-"^":"u3T;X5,vv,OX,OB,DM",
+"^":"u3T;X5,vv,OX,OB,CQ",
 Ys:function(){var z=new P.jg(0,null,null,null,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
@@ -6893,13 +7034,13 @@
 x=y}return this.jn(x,b)}else return this.NZ(0,b)},
 NZ:function(a,b){var z,y,x
 z=this.OB
-if(z==null){z=P.Ym()
+if(z==null){z=P.V5()
 this.OB=z}y=this.nm(b)
 x=z[y]
 if(x==null)z[y]=[b]
 else{if(this.aH(x,b)>=0)return!1
 x.push(b)}++this.X5
-this.DM=null
+this.CQ=null
 return!0},
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(0,z.gl())},
@@ -6912,16 +7053,16 @@
 y=z[this.nm(a)]
 x=this.aH(y,a)
 if(x<0)return!1;--this.X5
-this.DM=null
+this.CQ=null
 y.splice(x,1)
 return!0},
-V1:function(a){if(this.X5>0){this.DM=null
+V1:function(a){if(this.X5>0){this.CQ=null
 this.OB=null
 this.OX=null
 this.vv=null
 this.X5=0}},
 Zl:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.DM
+z=this.CQ
 if(z!=null)return z
 y=Array(this.X5)
 y.fixed$length=init
@@ -6937,14 +7078,14 @@
 v=w.length
 for(t=0;t<v;++t){q=r[w[t]]
 p=q.length
-for(o=0;o<p;++o){y[u]=q[o];++u}}}this.DM=y
+for(o=0;o<p;++o){y[u]=q[o];++u}}}this.CQ=y
 return y},
 jn:function(a,b){if(a[b]!=null)return!1
 a[b]=0;++this.X5
-this.DM=null
+this.CQ=null
 return!0},
 Nv:function(a,b){if(a!=null&&a[b]!=null){delete a[b];--this.X5
-this.DM=null
+this.CQ=null
 return!0}else return!1},
 nm:function(a){return J.v1(a)&0x3ffffff},
 aH:function(a,b){var z,y
@@ -6956,18 +7097,18 @@
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{Ym:function(){var z=Object.create(null)
+static:{V5:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
 return z}}},
 cN:{
-"^":"a;O2,DM,zi,fD",
+"^":"a;O2,CQ,zi,fD",
 gl:function(){return this.fD},
 G:function(){var z,y,x
-z=this.DM
+z=this.CQ
 y=this.zi
 x=this.O2
-if(z!==x.DM)throw H.b(P.a4(x))
+if(z!==x.CQ)throw H.b(P.a4(x))
 else if(y>=z.length){this.fD=null
 return!1}else{this.fD=z[y]
 this.zi=y+1
@@ -7126,9 +7267,9 @@
 return z}},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"Uy",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},30],
+ez:[function(a,b){return H.fR(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"Uy",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},30],
 ad:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"RS",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},30],
+lM:[function(a,b){return H.VM(new H.oA(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"Gba",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},30],
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
 return!1},
@@ -7138,13 +7279,12 @@
 z=this.gA(this)
 if(!z.G())return""
 y=P.p9("")
-if(b==="")do{x=H.d(z.gl())
-y.vM+=x}while(z.G())
-else{y.KF(H.d(z.gl()))
+if(b===""){do{x=H.d(z.gl())
+y.vM+=x}while(z.G())}else{y.KF(H.d(z.gl()))
 for(;z.G();){y.vM+=b
 x=H.d(z.gl())
 y.vM+=x}}return y.vM},
-ou:function(a,b){var z
+Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
 return!1},
 tt:function(a,b){return P.F(this,b,H.ip(this,"mW",0))},
@@ -7158,6 +7298,7 @@
 return y},
 gl0:function(a){return!this.gA(this).G()},
 gor:function(a){return this.gl0(this)!==!0},
+eR:function(a,b){return H.ke(this,b,H.ip(this,"mW",0))},
 grZ:function(a){var z,y
 z=this.gA(this)
 if(!z.G())throw H.b(H.DU())
@@ -7198,7 +7339,7 @@
 z=this.gB(a)
 for(y=0;y<this.gB(a);++y){if(J.xC(this.t(a,y),b))return!0
 if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
-ou:function(a,b){var z,y
+Vr:function(a,b){var z,y
 z=this.gB(a)
 for(y=0;y<z;++y){if(b.$1(this.t(a,y))===!0)return!0
 if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
@@ -7209,7 +7350,7 @@
 return z.vM},
 ad:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
 ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"fQO",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},30],
-lM:[function(a,b){return H.VM(new H.oA(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"Gba",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},30],
+lM:[function(a,b){return H.VM(new H.oA(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"PAJ",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},30],
 eR:function(a,b){return H.c1(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
@@ -7227,7 +7368,7 @@
 this.sB(a,z+1)
 this.u(a,z,b)},
 FV:function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Oq(b,0)]);z.G();){y=z.lo
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.G();){y=z.lo
 x=this.gB(a)
 this.sB(a,x+1)
 this.u(a,x,y)}},
@@ -7277,7 +7418,7 @@
 if(c>=this.gB(a))return-1
 for(z=c;z<this.gB(a);++z)if(J.xC(this.t(a,z),b))return z
 return-1},
-kJ:function(a,b){return this.XU(a,b,0)},
+Mw:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){var z
 c=this.gB(a)-1
 for(z=c;z>=0;--z)if(J.xC(this.t(a,z),b))return z
@@ -7307,6 +7448,37 @@
 $isyN:true,
 $isQV:true,
 $asQV:null},
+KPM:{
+"^":"a;",
+u:function(a,b,c){throw H.b(P.f("Cannot modify unmodifiable map"))},
+FV:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
+V1:function(a){throw H.b(P.f("Cannot modify unmodifiable map"))},
+Rz:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
+$isZ0:true,
+$asZ0:null},
+Pnf:{
+"^":"a;",
+t:function(a,b){return this.Fb.t(0,b)},
+u:function(a,b,c){this.Fb.u(0,b,c)},
+FV:function(a,b){this.Fb.FV(0,b)},
+V1:function(a){this.Fb.V1(0)},
+x4:function(a,b){return this.Fb.x4(0,b)},
+aN:function(a,b){this.Fb.aN(0,b)},
+gl0:function(a){return this.Fb.X5===0},
+gor:function(a){return this.Fb.X5!==0},
+gB:function(a){return this.Fb.X5},
+gvc:function(a){var z=this.Fb
+return H.VM(new P.i5(z),[H.u3(z,0)])},
+Rz:function(a,b){return this.Fb.Rz(0,b)},
+bu:[function(a){return P.vW(this.Fb)},"$0","gAY",0,0,71],
+gUQ:function(a){var z=this.Fb
+return z.gUQ(z)},
+$isZ0:true,
+$asZ0:null},
+A2:{
+"^":"Pnf+KPM;Fb",
+$isZ0:true,
+$asZ0:null},
 W0:{
 "^":"TpZ:79;a,b",
 $2:[function(a,b){var z=this.a
@@ -7315,7 +7487,7 @@
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,130,66,"call"],
+z.KF(b)},"$2",null,4,0,null,133,66,"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -7340,10 +7512,10 @@
 if(y<0||y>=x)return H.e(z,y)
 return z[y]},
 tt:function(a,b){var z,y
-if(b){z=H.VM([],[H.Oq(this,0)])
+if(b){z=H.VM([],[H.u3(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
-z=H.VM(y,[H.Oq(this,0)])}this.Ix(z)
+z=H.VM(y,[H.u3(this,0)])}this.Ix(z)
 return z},
 br:function(a){return this.tt(a,!0)},
 h:function(a,b){this.NZ(0,b)},
@@ -7357,7 +7529,7 @@
 if(typeof u!=="number")return H.s(u)
 w=Array(u)
 w.fixed$length=init
-t=H.VM(w,[H.Oq(this,0)])
+t=H.VM(w,[H.u3(this,0)])
 this.eZ=this.Ix(t)
 this.v5=t
 this.av=0
@@ -7437,7 +7609,7 @@
 M9:function(){var z,y,x,w
 z=Array(this.v5.length*2)
 z.fixed$length=init
-y=H.VM(z,[H.Oq(this,0)])
+y=H.VM(z,[H.u3(this,0)])
 z=this.v5
 x=this.av
 w=z.length-x
@@ -7493,41 +7665,41 @@
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(0,z.gl())},
 Ex:function(a){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Oq(a,0)]);z.G();)this.Rz(0,z.lo)},
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)this.Rz(0,z.lo)},
 Nk:function(a,b){var z,y,x
 z=[]
 for(y=this.gA(this);y.G();){x=y.gl()
 if(b.$1(x)===!0)z.push(x)}this.Ex(z)},
 tt:function(a,b){var z,y,x,w,v
-if(b){z=H.VM([],[H.Oq(this,0)])
+if(b){z=H.VM([],[H.u3(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
-z=H.VM(y,[H.Oq(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
+z=H.VM(y,[H.u3(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
 v=x+1
 if(x>=z.length)return H.e(z,x)
 z[x]=w}return z},
 br:function(a){return this.tt(a,!0)},
-ez:[function(a,b){return H.VM(new H.xy(this,b),[H.Oq(this,0),null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"xPo",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},30],
+ez:[function(a,b){return H.VM(new H.xy(this,b),[H.u3(this,0),null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"xPo",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},30],
 bu:[function(a){return P.WE(this,"{","}")},"$0","gAY",0,0,71],
 ad:function(a,b){var z=new H.U5(this,b)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.Oq(this,0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"PAJ",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},30],
+lM:[function(a,b){return H.VM(new H.oA(this,b),[H.u3(this,0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"Rdf",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},30],
 aN:function(a,b){var z
 for(z=this.gA(this);z.G();)b.$1(z.gl())},
 zV:function(a,b){var z,y,x
 z=this.gA(this)
 if(!z.G())return""
 y=P.p9("")
-if(b==="")do{x=H.d(z.gl())
-y.vM+=x}while(z.G())
-else{y.KF(H.d(z.gl()))
+if(b===""){do{x=H.d(z.gl())
+y.vM+=x}while(z.G())}else{y.KF(H.d(z.gl()))
 for(;z.G();){y.vM+=b
 x=H.d(z.gl())
 y.vM+=x}}return y.vM},
-ou:function(a,b){var z
+Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
 return!1},
+eR:function(a,b){return H.ke(this,b,H.u3(this,0))},
 grZ:function(a){var z,y
 z=this.gA(this)
 if(!z.G())throw H.b(H.DU())
@@ -7557,7 +7729,7 @@
 if(u.D(v,0)){u=z.Bb
 if(u==null)break
 v=this.yV(u.G3,a)
-if(J.z8(v,0)){t=z.Bb
+if(J.xZ(v,0)){t=z.Bb
 z.Bb=t.T8
 t.T8=z
 if(t.Bb==null){z=t
@@ -7628,7 +7800,7 @@
 gl0:function(a){return this.aY==null},
 gor:function(a){return this.aY!=null},
 aN:function(a,b){var z,y,x
-z=H.Oq(this,0)
+z=H.u3(this,0)
 y=H.VM(new P.HW(this,H.VM([],[P.oz]),this.qT,this.bb,null),[z])
 y.Qf(this,[P.oz,z])
 for(;y.G();){x=y.gl()
@@ -7638,7 +7810,7 @@
 V1:function(a){this.aY=null
 this.J0=0;++this.qT},
 x4:function(a,b){return this.Xy(b)===!0&&J.xC(this.vh(b),0)},
-gvc:function(a){return H.VM(new P.nF(this),[H.Oq(this,0)])},
+gvc:function(a){return H.VM(new P.nF(this),[H.u3(this,0)])},
 gUQ:function(a){var z=new P.ro(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
@@ -7660,7 +7832,7 @@
 "^":"TpZ;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
-$signature:function(){return H.IGs(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"Ba")}},
+$signature:function(){return H.IGs(function(a,b){return{func:"vPt",args:[a,b]}},this.a,"Ba")}},
 S6B:{
 "^":"a;",
 gl:function(){var z=this.ya
@@ -7692,7 +7864,7 @@
 z=this.lT
 y=new P.DN(z,H.VM([],[P.oz]),z.qT,z.bb,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qf(z,H.Oq(this,0))
+y.Qf(z,H.u3(this,0))
 return y},
 $isyN:true},
 ro:{
@@ -7703,7 +7875,7 @@
 z=this.Fb
 y=new P.ZM(z,H.VM([],[P.oz]),z.qT,z.bb,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qf(z,H.Oq(this,1))
+y.Qf(z,H.u3(this,1))
 return y},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
@@ -7718,7 +7890,7 @@
 HW:{
 "^":"S6B;lT,Jt,qT,bb,ya",
 Wb:function(a){return a},
-$asS6B:function(a){return[[P.oz,a]]}}}],["dart.convert","dart:convert",,P,{
+$asS6B:function(a){return[[P.oz,a]]}}}],["","",,P,{
 "^":"",
 VQ:function(a,b){return b.$2(null,new P.f1(b).$1(a))},
 KH:function(a){var z
@@ -7733,44 +7905,55 @@
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}if(b==null)return P.KH(z)
+throw H.b(P.cD(String(y),null,null))}if(b==null)return P.KH(z)
 else return P.VQ(z,b)},
 tp:[function(a){return a.Lt()},"$1","Jn",2,0,52,0],
 f1:{
 "^":"TpZ:12;a",
-$1:function(a){var z,y,x,w,v,u,t
+$1:function(a){var z,y,x,w,v,u
 if(a==null||typeof a!="object")return a
 if(Object.getPrototypeOf(a)===Array.prototype){for(z=this.a,y=0;y<a.length;++y)a[y]=z.$2(y,this.$1(a[y]))
 return a}z=Object.create(null)
 x=new P.r4(a,z,null)
 w=x.KN()
-for(v=J.U6(w),u=this.a,y=0;y<v.gB(w);++y){t=v.t(w,y)
-z[t]=u.$2(t,this.$1(a[t]))}x.rm=z
+for(v=this.a,y=0;y<w.length;++y){u=w[y]
+z[u]=v.$2(u,this.$1(a[u]))}x.rm=z
 return x},
 $isEH:true},
 r4:{
-"^":"a;rm,tk,zK",
+"^":"a;rm,cC,zK",
 t:function(a,b){var z,y
-z=this.tk
-if(z==null)return J.UQ(this.zK,b)
+z=this.cC
+if(z==null)return this.zK.t(0,b)
 else if(typeof b!=="string")return
 else{y=z[b]
 return typeof y=="undefined"?this.KH(b):y}},
-gB:function(a){return this.tk==null?J.q8(this.zK):J.q8(this.KN())},
-gl0:function(a){return(this.tk==null?J.q8(this.zK):J.q8(this.KN()))===0},
-gor:function(a){return(this.tk==null?J.q8(this.zK):J.q8(this.KN()))>0},
-gvc:function(a){if(this.tk==null)return J.iY(this.zK)
-return J.Ld(this.KN(),0)},
-gUQ:function(a){if(this.tk==null)return J.U8(this.zK)
-return H.K1(this.KN(),new P.FE(this),null,null)},
+gB:function(a){var z
+if(this.cC==null){z=this.zK
+z=z.gB(z)}else z=this.KN().length
+return z},
+gl0:function(a){var z
+if(this.cC==null){z=this.zK
+z=z.gB(z)}else z=this.KN().length
+return z===0},
+gor:function(a){var z
+if(this.cC==null){z=this.zK
+z=z.gB(z)}else z=this.KN().length
+return z>0},
+gvc:function(a){var z
+if(this.cC==null){z=this.zK
+return z.gvc(z)}return H.c1(this.KN(),0,null,null)},
+gUQ:function(a){var z
+if(this.cC==null){z=this.zK
+return z.gUQ(z)}return H.fR(this.KN(),new P.A5(this),null,null)},
 u:function(a,b,c){var z,y
-if(this.tk==null)J.kW(this.zK,b,c)
-else if(this.x4(0,b)){z=this.tk
+if(this.cC==null)this.zK.u(0,b,c)
+else if(this.x4(0,b)){z=this.cC
 z[b]=c
 y=this.rm
-if(y==null?z!=null:y!==z)y[b]=null}else J.kW(this.Ad(),b,c)},
+if(y==null?z!=null:y!==z)y[b]=null}else this.Ad().u(0,b,c)},
 FV:function(a,b){H.bQ(b,new P.E5(this))},
-x4:function(a,b){if(this.tk==null)return J.w4(this.zK,b)
+x4:function(a,b){if(this.cC==null)return this.zK.x4(0,b)
 if(typeof b!=="string")return!1
 return Object.prototype.hasOwnProperty.call(this.rm,b)},
 to:function(a,b,c){var z
@@ -7778,61 +7961,61 @@
 z=c.$0()
 this.u(0,b,z)
 return z},
-Rz:function(a,b){if(this.tk!=null&&!this.x4(0,b))return
-return J.V1(this.Ad(),b)},
+Rz:function(a,b){if(this.cC!=null&&!this.x4(0,b))return
+return this.Ad().Rz(0,b)},
 V1:function(a){var z
-if(this.tk==null)J.Z8(this.zK)
+if(this.cC==null)this.zK.V1(0)
 else{z=this.zK
 if(z!=null)J.Z8(z)
-this.tk=null
+this.cC=null
 this.rm=null
 this.zK=P.Fl(null,null)}},
-aN:function(a,b){var z,y,x,w,v
-if(this.tk==null)return J.Me(this.zK,b)
+aN:function(a,b){var z,y,x,w
+if(this.cC==null)return this.zK.aN(0,b)
 z=this.KN()
-for(y=J.U6(z),x=0;x<y.gB(z);++x){w=y.t(z,x)
-v=this.tk[w]
-if(typeof v=="undefined"){v=P.KH(this.rm[w])
-this.tk[w]=v}b.$2(w,v)
+for(y=0;y<z.length;++y){x=z[y]
+w=this.cC[x]
+if(typeof w=="undefined"){w=P.KH(this.rm[x])
+this.cC[x]=w}b.$2(x,w)
 if(z!==this.zK)throw H.b(P.a4(this))}},
 bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
 KN:function(){var z=this.zK
 if(z==null){z=Object.keys(this.rm)
 this.zK=z}return z},
 Ad:function(){var z,y,x,w,v
-if(this.tk==null)return this.zK
+if(this.cC==null)return this.zK
 z=P.Fl(null,null)
 y=this.KN()
-for(x=J.U6(y),w=0;w<x.gB(y);++w){v=x.t(y,w)
-z.u(0,v,this.t(0,v))}if(x.gl0(y))x.h(y,null)
-else x.V1(y)
-this.tk=null
+for(x=0;w=y.length,x<w;++x){v=y[x]
+z.u(0,v,this.t(0,v))}if(w===0)y.push(null)
+else C.Nm.sB(y,0)
+this.cC=null
 this.rm=null
 this.zK=z
 return z},
 KH:function(a){var z
 if(!Object.prototype.hasOwnProperty.call(this.rm,a))return
 z=P.KH(this.rm[a])
-return this.tk[a]=z},
+return this.cC[a]=z},
 $isFo:true,
 $asFo:function(){return[null,null]},
 $isZ0:true,
 $asZ0:function(){return[null,null]}},
-FE:{
+A5:{
 "^":"TpZ:12;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,129,"call"],
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,132,"call"],
 $isEH:true},
 E5:{
 "^":"TpZ:79;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
-Uk:{
+Ukr:{
 "^":"a;"},
 wIe:{
 "^":"a;"},
 Ziv:{
-"^":"Uk;",
-$asUk:function(){return[P.qU,[P.WO,P.KN]]}},
+"^":"Ukr;",
+$asUkr:function(){return[P.qU,[P.WO,P.KN]]}},
 AJ:{
 "^":"XS;Pc,FN",
 bu:[function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
@@ -7843,15 +8026,15 @@
 bu:[function(a){return"Cyclic error in JSON stringify"},"$0","gAY",0,0,71],
 static:{ko:function(a){return new P.K8(a,null)}}},
 byg:{
-"^":"Uk;qa<,ma",
-pW:function(a,b){return P.jc(a,this.gP1().qa)},
-kV:function(a){return this.pW(a,null)},
+"^":"Ukr;qa<,q4",
+cW:function(a,b){return P.jc(a,this.gP1().qa)},
+kV:function(a){return this.cW(a,null)},
 Q0:function(a,b){var z=this.gZE()
 return P.Vg(a,z.SI,z.UM)},
 KP:function(a){return this.Q0(a,null)},
 gZE:function(){return C.cb},
 gP1:function(){return C.A3},
-$asUk:function(){return[P.a,P.qU]}},
+$asUkr:function(){return[P.a,P.qU]}},
 ojF:{
 "^":"wIe;UM,SI",
 $aswIe:function(){return[P.a,P.qU]}},
@@ -7859,8 +8042,8 @@
 "^":"wIe;qa<",
 $aswIe:function(){return[P.qU,P.a]}},
 Sh:{
-"^":"a;ma,cP,ol",
-iY:function(a){return this.ma.$1(a)},
+"^":"a;q4,cP,ol",
+iY:function(a){return this.q4.$1(a)},
 Ip:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=z.gB(a)
@@ -7922,7 +8105,7 @@
 throw H.b(P.Gy(a,y))}}},
 Jc:function(a){var z,y,x,w
 z={}
-if(typeof a==="number"){if(!C.CD.gzr(a))return!1
+if(typeof a==="number"){if(!C.CD.gx8(a))return!1
 this.cP.KF(C.CD.bu(a))
 return!0}else if(a===!0){this.cP.KF("true")
 return!0}else if(a===!1){this.cP.KF("false")
@@ -7950,7 +8133,7 @@
 pg:function(a){var z=this.ol
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"Gsm,hyY,Ta6,Jyf,NoV,HVe,vk,BLm,KQz,Ho,mrt,NXu,CE,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
+static:{"^":"Gsm,hyY,Ta6,Jyf,NoV,HVe,vk,BLm,KQz,Ho,mrt,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
 b=P.Jn()
 z=P.p9("")
 P.xl(z,b,c).C7(a)
@@ -7982,40 +8165,40 @@
 y=H.VM(y,[P.KN])
 x=new P.Rw(0,0,y)
 if(x.rw(a,0,z.gB(a))!==z.gB(a))x.I7(z.j(a,J.Hn(z.gB(a),1)),0)
-return C.Nm.aM(y,0,x.L8)},
+return C.Nm.aM(y,0,x.mJ)},
 $aswIe:function(){return[P.qU,[P.WO,P.KN]]}},
 Rw:{
-"^":"a;So,L8,IT",
+"^":"a;So,mJ,IT",
 I7:function(a,b){var z,y,x,w,v
 z=this.IT
-y=this.L8
+y=this.mJ
 if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
 w=y+1
-this.L8=w
+this.mJ=w
 v=z.length
 if(y>=v)return H.e(z,y)
 z[y]=(240|x>>>18)>>>0
 y=w+1
-this.L8=y
+this.mJ=y
 if(w>=v)return H.e(z,w)
 z[w]=128|x>>>12&63
 w=y+1
-this.L8=w
+this.mJ=w
 if(y>=v)return H.e(z,y)
 z[y]=128|x>>>6&63
-this.L8=w+1
+this.mJ=w+1
 if(w>=v)return H.e(z,w)
 z[w]=128|x&63
 return!0}else{w=y+1
-this.L8=w
+this.mJ=w
 v=z.length
 if(y>=v)return H.e(z,y)
 z[y]=224|a>>>12
 y=w+1
-this.L8=y
+this.mJ=y
 if(w>=v)return H.e(z,w)
 z[w]=128|a>>>6&63
-this.L8=y+1
+this.mJ=y+1
 if(y>=v)return H.e(z,y)
 z[y]=128|a&63
 return!1}},
@@ -8027,29 +8210,29 @@
 x=J.rY(a)
 w=b
 for(;w<c;++w){v=x.j(a,w)
-if(v<=127){u=this.L8
+if(v<=127){u=this.mJ
 if(u>=y)break
-this.L8=u+1
-z[u]=v}else if((v&64512)===55296){if(this.L8+3>=y)break
+this.mJ=u+1
+z[u]=v}else if((v&64512)===55296){if(this.mJ+3>=y)break
 t=w+1
-if(this.I7(v,x.j(a,t)))w=t}else if(v<=2047){u=this.L8
+if(this.I7(v,x.j(a,t)))w=t}else if(v<=2047){u=this.mJ
 s=u+1
 if(s>=y)break
-this.L8=s
+this.mJ=s
 if(u>=y)return H.e(z,u)
 z[u]=192|v>>>6
-this.L8=s+1
-z[s]=128|v&63}else{u=this.L8
+this.mJ=s+1
+z[s]=128|v&63}else{u=this.mJ
 if(u+2>=y)break
 s=u+1
-this.L8=s
+this.mJ=s
 if(u>=y)return H.e(z,u)
 z[u]=224|v>>>12
 u=s+1
-this.L8=u
+this.mJ=u
 if(s>=y)return H.e(z,s)
 z[s]=128|v>>>6&63
-this.L8=u+1
+this.mJ=u+1
 if(u>=y)return H.e(z,u)
 z[u]=128|v&63}}return w},
 static:{"^":"Jf4"}},
@@ -8065,7 +8248,7 @@
 tz:{
 "^":"a;IW,ZB,AX,FU,kN,NY",
 xO:function(a){this.fZ()},
-fZ:function(){if(this.kN>0){if(this.IW!==!0)throw H.b(P.cD("Unfinished UTF-8 octet sequence"))
+fZ:function(){if(this.kN>0){if(this.IW!==!0)throw H.b(P.cD("Unfinished UTF-8 octet sequence",null,null))
 this.ZB.KF(H.mx(65533))
 this.FU=0
 this.kN=0
@@ -8083,7 +8266,7 @@
 $loop$0:for(u=this.ZB,t=this.IW!==!0,s=J.U6(a),r=b;!0;r=o){$multibyte$2:{if(x>0){do{if(r===c)break $loop$0
 q=s.t(a,r)
 p=J.Wx(q)
-if(p.i(q,192)!==128){if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16)))
+if(p.i(q,192)!==128){if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
 this.AX=!1
 p=H.mx(65533)
 u.vM+=p
@@ -8091,17 +8274,17 @@
 break $multibyte$2}else{y=(y<<6|p.i(q,63))>>>0;--x;++r}}while(x>0)
 p=w-1
 if(p<0||p>=4)return H.e(C.Gb,p)
-if(y<=C.Gb[p]){if(t)throw H.b(P.cD("Overlong encoding of 0x"+C.jn.WZ(y,16)))
+if(y<=C.Gb[p]){if(t)throw H.b(P.cD("Overlong encoding of 0x"+C.jn.WZ(y,16),null,null))
 y=65533
 x=0
-w=0}if(y>1114111){if(t)throw H.b(P.cD("Character outside valid Unicode range: 0x"+C.jn.WZ(y,16)))
+w=0}if(y>1114111){if(t)throw H.b(P.cD("Character outside valid Unicode range: 0x"+C.jn.WZ(y,16),null,null))
 y=65533}if(!this.AX||y!==65279){p=H.mx(y)
 u.vM+=p}this.AX=!1}}for(;r<c;r=o){o=r+1
 q=s.t(a,r)
 p=J.Wx(q)
 if(p.C(q,0)){n=z.a
 if(n>0){m=o-1
-v.$2(m-n,m)}if(t)throw H.b(P.cD("Negative UTF-8 code unit: -0x"+C.CD.WZ(p.J(q),16)))
+v.$2(m-n,m)}if(t)throw H.b(P.cD("Negative UTF-8 code unit: -0x"+C.CD.WZ(p.J(q),16),null,null))
 p=H.mx(65533)
 u.vM+=p}else if(p.E(q,127)){this.AX=!1;++z.a}else{n=z.a
 if(n>0){m=o-1
@@ -8114,7 +8297,7 @@
 continue $loop$0}if(p.i(q,248)===240&&p.C(q,245)){y=p.i(q,7)
 x=3
 w=3
-continue $loop$0}if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16)))
+continue $loop$0}if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
 this.AX=!1
 p=H.mx(65533)
 u.vM+=p
@@ -8127,15 +8310,15 @@
 this.NY=w}},
 static:{"^":"ADi"}},
 zC:{
-"^":"TpZ:131;a,b,c,d,e",
+"^":"TpZ:134;a,b,c,d,e",
 $2:function(a,b){var z,y,x
 z=a===0&&b===J.q8(this.c)
 y=this.b
 x=this.c
-if(z)y.ZB.KF(P.Qe(x))
-else y.ZB.KF(P.Qe(J.Fd(x,a,b)))
+if(z)y.ZB.KF(P.nB(x))
+else y.ZB.KF(P.nB(J.Fd(x,a,b)))
 this.a.a=0},
-$isEH:true}}],["dart.core","dart:core",,P,{
+$isEH:true}}],["","",,P,{
 "^":"",
 Te:function(a){return},
 Wc:[function(a,b){return J.FW(a,b)},"$2","n4",4,0,53,49,50],
@@ -8171,13 +8354,13 @@
 y=$.oK
 if(y==null)H.qw(z)
 else y.$1(z)},
-Qe:function(a){return H.LY(a.constructor!==Array?P.F(a,!0,null):a)},
+nB:function(a){return H.LY(a.constructor!==Array?P.F(a,!0,null):a)},
 Y25:{
 "^":"TpZ:79;a",
 $2:function(a,b){this.a.u(0,a.gfN(a),b)},
 $isEH:true},
 CL:{
-"^":"TpZ:132;a",
+"^":"TpZ:135;a",
 $2:function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
@@ -8212,7 +8395,7 @@
 EK:function(){H.o2(this)},
 RM:function(a,b){if(J.yH(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"bS,Vp,Eu,p2W,h2,KL,EQe,NXt,tp1,Gio,Fz,cR,E03,KeL,Cgd,NrX,LD,o4I,T3F,f8,yfk,fQ",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+static:{"^":"Oj2,Vp,Eu,p2W,h2,KL,EQe,NXt,tp1,Gio,zM3,cR,E03,KeL,Cgd,NrX,LD,o4I,T3F,f8,yfk,lme",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
 if(z!=null){y=new P.MF()
 x=z.QK
@@ -8246,7 +8429,7 @@
 if(typeof l!=="number")return H.s(l)
 s=J.Hn(s,n*l)}k=!0}else k=!1
 j=H.fu(w,v,u,t,s,r,q,k)
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},Wu:function(a,b){var z=new P.iP(a,b)
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD("Invalid date format",a,null))},Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
 return z},Gq:function(a){var z,y
 z=Math.abs(a)
@@ -8259,12 +8442,12 @@
 return"00"+a},h0:function(a){if(a>=10)return""+a
 return"0"+a}}},
 MF:{
-"^":"TpZ:133;",
+"^":"TpZ:136;",
 $1:function(a){if(a==null)return 0
 return H.BU(a,null,null)},
 $isEH:true},
 Rq:{
-"^":"TpZ:134;",
+"^":"TpZ:137;",
 $1:function(a){if(a==null)return 0
 return H.RR(a,null)},
 $isEH:true},
@@ -8369,7 +8552,7 @@
 if(z==null)return"Concurrent modification during iteration."
 return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"$0","gAY",0,0,71],
 static:{a4:function(a){return new P.UV(a)}}},
-qn:{
+k5C:{
 "^":"a;",
 bu:[function(a){return"Out of Memory"},"$0","gAY",0,0,71],
 gI4:function(){return},
@@ -8389,9 +8572,48 @@
 if(z==null)return"Exception"
 return"Exception: "+H.d(z)},"$0","gAY",0,0,71]},
 oe:{
-"^":"a;G1>",
-bu:[function(a){return"FormatException: "+H.d(this.G1)},"$0","gAY",0,0,71],
-static:{cD:function(a){return new P.oe(a)}}},
+"^":"a;G1>,FF,bM",
+bu:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+z=this.G1
+y=z!=null&&""!==z?"FormatException: "+H.d(z):"FormatException"
+x=this.bM
+w=this.FF
+if(typeof w!=="string")return x!=null?y+(" (at position "+H.d(x)+")"):y
+if(x!=null)if(!(x<0)){z=J.q8(w)
+if(typeof z!=="number")return H.s(z)
+z=x>z}else z=!0
+else z=!1
+if(z)x=null
+if(x==null){z=J.U6(w)
+if(J.xZ(z.gB(w),78))w=z.Nj(w,0,75)+"..."
+return y+"\n"+H.d(w)}for(z=J.U6(w),v=1,u=0,t=null,s=0;s<x;++s){r=z.j(w,s)
+if(r===10){if(u!==s||t!==!0)++v
+u=s+1
+t=!1}else if(r===13){++v
+u=s+1
+t=!0}}y=v>1?y+(" (at line "+v+", character "+(x-u+1)+")\n"):y+(" (at character "+(x+1)+")\n")
+q=z.gB(w)
+s=x
+while(!0){p=z.gB(w)
+if(typeof p!=="number")return H.s(p)
+if(!(s<p))break
+r=z.j(w,s)
+if(r===10||r===13){q=s
+break}++s}p=J.Wx(q)
+if(J.xZ(p.W(q,u),78))if(x-u<75){o=u+75
+n=u
+m=""
+l="..."}else{if(J.u6(p.W(q,x),75)){n=p.W(q,75)
+o=q
+l=""}else{n=x-36
+o=x+36
+l="..."}m="..."}else{o=q
+n=u
+m=""
+l=""}k=z.Nj(w,n,o)
+if(typeof n!=="number")return H.s(n)
+return y+m+k+l+"\n"+C.xB.U(" ",x-n+m.length)+"^\n"},"$0","gAY",0,0,71],
+static:{cD:function(a,b,c){return new P.oe(a,b,c)}}},
 eV:{
 "^":"a;",
 bu:[function(a){return"IntegerDivisionByZeroException"},"$0","gAY",0,0,71],
@@ -8400,11 +8622,11 @@
 "^":"a;oc>",
 bu:[function(a){return"Expando:"+H.d(this.oc)},"$0","gAY",0,0,71],
 t:function(a,b){var z=H.of(b,"expando$values")
-return z==null?null:H.of(z,this.J4())},
+return z==null?null:H.of(z,this.YV())},
 u:function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
-H.wV(b,"expando$values",z)}H.wV(z,this.J4(),c)},
-J4:function(){var z,y
+H.wV(b,"expando$values",z)}H.wV(z,this.YV(),c)},
+YV:function(){var z,y
 z=H.of(this,"expando$key")
 if(z==null){y=$.Km
 $.Km=y+1
@@ -8501,9 +8723,8 @@
 We:function(a,b){var z,y
 z=J.mY(a)
 if(!z.G())return
-if(b.length===0)do{y=z.gl()
-this.vM+=typeof y==="string"?y:H.d(y)}while(z.G())
-else{this.KF(z.gl())
+if(b.length===0){do{y=z.gl()
+this.vM+=typeof y==="string"?y:H.d(y)}while(z.G())}else{this.KF(z.gl())
 for(;z.G();){this.vM+=b
 y=z.gl()
 this.vM+=typeof y==="string"?y:H.d(y)}}},
@@ -8521,7 +8742,7 @@
 "^":"a;",
 $isuq:true},
 q5:{
-"^":"a;Bo,IE,pO,Fi,ux,Ev,bM,hO,lH",
+"^":"a;Bo,IE,pO,Fi,ux,Ev,D6,hO,lH",
 gJf:function(a){var z=this.Bo
 if(z==null)return""
 if(J.rY(z).nC(z,"["))return C.xB.Nj(z,1,z.length-1)
@@ -8533,11 +8754,11 @@
 yM:function(a,b){if(a==="")return"/"+b
 return C.xB.Nj(a,0,C.xB.cn(a,"/")+1)+b},
 K2:function(a){if(a.length>0&&C.xB.j(a,0)===58)return!0
-return C.xB.kJ(a,"/.")!==-1},
+return C.xB.Mw(a,"/.")!==-1},
 KO:function(a){var z,y,x,w,v
 if(!this.K2(a))return a
 z=[]
-for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]),x=!1;y.G();){w=y.lo
+for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!1;y.G();){w=y.lo
 if(J.xC(w,"..")){v=z.length
 if(v!==0)if(v===1){if(0>=v)return H.e(z,0)
 v=!J.xC(z[0],"")}else v=!0
@@ -8562,7 +8783,7 @@
 z.KF(y)}}z.KF(this.pO)
 y=this.Ev
 if(y!=null){z.KF("?")
-z.KF(y)}y=this.bM
+z.KF(y)}y=this.D6
 if(y!=null){z.KF("#")
 z.KF(y)}return z.vM},"$0","gAY",0,0,71],
 n:function(a,b){var z,y,x,w
@@ -8578,9 +8799,9 @@
 x=b.Ev
 w=x==null
 if(!y===!w){if(y)z=""
-if(z==null?(w?"":x)==null:z===(w?"":x)){z=this.bM
+if(z==null?(w?"":x)==null:z===(w?"":x)){z=this.D6
 y=z==null
-x=b.bM
+x=b.D6
 w=x==null
 if(!y===!w){if(y)z=""
 z=z==null?(w?"":x)==null:z===(w?"":x)}else z=!1}else z=!1}else z=!1}else z=!1
@@ -8594,10 +8815,10 @@
 x=this.gtp(this)
 w=this.Ev
 if(w==null)w=""
-v=this.bM
+v=this.D6
 return z.$2(this.Fi,z.$2(this.ux,z.$2(y,z.$2(x,z.$2(this.pO,z.$2(w,z.$2(v==null?"":v,1)))))))},
 $isq5:true,
-static:{"^":"QqF,q7,tvi,uCX,wm7,ilf,Imi,GpR,Q5W,XrJ,G9,pkL,lM,FsP,j3,dRC,u0I,TGN,Yk,Qxt,Vho,WTp,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,iTk,Uo,yw1,SQU,rvM,fbQ",bG:function(a){if(a==="http")return 80
+static:{"^":"QqF,q7,tvi,uCX,wm7,ilf,Imi,GpR,Q5W,XrJ,G9,pkL,lM,FsP,qfW,dRC,u0I,TGN,OP,Qxt,Vho,WTp,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,iTk,Uo,yw1,SQU,rvM,fbQ",bG:function(a){if(a==="http")return 80
 if(a==="https")return 443
 return 0},hK:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z={}
@@ -8651,27 +8872,16 @@
 n=P.o6(a,p+1,w)}}else{n=s===35?P.o6(a,z.e+1,w):null
 o=null}w=z.a
 s=z.b
-return new P.q5(z.c,z.d,q,w,s,o,n,null,null)},iV:function(a,b,c){var z,y,x,w,v
-z=a.length
-if(b===z)c+=" at end of input."
-else{c+=" at position "+b+".\n"
-if(z>78){y=b-10
-if(y<0)y=0
-x=y+72
-if(x>z){y=z-72
-x=z}w=y!==0?"...":""
-v=x!==z?"...":""}else{y=0
-w=""
-v=""}c=c+w+J.Nj(a,y,z)+v+"\n"+C.xB.U(" ",w.length+b-y)+"^"}throw H.b(P.cD(c))},JF:function(a,b){if(a!=null&&a===P.bG(b))return
+return new P.q5(z.c,z.d,q,w,s,o,n,null,null)},iV:function(a,b,c){throw H.b(P.cD(c,a,b))},JF:function(a,b){if(a!=null&&a===P.bG(b))return
 return a},L7:function(a,b,c,d){var z,y
 if(a==null)return
 if(b===c)return""
 if(C.xB.j(a,b)===91){z=c-1
 if(C.xB.j(a,z)!==93)P.iV(a,b,"Missing end `]` to match `[` in host")
-P.Uw(a,b+1,z)
+P.RD(a,b+1,z)
 return C.xB.Nj(a,b,c).toLowerCase()}if(!d)for(z=a.length,y=b;y<c;++y){if(y<0)H.vh(P.N(y))
 if(y>=z)H.vh(P.N(y))
-if(a.charCodeAt(y)===58){P.Uw(a,b,c)
+if(a.charCodeAt(y)===58){P.RD(a,b,c)
 return"["+a+"]"}}return P.WU(a,b,c)},WU:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 for(z=b,y=z,x=null,w=!0;z<c;){a.toString
 if(z<0)H.vh(P.N(z))
@@ -8737,7 +8947,7 @@
 if(!s)P.iV(a,u,"Illegal scheme character")
 if(w&&v)x=!1}a=J.Nj(a,0,b)
 return!x?a.toLowerCase():a},ua:function(a,b,c){if(a==null)return""
-return P.Xc(a,b,c,C.to)},qd:function(a,b,c,d,e){var z,y
+return P.Xc(a,b,c,C.MM)},qd:function(a,b,c,d,e){var z,y
 z=a==null
 if(z&&!0)return""
 z=!z
@@ -8837,9 +9047,9 @@
 z=new P.JV()
 y=a.split(".")
 if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.Nw(z)),[null,null]).br(0)},Uw:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+return H.VM(new H.A8(y,new P.to(z)),[null,null]).br(0)},RD:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 if(c==null)c=J.q8(a)
-z=new P.x8()
+z=new P.x8(a)
 y=new P.JT(a,z)
 if(J.q8(a)<2)z.$1("address is too short")
 x=[]
@@ -8860,14 +9070,14 @@
 s.toString
 if(u<0)H.vh(P.N(u))
 if(u>=J.q8(s))H.vh(P.N(u))
-if(s.charCodeAt(u)!==58)z.$1("invalid start colon.")
-w=u}if(u===w){if(t)z.$1("only one wildcard `::` is allowed")
+if(s.charCodeAt(u)!==58)z.$2("invalid start colon.",u)
+w=u}if(u===w){if(t)z.$2("only one wildcard `::` is allowed",u)
 J.bi(x,-1)
 t=!0}else J.bi(x,y.$2(w,u))
 w=u+1}++u}if(J.q8(x)===0)z.$1("too few parts")
 q=J.xC(w,c)
 p=J.xC(J.uY(x),-1)
-if(q&&!p)z.$1("expected a part after last `:`")
+if(q&&!p)z.$2("expected a part after last `:`",c)
 if(!q)try{J.bi(x,y.$2(w,c))}catch(o){H.Ru(o)
 try{v=P.Dy(J.Nj(a,w,c))
 s=J.lf(J.UQ(v,0),8)
@@ -8878,7 +9088,7 @@
 s=J.UQ(v,3)
 if(typeof s!=="number")return H.s(s)
 J.bi(x,(r|s)>>>0)}catch(o){H.Ru(o)
-z.$1("invalid end of IPv6 address.")}}if(t){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
+z.$2("invalid end of IPv6 address.",w)}}if(t){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
 n=Array(16)
 n.$builtinTypeInfo=[P.KN]
 u=0
@@ -8944,7 +9154,7 @@
 else u.push(v);++x}}t=b.IW
 return new P.GY(t).WJ(u)}}},
 hP2:{
-"^":"TpZ:135;",
+"^":"TpZ:138;",
 $1:function(a){a.C(0,128)
 return!1},
 $isEH:true},
@@ -8998,14 +9208,14 @@
 z.KF(P.jW(C.B2,b,C.xM,!0))},
 $isEH:true},
 Wf:{
-"^":"TpZ:136;",
+"^":"TpZ:139;",
 $2:function(a,b){return b*31+J.v1(a)&1073741823},
 $isEH:true},
 qz:{
 "^":"TpZ:79;a",
 $2:function(a,b){var z,y,x,w
 z=J.U6(b)
-y=z.kJ(b,"=")
+y=z.Mw(b,"=")
 if(y===-1){if(!z.n(b,""))J.kW(a,P.pE(b,this.a,!0),"")}else if(y!==0){x=z.Nj(b,0,y)
 w=z.yn(b,y+1)
 z=this.a
@@ -9013,27 +9223,28 @@
 $isEH:true},
 JV:{
 "^":"TpZ:44;",
-$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},
+$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a,null,null))},
 $isEH:true},
-Nw:{
+to:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,137,"call"],
+return z},"$1",null,2,0,null,140,"call"],
 $isEH:true},
 x8:{
-"^":"TpZ:44;",
-$1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
+"^":"TpZ:141;a",
+$2:function(a,b){throw H.b(P.cD("Illegal IPv6 address, "+a,this.a,b))},
+$1:function(a){return this.$2(a,null)},
 $isEH:true},
 JT:{
-"^":"TpZ:96;a,b",
+"^":"TpZ:98;b,c",
 $2:function(a,b){var z,y
-if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
-z=H.BU(J.Nj(this.a,a,b),16,null)
+if(b-a>4)this.c.$2("an IPv6 part can only contain a maximum of 4 hex digits",a)
+z=H.BU(J.Nj(this.b,a,b),16,null)
 y=J.Wx(z)
-if(y.C(z,0)||y.D(z,65535))this.b.$1("each part must be in the range of `0x0..0xFFFF`")
+if(y.C(z,0)||y.D(z,65535))this.c.$2("each part must be in the range of `0x0..0xFFFF`",a)
 return z},
 $isEH:true},
 rI:{
@@ -9041,9 +9252,9 @@
 $2:function(a,b){var z=J.Wx(a)
 b.KF(H.mx(C.xB.j("0123456789ABCDEF",z.m(a,4))))
 b.KF(H.mx(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
-$isEH:true}}],["dart.dom.html","dart:html",,W,{
+$isEH:true}}],["","",,W,{
 "^":"",
-Q8:function(a,b,c,d){var z,y,x
+H9:function(a,b,c,d){var z,y,x
 z=document.createEvent("CustomEvent")
 J.QD(z,d)
 if(!J.x(d).$isWO)if(!J.x(d).$isZ0){y=d
@@ -9062,9 +9273,9 @@
 x=new XMLHttpRequest()
 C.W3.eo(x,"GET",a,!0)
 z=H.VM(new W.RO(x,C.LF.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(new W.bU(y,x)),z.Sg),[H.Oq(z,0)]).Zz()
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new W.bU(y,x)),z.Sg),[H.u3(z,0)]).Zz()
 z=H.VM(new W.RO(x,C.JN.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Oq(z,0)]).Zz()
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(y.gYJ()),z.Sg),[H.u3(z,0)]).Zz()
 x.send()
 return y.MM},
 ED:function(a){var z,y
@@ -9094,16 +9305,16 @@
 Pd:function(a){if(!!J.x(a).$isYN)return a
 return P.o7(a,!0)},
 v8:function(a,b){return new W.zZ(a,b)},
-w6:[function(a){return J.N1(a)},"$1","l9",2,0,12,56],
+z9:[function(a){return J.N1(a)},"$1","b4",2,0,12,56],
 Hx:[function(a){return J.qq(a)},"$1","Z6",2,0,12,56],
-Hw:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","SN",8,0,57,56,58,59,60],
+Hw:[function(a,b,c,d){return J.L1(a,b,c,d)},"$4","SN",8,0,57,56,58,59,60],
 Ct:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
 z=J.Xr(d)
 if(z==null)throw H.b(P.u(d))
 y=z.prototype
 x=J.KE(d,"created")
 if(x==null)throw H.b(P.u(H.d(d)+" has no constructor called 'created'"))
-J.aN(W.r3("article",null))
+J.Dx(W.r3("article",null))
 w=z.$nativeSuperclassTag
 if(w==null)throw H.b(P.u(d))
 v=e==null
@@ -9111,7 +9322,7 @@
 u=a[w]
 t={}
 t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.v8(x,y),1))}
-t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.l9(),1))}
+t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.b4(),1))}
 t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.Z6(),1))}
 t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.SN(),4))}
 s=Object.create(u.prototype,t)
@@ -9127,7 +9338,7 @@
 return $.X3.cl(a,!0)},
 Bo:{
 "^":"h4;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;re|TR0|xc|LPc|hV|Xfs|uL|tu|G6|Vfx|xI|eW|Dsd|eo|tuj|ak|VY|Vct|Be|SaM|JI|D13|ZP|WZq|nJ|KAf|Eg|i7|pva|Gk|cda|J3|waa|MJ|T53|DK|V9|BS|V10|Vb|V11|Ly|pR|V12|hx|V13|L4|Mb|V14|mO|DE|V15|U1|V16|H8|WS|qh|V17|oF|V18|Q6|uE|V19|Zn|V20|n5|V21|Ma|wN|V22|ds|V23|qM|ZzR|av|V24|uz|V25|kK|oa|V26|St|V27|IW|V28|Qh|V29|Oz|V30|Z4|V31|qk|V32|vj|LU|V33|CX|V34|md|V35|Bm|V36|Ya|V37|Ww|ye|V38|G1|V39|fl|V40|UK|V41|wM|V42|NK|V43|Zx|V44|F1|V45|ov|oEY|kn|V46|fI|V47|zM|V48|Rk|V49|Ti|ImK|CY|V50|nm|V51|uw|V52|Pa|V53|D2|I5|V54|el"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;re|TR0|xc|LPc|hV|Xfs|uL|tu|G6|Vfx|xI|eW|Dsd|eo|tuj|ak|VY|Vct|Be|SaM|JI|D13|ZP|WZq|nJ|KAf|Eg|i7|pva|Gk|cda|J3|waa|MJ|T53|DK|V4|BS|V9|Vb|V10|Ly|pR|V11|hx|V12|L4|Mb|V13|mO|DE|V14|U1|V15|H8|WS|qh|V16|oF|V17|Q6|uE|V18|Zn|V19|n5|V20|Ma|wN|V21|ds|V22|qM|ZzR|av|V23|uz|V24|kK|oa|V25|St|V26|IW|V27|Qh|V28|Oz|V29|Z4|V30|qk|V31|vj|LU|V32|CX|V33|md|V34|Bm|V35|Ya|V36|Ww|ye|V37|G1|V38|fl|V39|UK|V40|wM|V41|NK|V42|Zx|V43|F1|V44|ov|V45|vr|oEY|kn|V46|fI|V47|zM|V48|Rk|V49|Ti|ImK|CY|V50|nm|V51|uw|V52|Pa|V53|D2|I5|V54|el"},
 Yyn:{
 "^":"Gv;",
 $isWO:true,
@@ -9151,7 +9362,7 @@
 "^":"Gv;t5:type=",
 $isO4:true,
 "%":";Blob"},
-Fy:{
+QPB:{
 "^":"Bo;",
 $isPZ:true,
 "%":"HTMLBodyElement"},
@@ -9173,19 +9384,19 @@
 if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
 return}throw H.b(P.u("Incorrect number or type of arguments"))},
 "%":"CanvasRenderingContext2D"},
-nx:{
+JJ:{
 "^":"KV;Rn:data=,B:length=,Wq:nextElementSibling=",
 "%":"Comment;CharacterData"},
 BI:{
 "^":"ea;tT:code=",
 $isBI:true,
 "%":"CloseEvent"},
-di:{
+y4f:{
 "^":"w6O;Rn:data=",
 "%":"CompositionEvent"},
 Rb:{
 "^":"ea;M3:_dartDetail}",
-geyz:function(a){var z=a._dartDetail
+gey:function(a){var z=a._dartDetail
 if(z!=null)return z
 return P.o7(a.detail,!0)},
 dF:function(a,b,c,d,e){return a.initCustomEvent(b,c,d,e)},
@@ -9207,7 +9418,7 @@
 Wk:function(a,b){return a.querySelector(b)},
 gEr:function(a){return H.VM(new W.RO(a,C.U3.Ph,!1),[null])},
 gfs:function(a){return H.VM(new W.RO(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
+gQb:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 $isYN:true,
 "%":"XMLDocument;Document"},
@@ -9260,7 +9471,7 @@
 Wk:function(a,b){return a.querySelector(b)},
 gEr:function(a){return H.VM(new W.mw(a,C.U3.Ph,!1),[null])},
 gfs:function(a){return H.VM(new W.mw(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.mw(a,C.i3.Ph,!1),[null])},
+gQb:function(a){return H.VM(new W.mw(a,C.i3.Ph,!1),[null])},
 gVY:function(a){return H.VM(new W.mw(a,C.Whw.Ph,!1),[null])},
 gf0:function(a){return H.VM(new W.mw(a,C.Kq.Ph,!1),[null])},
 ZL:function(a){},
@@ -9279,11 +9490,11 @@
 gN:function(a){return W.qc(a.target)},
 e6:function(a){return a.preventDefault()},
 $isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event|InputEvent"},
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MediaKeyNeededEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;ClipboardEvent|Event|InputEvent"},
 PZ:{
 "^":"Gv;",
 gI:function(a){return new W.kd(a)},
-Yb:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
+On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
 H2:function(a,b){return a.dispatchEvent(b)},
 Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
 $isPZ:true,
@@ -9301,7 +9512,10 @@
 jH:{
 "^":"Bo;B:length=,oc:name%,N:target%",
 "%":"HTMLFormElement"},
-c4:{
+u9:{
+"^":"Bo;ih:color%",
+"%":"HTMLHRElement"},
+pl:{
 "^":"Gv;B:length=",
 "%":"History"},
 xnd:{
@@ -9330,14 +9544,14 @@
 smk:function(a,b){a.title=b},
 "%":"HTMLDocument"},
 fJ:{
-"^":"rk;il:responseText=,pf:status=",
+"^":"waV;il:responseText=,pf:status=",
 gbA:function(a){return W.Pd(a.response)},
-R3:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
+Yh:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
 eo:function(a,b,c,d){return a.open(b,c,d)},
 wR:function(a,b){return a.send(b)},
 $isfJ:true,
 "%":"XMLHttpRequest"},
-rk:{
+waV:{
 "^":"PZ;",
 "%":";XMLHttpRequestEventTarget"},
 tbE:{
@@ -9406,13 +9620,16 @@
 D80:{
 "^":"PZ;jO:id=,ph:label=",
 "%":"MediaStream"},
+VhH:{
+"^":"ea;vq:stream=",
+"%":"MediaStreamEvent"},
 Hy:{
 "^":"ea;",
 gRn:function(a){return P.o7(a.data,!0)},
 $isHy:true,
 "%":"MessageEvent"},
 EeC:{
-"^":"Bo;jb:content=,oc:name%",
+"^":"Bo;q1:content=,oc:name%",
 "%":"HTMLMetaElement"},
 QbE:{
 "^":"Bo;P:value%",
@@ -9426,7 +9643,7 @@
 "%":"MIDIMessageEvent"},
 bnE:{
 "^":"Imr;",
-EZ:function(a,b,c){return a.send(b,c)},
+FY:function(a,b,c){return a.send(b,c)},
 wR:function(a,b){return a.send(b)},
 "%":"MIDIOutput"},
 Imr:{
@@ -9445,7 +9662,7 @@
 return H.VM(new P.hL(J.Hh(y.x),J.Hh(y.y)),[null])}},
 $isAjY:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
-H9:{
+x76:{
 "^":"Gv;",
 je:function(a){return a.disconnect()},
 jh:function(a,b,c,d,e,f,g,h,i){var z,y
@@ -9469,8 +9686,8 @@
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
 KV:{
-"^":"PZ;PZ:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,By:parentNode=,a4:textContent%",
-gyT:function(a){return new W.wi(a)},
+"^":"PZ;lb:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,By:parentNode=,a4:textContent%",
+gUN:function(a){return new W.wi(a)},
 wg:function(a){var z=a.parentNode
 if(z!=null)z.removeChild(a)},
 Tk:function(a,b){var z,y
@@ -9517,7 +9734,7 @@
 G77:{
 "^":"Bo;Rn:data=,MB:form=,fg:height%,oc:name%,t5:type%,R:width}",
 "%":"HTMLObjectElement"},
-qW:{
+l9:{
 "^":"Bo;ph:label%",
 "%":"HTMLOptGroupElement"},
 Qlt:{
@@ -9534,11 +9751,11 @@
 "^":"ea;",
 $isf5:true,
 "%":"PopStateEvent"},
-MR:{
+j6:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"PositionError"},
-Qls:{
-"^":"nx;N:target=",
+qW:{
+"^":"JJ;N:target=",
 "%":"ProcessingInstruction"},
 KR:{
 "^":"Bo;P:value%",
@@ -9565,10 +9782,10 @@
 yNV:{
 "^":"Bo;t5:type%",
 "%":"HTMLSourceElement"},
-Hd:{
+zD9:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
-r5:{
+y0:{
 "^":"ea;Cf:results=",
 "%":"SpeechRecognitionEvent"},
 vKL:{
@@ -9626,12 +9843,12 @@
 "^":"Bo;",
 gvp:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
 "%":"HTMLTableSectionElement"},
-OH:{
-"^":"Bo;jb:content=",
-$isOH:true,
-"%":";HTMLTemplateElement;GLL|wc|q6"},
+fX:{
+"^":"Bo;q1:content=",
+$isfX:true,
+"%":";HTMLTemplateElement;GLL|k5d|q6"},
 bm:{
-"^":"nx;",
+"^":"JJ;",
 $isbm:true,
 "%":"CDATASection|Text"},
 HR:{
@@ -9660,7 +9877,7 @@
 wR:function(a,b){return a.send(b)},
 "%":"WebSocket"},
 K5:{
-"^":"PZ;jY:history=,oc:name%,pf:status%",
+"^":"PZ;bq:history=,oc:name%,pf:status%",
 oB:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
 pl:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return;(function(b){var z=['ms','moz','webkit','o']
 for(var y=0;y<z.length&&!b.requestAnimationFrame;++y){b.requestAnimationFrame=b[z[y]+'RequestAnimationFrame']
@@ -9669,12 +9886,12 @@
 b.cancelAnimationFrame=function(c){clearTimeout(c)}})(a)},
 geT:function(a){return W.Pv(a.parent)},
 xO:function(a){return a.close()},
-kr:function(a,b,c,d){a.postMessage(P.pf(b),c)
+xc:function(a,b,c,d){a.postMessage(P.pf(b),c)
 return},
-X6:function(a,b,c){return this.kr(a,b,c,null)},
+X6:function(a,b,c){return this.xc(a,b,c,null)},
 bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
 gEr:function(a){return H.VM(new W.RO(a,C.U3.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
+gQb:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
 $isK5:true,
 $isPZ:true,
 "%":"DOMWindow|Window"},
@@ -9770,17 +9987,17 @@
 h:function(a,b){this.MW.appendChild(b)
 return b},
 gA:function(a){var z=this.br(this)
-return H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)])},
+return H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Oq(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},
 GT:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
 Jd:function(a){return this.GT(a,null)},
-Nk:function(a,b){this.Jl(b,!1)},
-Jl:function(a,b){var z,y,x
+Nk:function(a,b){this.zU(b,!1)},
+zU:function(a,b){var z,y,x
 z=this.MW
 if(b){z=J.Mx(z)
 y=z.ad(z,new W.tN(a))}else{z=J.Mx(z)
-y=z.ad(z,a)}for(z=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.Oq(y,0)]),x=z.OI;z.G();)J.Mp(x.gl())},
+y=z.ad(z,a)}for(z=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.u3(y,0)]),x=z.OI;z.G();)J.Mp(x.gl())},
 YW:function(a,b,c,d,e){throw H.b(P.SY(null))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 Rz:function(a,b){var z
@@ -9824,7 +10041,7 @@
 grZ:function(a){return C.t5.grZ(this.Sn)},
 gDD:function(a){return W.or(this.Sc)},
 gEr:function(a){return H.VM(new W.Uc(this,!1,C.U3.Ph),[null])},
-gLm:function(a){return H.VM(new W.Uc(this,!1,C.i3.Ph),[null])},
+gQb:function(a){return H.VM(new W.Uc(this,!1,C.i3.Ph),[null])},
 S8:function(a,b){var z=C.t5.ad(this.Sn,new W.pN())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
 $isWO:true,
@@ -9842,16 +10059,16 @@
 QI:{
 "^":"Gv;"},
 kd:{
-"^":"a;of<",
-t:function(a,b){return H.VM(new W.RO(this.gof(),b,!1),[null])}},
+"^":"a;WK<",
+t:function(a,b){return H.VM(new W.RO(this.gWK(),b,!1),[null])}},
 DM:{
-"^":"kd;of:YO<,of",
+"^":"kd;WK:YO<,WK",
 t:function(a,b){var z,y
-z=$.nn()
+z=$.Cs()
 y=J.rY(b)
 if(z.gvc(z).tg(0,y.hc(b)))if(P.F7()===!0)return H.VM(new W.mw(this.YO,z.t(0,y.hc(b)),!1),[null])
 return H.VM(new W.mw(this.YO,b,!1),[null])},
-static:{"^":"fDX"}},
+static:{"^":"Ha"}},
 RAp:{
 "^":"Gv+lD;",
 $isWO:true,
@@ -9868,7 +10085,7 @@
 $asQV:function(){return[W.KV]}},
 Kx:{
 "^":"TpZ:12;",
-$1:[function(a){return J.lN(a)},"$1",null,2,0,null,138,"call"],
+$1:[function(a){return J.lN(a)},"$1",null,2,0,null,142,"call"],
 $isEH:true},
 bU2:{
 "^":"TpZ:79;a",
@@ -9897,7 +10114,7 @@
 return z},
 h:function(a,b){this.NL.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Oq(b,0)]),y=this.NL;z.G();)y.appendChild(z.lo)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.NL;z.G();)y.appendChild(z.lo)},
 xe:function(a,b,c){var z,y,x
 if(b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=this.NL
@@ -9910,7 +10127,7 @@
 z=this.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},
+J.r5(z,c,y[b])},
 Yj:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
 Rz:function(a,b){var z
 if(!J.x(b).$isKV)return!1
@@ -9918,12 +10135,12 @@
 if(z!==b.parentNode)return!1
 z.removeChild(b)
 return!0},
-Jl:function(a,b){var z,y,x
+zU:function(a,b){var z,y,x
 z=this.NL
 y=z.firstChild
 for(;y!=null;y=x){x=y.nextSibling
 if(J.xC(a.$1(y),b))z.removeChild(y)}},
-Nk:function(a,b){this.Jl(b,!0)},
+Nk:function(a,b){this.zU(b,!0)},
 V1:function(a){J.qv(this.NL)},
 u:function(a,b,c){var z,y
 z=this.NL
@@ -10003,9 +10220,9 @@
 "^":"a;",
 FV:function(a,b){J.Me(b,new W.JO(this))},
 V1:function(a){var z
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)this.Rz(0,z.lo)},
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)this.Rz(0,z.lo)},
 aN:function(a,b){var z,y
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){y=z.lo
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 b.$2(y,this.t(0,y))}},
 gvc:function(a){var z,y,x,w
 z=this.MW.attributes
@@ -10046,9 +10263,9 @@
 return z},
 p5:function(a){var z,y
 z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.N9,y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]);y.G();)J.Pw(y.lo,z)},
+for(y=this.N9,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();)J.Pw(y.lo,z)},
 OS:function(a){this.Kd.aN(0,new W.Jt(a))},
-Rz:function(a,b){return this.Q6(new W.ma(b))},
+Rz:function(a,b){return this.Q6(new W.FcD(b))},
 Q6:function(a){return this.Kd.es(0,!1,new W.hD(a))},
 yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.N9,!0,null),new W.Xw()),[null,null])},
 static:{or:function(a){var z=new W.hZ(a,null)
@@ -10066,7 +10283,7 @@
 "^":"TpZ:12;a",
 $1:function(a){return a.OS(this.a)},
 $isEH:true},
-ma:{
+FcD:{
 "^":"TpZ:12;a",
 $1:function(a){return J.V1(a,this.a)},
 $isEH:true},
@@ -10078,7 +10295,7 @@
 "^":"As3;MW",
 lF:function(){var z,y,x
 z=P.Ls(null,null,null,P.qU)
-for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]);y.G();){x=J.rr(y.lo)
+for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=J.rr(y.lo)
 if(x.length!==0)z.h(0,x)}return z},
 p5:function(a){P.F(a,!0,null)
 J.Pw(this.MW,a.zV(0," "))}},
@@ -10087,15 +10304,15 @@
 DT:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
 LX:function(a){return this.DT(a,!1)}},
 RO:{
-"^":"wS;DK,Ph,Sg",
-KR:function(a,b,c,d){var z=new W.Ov(0,this.DK,this.Ph,W.aF(a),this.Sg)
+"^":"wS;bi,Ph,Sg",
+KR:function(a,b,c,d){var z=new W.Ov(0,this.bi,this.Ph,W.aF(a),this.Sg)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.Zz()
 return z},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)}},
 mw:{
-"^":"RO;DK,Ph,Sg",
+"^":"RO;bi,Ph,Sg",
 WO:function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"wS",0)])
 return H.VM(new P.c9(new W.tS(b),z),[H.ip(z,"wS",0),null])},
 $iswS:true},
@@ -10119,7 +10336,7 @@
 v.$builtinTypeInfo=[null]
 z.h(0,v)}y=z.pY
 y.toString
-return H.VM(new P.Ik(y),[H.Oq(y,0)]).KR(a,b,c,d)},
+return H.VM(new P.Ik(y),[H.u3(y,0)]).KR(a,b,c,d)},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)},
 $iswS:true},
@@ -10133,24 +10350,27 @@
 return a},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Ov:{
-"^":"yX;VP,DK,Ph,u7,Sg",
-ed:function(){if(this.DK==null)return
+"^":"yX;VP,bi,Ph,u7,Sg",
+ed:function(){if(this.bi==null)return
 this.Ns()
-this.DK=null
+this.bi=null
 this.u7=null
 return},
-Fv:[function(a,b){if(this.DK==null)return;++this.VP
+Fv:[function(a,b){if(this.bi==null)return;++this.VP
 this.Ns()
-if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,22,126],
+if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,128,22,129],
 gUF:function(){return this.VP>0},
-QE:[function(a){if(this.DK==null||this.VP<=0)return;--this.VP
+QE:[function(a){if(this.bi==null||this.VP<=0)return;--this.VP
 this.Zz()},"$0","gDQ",0,0,17],
 Zz:function(){var z=this.u7
-if(z!=null&&this.VP<=0)J.V5(this.DK,this.Ph,z,this.Sg)},
+if(z!=null&&this.VP<=0)J.cZ(this.bi,this.Ph,z,this.Sg)},
 Ns:function(){var z=this.u7
-if(z!=null)J.GJ(this.DK,this.Ph,z,this.Sg)}},
+if(z!=null)J.GJ(this.bi,this.Ph,z,this.Sg)}},
 qO:{
 "^":"a;pY,uZ",
+gvq:function(a){var z=this.pY
+z.toString
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
 h:function(a,b){var z,y
 z=this.uZ
 if(z.x4(0,b))return
@@ -10159,7 +10379,7 @@
 Rz:function(a,b){var z=this.uZ.Rz(0,b)
 if(z!=null)z.ed()},
 xO:[function(a){var z,y
-for(z=this.uZ,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Oq(y,0),H.Oq(y,1)]);y.G();)y.lo.ed()
+for(z=this.uZ,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.u3(y,0),H.u3(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
 this.pY.xO(0)},"$0","gQF",0,0,17],
 xd:function(a){this.pY=P.bK(this.gQF(this),null,!0,a)}},
@@ -10203,8 +10423,8 @@
 sB:function(a,b){J.wg(this.xa,b)},
 GT:function(a,b){J.LH(this.xa,b)},
 Jd:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return J.DP(this.xa,b,c)},
-kJ:function(a,b){return this.XU(a,b,0)},
+XU:function(a,b,c){return J.G0(this.xa,b,c)},
+Mw:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){return J.ff(this.xa,b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
 xe:function(a,b,c){return J.Vk(this.xa,b,c)},
@@ -10235,13 +10455,13 @@
 $isEH:true},
 dW:{
 "^":"a;Ui",
-gjY:function(a){return W.zK(this.Ui.history)},
+gbq:function(a){return W.zK(this.Ui.history)},
 geT:function(a){return W.P1(this.Ui.parent)},
 xO:function(a){return this.Ui.close()},
-kr:function(a,b,c,d){this.Ui.postMessage(P.pf(b),c)},
-X6:function(a,b,c){return this.kr(a,b,c,null)},
+xc:function(a,b,c,d){this.Ui.postMessage(P.pf(b),c)},
+X6:function(a,b,c){return this.xc(a,b,c,null)},
 gI:function(a){return H.vh(P.f("You can only attach EventListeners to your own window."))},
-Yb:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
+On:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 Y9:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 $isPZ:true,
 static:{P1:function(a){if(a===window)return a
@@ -10249,12 +10469,12 @@
 VP:{
 "^":"a;IP",
 static:{zK:function(a){if(a===window.history)return a
-else return new W.VP(a)}}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+else return new W.VP(a)}}}}],["","",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
 $ishF:true,
-"%":"IDBKeyRange"}}],["dart.dom.svg","dart:svg",,P,{
+"%":"IDBKeyRange"}}],["","",,P,{
 "^":"",
 Y0Y:{
 "^":"tpr;N:target=,mH:href=",
@@ -10262,7 +10482,7 @@
 ZJQ:{
 "^":"Rc;mH:href=",
 "%":"SVGAltGlyphElement"},
-eG:{
+jwG:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEBlendElement"},
 lvr:{
@@ -10313,7 +10533,7 @@
 HX:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFETileElement"},
-Fu:{
+juM:{
 "^":"d5G;t5:type=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFETurbulenceElement"},
 OE5:{
@@ -10322,7 +10542,7 @@
 l6:{
 "^":"tpr;fg:height=,x=,y=",
 "%":"SVGForeignObjectElement"},
-en:{
+d0D:{
 "^":"tpr;",
 "%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
 tpr:{
@@ -10337,8 +10557,8 @@
 Gr5:{
 "^":"d5G;fg:height=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
-MU:{
-"^":"en;fg:height=,x=,y=",
+fQ:{
+"^":"d0D;fg:height=,x=,y=",
 "%":"SVGRectElement"},
 qIR:{
 "^":"d5G;t5:type%,mH:href=",
@@ -10354,7 +10574,7 @@
 gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
 gEr:function(a){return H.VM(new W.mw(a,C.U3.Ph,!1),[null])},
 gfs:function(a){return H.VM(new W.mw(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.mw(a,C.i3.Ph,!1),[null])},
+gQb:function(a){return H.VM(new W.mw(a,C.i3.Ph,!1),[null])},
 gVY:function(a){return H.VM(new W.mw(a,C.Whw.Ph,!1),[null])},
 gf0:function(a){return H.VM(new W.mw(a,C.Kq.Ph,!1),[null])},
 $isPZ:true,
@@ -10386,20 +10606,20 @@
 z=this.LO.getAttribute("class")
 y=P.Ls(null,null,null,P.qU)
 if(z==null)return y
-for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Oq(x,0)]);x.G();){w=J.rr(x.lo)
+for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=J.rr(x.lo)
 if(w.length!==0)y.h(0,w)}return y},
-p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{
+p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["","",,P,{
 "^":"",
 QmI:{
 "^":"Gv;tT:code=,G1:message=",
-"%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
+"%":"SQLError"}}],["","",,P,{
 "^":"",
 hq:{
 "^":"a;",
 $ishq:true,
-static:{N3:function(){return new H.kuS((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
+static:{N3:function(){return new H.kuS((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["","",,P,{
 "^":"",
-xZ:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
+z8:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
@@ -10407,7 +10627,7 @@
 Dm:function(a,b,c){var z
 if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
 return!0}catch(z){H.Ru(z)}return!1},
-Om:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
+Jk:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
 return},
 wY:[function(a){var z
 if(a==null)return
@@ -10418,7 +10638,7 @@
 else if(!!z.$isE4)return a.eh
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
 else return P.hE(a,"_$dart_jsObject",new P.Hp($.iW()))}},"$1","En",2,0,12,63],
-hE:function(a,b,c){var z=P.Om(a,b)
+hE:function(a,b,c){var z=P.Jk(a,b)
 if(z==null){z=c.$1(a)
 P.Dm(a,b,z)}return z},
 dU:[function(a){var z
@@ -10432,7 +10652,7 @@
 ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
 else return P.iQ(a,$.Iq(),new P.QS())},
-iQ:function(a,b,c){var z=P.Om(a,b)
+iQ:function(a,b,c){var z=P.Jk(a,b)
 if(z==null||!(a instanceof Object)){z=c.$1(a)
 P.Dm(a,b,z)}return z},
 E4:{
@@ -10486,7 +10706,7 @@
 return P.dU(this.eh.apply(z,y))},
 PO:function(a){return this.qP(a,null)},
 $isr7:true,
-static:{mt:function(a){return new P.r7(P.xZ(a,!0))}}},
+static:{mt:function(a){return new P.r7(P.z8(a,!0))}}},
 GD:{
 "^":"WkF;eh",
 t:function(a,b){var z
@@ -10531,7 +10751,7 @@
 $asQV:null},
 DV:{
 "^":"TpZ:12;",
-$1:function(a){var z=P.xZ(a,!1)
+$1:function(a){var z=P.z8(a,!1)
 P.Dm(z,$.Dp(),a)
 return z},
 $isEH:true},
@@ -10550,7 +10770,7 @@
 QS:{
 "^":"TpZ:12;",
 $1:function(a){return new P.E4(a)},
-$isEH:true}}],["dart.math","dart:math",,P,{
+$isEH:true}}],["","",,P,{
 "^":"",
 Zm:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
@@ -10582,7 +10802,7 @@
 return Math.random()*a>>>0}},
 kh:{
 "^":"a;Pd,Ak",
-X9:function(){var z,y,x,w,v,u
+xq:function(){var z,y,x,w,v,u
 z=this.Pd
 y=4294901760*z
 x=(y&4294967295)>>>0
@@ -10595,8 +10815,8 @@
 j1:function(a){var z,y,x
 if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 z=a-1
-if((a&z)===0){this.X9()
-return(this.Pd&z)>>>0}do{this.X9()
+if((a&z)===0){this.xq()
+return(this.Pd&z)>>>0}do{this.xq()
 y=this.Pd
 x=y%a}while(y-x+a>=4294967296)
 return x},
@@ -10630,10 +10850,10 @@
 this.Pd=(t^u)>>>0
 this.Ak=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
 if(this.Ak===0&&this.Pd===0)this.Pd=23063
-this.X9()
-this.X9()
-this.X9()
-this.X9()},
+this.xq()
+this.xq()
+this.xq()
+this.xq()},
 static:{"^":"tgM,PZi,JYU",Nh:function(a){var z=new P.kh(0,0)
 z.qR(a)
 return z}}},
@@ -10714,42 +10934,7 @@
 static:{T7:function(a,b,c,d,e){var z,y
 z=c<0?-c*0:c
 y=d<0?-d*0:d
-return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
-"^":"",
-qp:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
-A2:{
-"^":"mAS;Rp"},
-mAS:{
-"^":"Nx3+B8q;",
-$isZ0:true,
-$asZ0:null},
-B8q:{
-"^":"a;",
-u:function(a,b,c){return Q.qp()},
-FV:function(a,b){return Q.qp()},
-Rz:function(a,b){return Q.qp()},
-V1:function(a){return Q.qp()},
-$isZ0:true,
-$asZ0:null},
-Nx3:{
-"^":"a;",
-t:function(a,b){return this.Rp.t(0,b)},
-u:function(a,b,c){this.Rp.u(0,b,c)},
-FV:function(a,b){this.Rp.FV(0,b)},
-V1:function(a){this.Rp.V1(0)},
-x4:function(a,b){return this.Rp.x4(0,b)},
-aN:function(a,b){this.Rp.aN(0,b)},
-gl0:function(a){return this.Rp.X5===0},
-gor:function(a){return this.Rp.X5!==0},
-gvc:function(a){var z=this.Rp
-return H.VM(new P.i5(z),[H.Oq(z,0)])},
-gB:function(a){return this.Rp.X5},
-Rz:function(a,b){return this.Rp.Rz(0,b)},
-gUQ:function(a){var z=this.Rp
-return z.gUQ(z)},
-bu:[function(a){return P.vW(this.Rp)},"$0","gAY",0,0,71],
-$isZ0:true,
-$asZ0:null}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
+return H.VM(new P.tn(a,b,z,y),[e])}}}}],["","",,H,{
 "^":"",
 m6:function(a){a.toString
 return a},
@@ -10779,22 +10964,22 @@
 zU7:{
 "^":"Dg;",
 gbx:function(a){return C.kq},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.CP]},
-$isAS:true,
 "%":"Float32Array"},
 K8Q:{
 "^":"Dg;",
-gbx:function(a){return C.G0},
+gbx:function(a){return C.Dv},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.CP]},
-$isAS:true,
 "%":"Float64Array"},
 xja:{
 "^":"Pg;",
@@ -10802,12 +10987,12 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Int16Array"},
 dE:{
 "^":"Pg;",
@@ -10815,12 +11000,12 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Int32Array"},
 Zc5:{
 "^":"Pg;",
@@ -10828,12 +11013,12 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Int8Array"},
 pd:{
 "^":"Pg;",
@@ -10841,12 +11026,12 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Uint16Array"},
 Pqh:{
 "^":"Pg;",
@@ -10854,12 +11039,12 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Uint32Array"},
 eEV:{
 "^":"Pg;",
@@ -10868,12 +11053,12 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"CanvasPixelArray|Uint8ClampedArray"},
 V6:{
 "^":"Pg;",
@@ -10882,12 +11067,12 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":";Uint8Array"},
 b0B:{
 "^":"eH;",
@@ -10915,12 +11100,7 @@
 YW:function(a,b,c,d,e){if(!!J.x(d).$isDg){this.oZ(a,b,c,d,e)
 return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-$isDg:true,
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]}},
+$isDg:true},
 Ui:{
 "^":"b0B+lD;",
 $isWO:true,
@@ -10952,16 +11132,16 @@
 $isQV:true,
 $asQV:function(){return[P.KN]}},
 Ipv:{
-"^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
+"^":"ObS+SU7;"}}],["","",,H,{
 "^":"",
 qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
 return}if(typeof console=="object"&&typeof console.log!="undefined"){console.log(a)
 return}if(typeof window=="object")return
 if(typeof print=="function"){print(a)
-return}throw"Unable to print message: "+String(a)}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw"Unable to print message: "+String(a)}}],["","",,F,{
 "^":"",
 ZP:{
-"^":"D13;Py,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"D13;Py,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gkc:function(a){return a.Py},
 skc:function(a,b){a.Py=this.ct(a,C.yh,a.Py,b)},
 static:{Yw:function(a){var z,y
@@ -10969,7 +11149,7 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -10978,10 +11158,10 @@
 return a}}},
 D13:{
 "^":"uL+Pi;",
-$isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
+$isd3:true}}],["","",,L,{
 "^":"",
 nJ:{
-"^":"WZq;a3,Ek,Ln,y4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"WZq;a3,Ek,Ln,y4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 ga4:function(a){return a.a3},
 sa4:function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},
 gdu:function(a){return a.Ek},
@@ -10996,7 +11176,7 @@
 z=this.ct(a,C.eh,a.Ek,z)
 a.Ek=z
 if(J.xC(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gVr",6,0,111,2,102,103],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,113,2,104,105],
 Z1:[function(a,b,c,d){var z,y,x
 J.Kr(b)
 z=a.a3
@@ -11005,10 +11185,10 @@
 x=R.tB(y)
 J.kW(x,"expr",z)
 J.Vk(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,111,2,102,103],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,113,2,104,105],
 o5:[function(a,b){var z=J.bN(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,139,2],
-static:{Rp:function(a){var z,y,x
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,143,2],
+static:{Rpj:function(a){var z,y,x
 z=R.tB([])
 y=P.L5(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -11016,7 +11196,7 @@
 a.Ek="1-line"
 a.y4=z
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=y
 a.ZQ=x
@@ -11028,11 +11208,11 @@
 $isd3:true},
 YW:{
 "^":"TpZ:12;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,140,"call"],
-$isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,144,"call"],
+$isEH:true}}],["","",,R,{
 "^":"",
 Eg:{
-"^":"KAf;fe,l1,bY,jv,oy,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"KAf;fe,l1,bY,jv,oy,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gv8:function(a){return a.fe},
 sv8:function(a,b){a.fe=this.ct(a,C.S4,a.fe,b)},
 gph:function(a){return a.l1},
@@ -11060,7 +11240,7 @@
 a.jv=""
 a.oy=null
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -11071,64 +11251,64 @@
 "^":"xc+Pi;",
 $isd3:true},
 Kz:{
-"^":"TpZ:141;a",
+"^":"TpZ:145;a",
 $1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,92,"call"],
+z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,94,"call"],
 $isEH:true},
 uv:{
 "^":"TpZ:74;b",
 $0:[function(){var z=this.b
 z.fe=J.Q5(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+$isEH:true}}],["","",,D,{
 "^":"",
 i7:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{hSW:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.MC.ZL(a)
 C.MC.XI(a)
-return a}}}}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+return a}}}}],["","",,A,{
 "^":"",
 Gk:{
-"^":"pva;KV,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"pva;KV,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gt0:function(a){return a.KV},
 st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
-SK:[function(a,b){J.cI(a.KV).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.KV).YM(b)},"$1","gvC",2,0,19,100],
 static:{cYO:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.D4.ZL(a)
-C.D4.XI(a)
+C.LTI.ZL(a)
+C.LTI.XI(a)
 return a}}},
 pva:{
 "^":"uL+Pi;",
-$isd3:true}}],["flag_list_element","package:observatory/src/elements/flag_list.dart",,X,{
+$isd3:true}}],["","",,X,{
 "^":"",
 J3:{
-"^":"cda;DC,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"cda;DC,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gpM:function(a){return a.DC},
 spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
-SK:[function(a,b){J.cI(a.DC).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.DC).YM(b)},"$1","gvC",2,0,19,100],
 static:{TsF:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -11139,7 +11319,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 MJ:{
-"^":"waa;Zc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"waa;Zc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gJ6:function(a){return a.Zc},
 sJ6:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
 static:{IfX:function(a){var z,y
@@ -11147,7 +11327,7 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -11156,10 +11336,10 @@
 return a}}},
 waa:{
 "^":"uL+Pi;",
-$isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
+$isd3:true}}],["","",,U,{
 "^":"",
 DK:{
-"^":"T53;lh,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"T53;lh,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gU4:function(a){return a.lh},
 sU4:function(a,b){a.lh=this.ct(a,C.QK,a.lh,b)},
 static:{v9:function(a){var z,y
@@ -11169,7 +11349,7 @@
 a.lh=!0
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -11178,33 +11358,37 @@
 return a}}},
 T53:{
 "^":"xI+Pi;",
-$isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
+$isd3:true}}],["","",,N,{
 "^":"",
 BS:{
-"^":"V9;P6,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V4;P6,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gig:function(a){return a.P6},
 sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
-SK:[function(a,b){J.cI(a.P6).YM(b)},"$1","gvC",2,0,19,98],
-j9:[function(a,b){J.eg(a.P6).YM(b)},"$1","gDX",2,0,19,98],
+SK:[function(a,b){J.cI(a.P6).YM(b)},"$1","gvC",2,0,19,100],
+Ur:[function(a,b){J.eg(a.P6).YM(b)},"$1","gDX",2,0,19,100],
 static:{nz:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.p0.ZL(a)
 C.p0.XI(a)
 return a}}},
-V9:{
+V4:{
 "^":"uL+Pi;",
-$isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
+$isd3:true}}],["","",,O,{
 "^":"",
 Hz:{
 "^":"a;zE,mS",
-PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,142],
+sih:function(a,b){var z=this.mS
+C.yp.zB(J.Qd(this.zE),z,z+4,b)},
+gih:function(a){var z=this.mS
+return C.yp.Mu(J.Qd(this.zE),z,z+4)},
+PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,146],
 gvH:function(a){return C.CD.cU(this.mS,4)},
 static:{"^":"Q0z",x6:function(a,b){var z,y,x
 z=b.gy(b)
@@ -11217,7 +11401,7 @@
 x2:{
 "^":"a;Yu<,tL"},
 Vb:{
-"^":"V10;hi,An,dW,rM,Aj,UL,PA,oj,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V9;hi,An,dW,rM,Aj,UL,PA,oj,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gpf:function(a){return a.PA},
 spf:function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},
 gyw:function(a){return a.oj},
@@ -11227,9 +11411,9 @@
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
 a.hi=z
 z=J.Q9(z)
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gmo(a)),z.Sg),[H.Oq(z,0)]).Zz()
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(this.gmo(a)),z.Sg),[H.u3(z,0)]).Zz()
 z=J.GW(a.hi)
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gJb(a)),z.Sg),[H.Oq(z,0)]).Zz()},
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(this.gJb(a)),z.Sg),[H.u3(z,0)]).Zz()},
 LV:function(a,b){var z,y,x
 for(z=J.mY(b),y=0;z.G();){x=z.lo
 if(typeof x!=="number")return H.s(x)
@@ -11292,9 +11476,9 @@
 w=z.mS
 v=a.UL.t(0,a.Aj.t(0,this.LV(a,C.yp.Mu(J.Qd(z.zE),w,w+4))))
 z=J.xC(v,"")?"-":H.d(v)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,139,143],
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,143,85],
 X7:[function(a,b){var z=J.u1(this.WE(a,J.op(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,139,143],
+window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,143,85],
 My:function(a){var z,y,x,w,v
 z=a.oj
 if(z==null||a.hi==null)return
@@ -11365,9 +11549,9 @@
 P.Iw(new O.R5(a,b),null)},
 SK:[function(a,b){var z=a.oj
 if(z==null)return
-J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).YM(b)},"$1","gvC",2,0,19,98],
-YS7:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,19,59],
-static:{"^":"nK,Os,SoT,WBO",pn:function(a){var z,y,x,w,v
+J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).YM(b)},"$1","gvC",2,0,19,100],
+YS:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,19,59],
+static:{"^":"nK,Os,SoT,WBO",teo:function(a){var z,y,x,w,v
 z=P.Fl(null,null)
 y=P.Fl(null,null)
 x=P.Fl(null,null)
@@ -11378,14 +11562,14 @@
 a.Aj=y
 a.UL=x
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=w
 a.ZQ=v
-C.Cs.ZL(a)
-C.Cs.XI(a)
+C.wc.ZL(a)
+C.wc.XI(a)
 return a}}},
-V10:{
+V9:{
 "^":"uL+Pi;",
 $isd3:true},
 R5:{
@@ -11393,33 +11577,33 @@
 $0:function(){J.fi(this.a,this.b+1)},
 $isEH:true},
 aG:{
-"^":"TpZ:110;a",
+"^":"TpZ:112;a",
 $1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,144,"call"],
+z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 z4:{
 "^":"TpZ:79;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,2,145,"call"],
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,2,148,"call"],
 $isEH:true},
 oc:{
 "^":"TpZ:74;a",
 $0:function(){J.vP(this.a)},
-$isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+$isEH:true}}],["","",,K,{
 "^":"",
 UC:{
 "^":"Vz;oH,vp,zz,pT,jV,AP,fn",
 eE:function(a,b){var z
 if(b===0){z=this.vp
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.O6(J.UQ(J.U8(z[a]),b))}return G.Vz.prototype.eE.call(this,a,b)}},
+return J.O6(J.UQ(J.hI(z[a]),b))}return G.Vz.prototype.eE.call(this,a,b)}},
 Ly:{
-"^":"V11;MF,uY,GQ,I8,Oc,GM,nc,pp,Ol,Sk,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V10;MF,uY,GQ,I8,Oc,GM,Rp,pp,Ol,Sk,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gYt:function(a){return a.MF},
 sYt:function(a,b){a.MF=this.ct(a,C.TN,a.MF,b)},
 gcH:function(a){return a.uY},
 scH:function(a,b){a.uY=this.ct(a,C.Zi,a.uY,b)},
-gLF:function(a){return a.nc},
-sLF:function(a,b){a.nc=this.ct(a,C.kG,a.nc,b)},
+gLF:function(a){return a.Rp},
+sLF:function(a,b){a.Rp=this.ct(a,C.kG,a.Rp,b)},
 gB1:function(a){return a.Ol},
 sB1:function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},
 god:function(a){return a.Sk},
@@ -11443,21 +11627,21 @@
 w.gUY().eC(x.t(y,"new"))
 w.gxQ().eC(x.t(y,"old"))}},
 Yz:function(a){var z,y,x,w,v,u,t,s,r,q
-a.nc.Ai()
+a.Rp.Ai()
 for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=J.UQ(z.gl(),"class")
 if(y==null)continue
-if(y.gJL())continue
-x=y.gUY().gbi().rT
-w=y.gUY().gbi().wf
+if(y.gMp())continue
+x=y.gUY().ghb().rT
+w=y.gUY().ghb().wf
 v=y.gUY().gl().rT
 u=y.gUY().gl().wf
-t=y.gxQ().gbi().rT
-s=y.gxQ().gbi().wf
+t=y.gxQ().ghb().rT
+s=y.gxQ().ghb().wf
 r=y.gxQ().gl().rT
 q=y.gxQ().gl().wf
-J.fD(a.nc,new G.Ni([y,"",x,w,v,u,"",t,s,r,q]))}J.tO(a.nc)},
+J.fD(a.Rp,new G.Ni([y,"",x,w,v,u,"",t,s,r,q]))}J.II(a.Rp)},
 E4:function(a,b,c){var z,y,x,w,v,u
-z=J.UQ(J.TY(a.nc),c)
+z=J.UQ(J.TY(a.Rp),c)
 y=J.RE(b)
 x=J.RE(z)
 J.PP(J.UQ(J.Mx(J.UQ(y.gks(b),0)),0),J.UQ(x.gUQ(z),0))
@@ -11469,13 +11653,13 @@
 u=J.UQ(y.gks(b),w)
 v=J.RE(u)
 v.smk(u,J.AG(J.UQ(x.gUQ(z),w)))
-v.sa4(u,a.nc.Gu(c,w))}++w}},
+v.sa4(u,a.Rp.Gu(c,w))}++w}},
 Jh:function(a){var z,y,x,w,v,u,t,s
 z=J.Mx(a.pp)
-if(z.gB(z)>a.nc.gzz().length){z=J.Mx(a.pp)
-y=z.gB(z)-a.nc.gzz().length
+if(z.gB(z)>a.Rp.gzz().length){z=J.Mx(a.pp)
+y=z.gB(z)-a.Rp.gzz().length
 for(x=0;x<y;++x)J.Mx(a.pp).mv(0)}else{z=J.Mx(a.pp)
-if(z.gB(z)<a.nc.gzz().length){z=a.nc.gzz().length
+if(z.gB(z)<a.Rp.gzz().length){z=a.Rp.gzz().length
 w=J.Mx(a.pp)
 v=z-w.gB(w)
 for(x=0;x<v;++x){u=document.createElement("tr",null)
@@ -11495,28 +11679,28 @@
 z.iF(u,-1)
 z.iF(u,-1)
 z.iF(u,-1)
-J.Mx(a.pp).h(0,u)}}}for(x=0;x<a.nc.gzz().length;++x){z=a.nc.gzz()
+J.Mx(a.pp).h(0,u)}}}for(x=0;x<a.Rp.gzz().length;++x){z=a.Rp.gzz()
 if(x>=z.length)return H.e(z,x)
 s=z[x]
 this.E4(a,J.Mx(a.pp).t(0,x),s)}},
 AE:[function(a,b,c,d){var z,y,x
-if(!!J.x(d).$isv6){z=a.nc.gxp()
+if(!!J.x(d).$isv6){z=a.Rp.gxp()
 y=d.cellIndex
-x=a.nc
+x=a.Rp
 if(z==null?y!=null:z!==y){x.sxp(y)
-a.nc.sT3(!0)}else x.sT3(!x.gT3())
-J.tO(a.nc)
-this.Jh(a)}},"$3","gQq",6,0,101,2,102,103],
+a.Rp.sT3(!0)}else x.sT3(!x.gT3())
+J.II(a.Rp)
+this.Jh(a)}},"$3","gQq",6,0,103,2,104,105],
 SK:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).YM(b)},"$1","gvC",2,0,19,98],
+J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).YM(b)},"$1","gvC",2,0,19,100],
 zT:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).YM(b)},"$1","gyW",2,0,19,98],
+J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).YM(b)},"$1","gyW",2,0,19,100],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).YM(b)},"$1","gNb",2,0,19,98],
-Ed:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,146,147],
+J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).YM(b)},"$1","gNb",2,0,19,100],
+Ed:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,149,150],
 n1:[function(a,b){var z,y,x,w,v
 z=a.Ol
 if(z==null)return
@@ -11528,44 +11712,44 @@
 if(!J.xC(y,0)){z=P.Wu(y,!1).bu(0)
 a.uY=this.ct(a,C.Zi,a.uY,z)}y=H.BU(J.UQ(a.Ol,"dateLastServiceGC"),null,null)
 if(!J.xC(y,0)){z=P.Wu(y,!1).bu(0)
-a.MF=this.ct(a,C.TN,a.MF,z)}z=a.GQ.KJ
+a.MF=this.ct(a,C.TN,a.MF,z)}z=a.GQ.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 x=J.aT(a.Ol)
 z=a.GQ
 w=x.gUY().gSU()
-z=z.KJ
+z=z.Yb
 v=[]
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
 z.V7("addRow",[H.VM(new P.GD(v),[null])])
 v=a.GQ
 z=J.Hn(x.gUY().gCs(),x.gUY().gSU())
-v=v.KJ
+v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
 v.V7("addRow",[H.VM(new P.GD(w),[null])])
 w=a.GQ
 v=x.gUY().gMX()
-w=w.KJ
+w=w.Yb
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
 w.V7("addRow",[H.VM(new P.GD(z),[null])])
-z=a.Oc.KJ
+z=a.Oc.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 z=a.Oc
 w=x.gxQ().gSU()
-z=z.KJ
+z=z.Yb
 v=[]
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
 z.V7("addRow",[H.VM(new P.GD(v),[null])])
 v=a.Oc
 z=J.Hn(x.gxQ().gCs(),x.gxQ().gSU())
-v=v.KJ
+v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
 v.V7("addRow",[H.VM(new P.GD(w),[null])])
 w=a.Oc
 v=x.gxQ().gMX()
-w=w.KJ
+w=w.Yb
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
 w.V7("addRow",[H.VM(new P.GD(z),[null])])
@@ -11582,28 +11766,28 @@
 if(z==null)return""
 y=J.RE(z)
 x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,148,149],
-uW:[function(a,b){var z,y
+return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,151,152],
+NC:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,148,149],
+return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,151,152],
 F9:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.wF((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,148,149],
+return J.wF((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,151,152],
 Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
 a.GQ=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
-a.GQ.KJ.V7("addColumn",["number","Size"])
+a.GQ.Yb.V7("addColumn",["number","Size"])
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 a.Oc=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
-a.Oc.KJ.V7("addColumn",["number","Size"])
+a.Oc.Yb.V7("addColumn",["number","Size"])
 z=H.VM([],[G.Ni])
-z=this.ct(a,C.kG,a.nc,new K.UC([new G.Kt("Class",G.ji()),new G.Kt("",G.ji()),new G.Kt("Accumulated Size (New)",G.Gt()),new G.Kt("Accumulated Instances",G.HH()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.HH()),new G.Kt("",G.ji()),new G.Kt("Accumulator Size (Old)",G.Gt()),new G.Kt("Accumulator Instances",G.HH()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.HH())],z,[],0,!0,null,null))
-a.nc=z
+z=this.ct(a,C.kG,a.Rp,new K.UC([new G.Ktd("Class",G.ji()),new G.Ktd("",G.ji()),new G.Ktd("Accumulated Size (New)",G.Gt()),new G.Ktd("Accumulated Instances",G.HH()),new G.Ktd("Current Size",G.Gt()),new G.Ktd("Current Instances",G.HH()),new G.Ktd("",G.ji()),new G.Ktd("Accumulator Size (Old)",G.Gt()),new G.Ktd("Accumulator Instances",G.HH()),new G.Ktd("Current Size",G.Gt()),new G.Ktd("Current Instances",G.HH())],z,[],0,!0,null,null))
+a.Rp=z
 z.sxp(2)},
 static:{Ut:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -11612,7 +11796,7 @@
 a.MF="---"
 a.uY="---"
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -11620,9 +11804,9 @@
 C.Vc.XI(a)
 C.Vc.Zy(a)
 return a}}},
-V11:{
+V10:{
 "^":"uL+Pi;",
-$isd3:true}}],["html_common","dart:html_common",,P,{
+$isd3:true}}],["","",,P,{
 "^":"",
 pf:function(a){var z,y
 z=[]
@@ -11654,13 +11838,13 @@
 return y},
 $isEH:true},
 rG:{
-"^":"TpZ:150;d",
+"^":"TpZ:153;d",
 $1:function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 fh:{
-"^":"TpZ:151;e",
+"^":"TpZ:154;e",
 $2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
@@ -11718,13 +11902,13 @@
 return y},
 $isEH:true},
 D6:{
-"^":"TpZ:150;c",
+"^":"TpZ:153;c",
 $1:function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 KC:{
-"^":"TpZ:151;d",
+"^":"TpZ:154;d",
 $2:function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
@@ -11743,7 +11927,7 @@
 if(y!=null)return y
 y=P.Fl(null,null)
 this.bK.$2(z,y)
-for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.Oq(x,0)]);x.G();){w=x.lo
+for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.lo
 y.u(0,w,this.$1(a[w]))}return y}if(a instanceof Array){z=this.f.$1(a)
 y=this.UI.$1(z)
 if(y!=null)return y
@@ -11771,12 +11955,12 @@
 aN:function(a,b){this.lF().aN(0,b)},
 zV:function(a,b){return this.lF().zV(0,b)},
 ez:[function(a,b){var z=this.lF()
-return H.VM(new H.xy(z,b),[H.Oq(z,0),null])},"$1","gIr",2,0,152,30],
+return H.VM(new H.xy(z,b),[H.u3(z,0),null])},"$1","gIr",2,0,155,30],
 ad:function(a,b){var z=this.lF()
-return H.VM(new H.U5(z,b),[H.Oq(z,0)])},
+return H.VM(new H.U5(z,b),[H.u3(z,0)])},
 lM:[function(a,b){var z=this.lF()
-return H.VM(new H.oA(z,b),[H.Oq(z,0),null])},"$1","git",2,0,153,30],
-ou:function(a,b){return this.lF().ou(0,b)},
+return H.VM(new H.oA(z,b),[H.u3(z,0),null])},"$1","git",2,0,156,30],
+Vr:function(a,b){return this.lF().Vr(0,b)},
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
 gB:function(a){return this.lF().X5},
@@ -11801,6 +11985,8 @@
 y=z.Ys()
 y.FV(0,z)
 return y},
+eR:function(a,b){var z=this.lF()
+return H.ke(z,b,H.u3(z,0))},
 V1:function(a){this.OS(new P.uQ())},
 OS:function(a){var z,y
 z=this.lF()
@@ -11814,19 +12000,19 @@
 $asQV:function(){return[P.qU]}},
 GE:{
 "^":"TpZ:12;a",
-$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,154,"call"],
+$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,157,"call"],
 $isEH:true},
 rl:{
 "^":"TpZ:12;a",
-$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,154,"call"],
+$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,157,"call"],
 $isEH:true},
 PR:{
 "^":"TpZ:12;a",
-$1:[function(a){return J.rA(a,this.a)},"$1",null,2,0,null,154,"call"],
+$1:[function(a){return J.r8(a,this.a)},"$1",null,2,0,null,157,"call"],
 $isEH:true},
 uQ:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,154,"call"],
+$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,157,"call"],
 $isEH:true},
 D7:{
 "^":"ark;Yn,iz",
@@ -11842,7 +12028,7 @@
 this.UZ(0,b,z)},
 h:function(a,b){this.iz.NL.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Oq(b,0)]),y=this.iz.NL;z.G();)y.appendChild(z.lo)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.iz.NL;z.G();)y.appendChild(z.lo)},
 tg:function(a,b){return!1},
 GT:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
 Jd:function(a){return this.GT(a,null)},
@@ -11858,7 +12044,7 @@
 z=this.iz.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},
+J.r5(z,c,y[b])},
 Rz:function(a,b){var z,y,x
 if(!J.x(b).$ish4)return!1
 for(z=0;z<this.gye().length;++z){y=this.gye()
@@ -11871,7 +12057,7 @@
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 gA:function(a){var z=this.gye()
-return H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)])}},
+return H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])}},
 hT:{
 "^":"TpZ:12;",
 $1:function(a){return!!J.x(a).$ish4},
@@ -11879,10 +12065,10 @@
 GS:{
 "^":"TpZ:12;",
 $1:function(a){return J.Mp(a)},
-$isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
+$isEH:true}}],["","",,B,{
 "^":"",
 pR:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gJp:function(a){var z=a.tY
 if(z!=null)if(J.xC(z.gzS(),"Null"))if(J.xC(J.eS(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
 else if(J.xC(J.eS(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
@@ -11897,14 +12083,14 @@
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,155,156,98],
+c.$0()}},"$2","gus",4,0,158,159,100],
 static:{lu:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -11919,79 +12105,79 @@
 a.sTX(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
 z.tY=y.ct(z,C.kY,z.tY,a)
-y.ct(z,C.kY,0,1)},"$1",null,2,0,null,140,"call"],
-$isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+y.ct(z,C.kY,0,1)},"$1",null,2,0,null,144,"call"],
+$isEH:true}}],["","",,Z,{
 "^":"",
 hx:{
-"^":"V12;Xh,f2,Rr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V11;Xh,f2,Rr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 ghf:function(a){return a.Xh},
 shf:function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},
 gIi:function(a){return a.f2},
 sIi:function(a,b){a.f2=this.ct(a,C.XM,a.f2,b)},
 gCF:function(a){return a.Rr},
 sCF:function(a,b){a.Rr=this.ct(a,C.tg,a.Rr,b)},
-vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
-S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retained")).ml(new Z.wU(a))},"$1","ghN",2,0,107,109],
-Pr:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,107,32],
-SK:[function(a,b){J.cI(a.Xh).YM(b)},"$1","gvC",2,0,19,98],
+vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,107,108],
+S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retained")).ml(new Z.wU(a))},"$1","ghN",2,0,109,111],
+Pr:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,109,32],
+SK:[function(a,b){J.cI(a.Xh).YM(b)},"$1","gvC",2,0,19,100],
 static:{CoW:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Rr=null
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.yKx.ZL(a)
 C.yKx.XI(a)
 return a}}},
-V12:{
+V11:{
 "^":"uL+Pi;",
 $isd3:true},
 wU:{
-"^":"TpZ:110;a",
+"^":"TpZ:112;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.Rr=J.Q5(z,C.tg,z.Rr,y)},"$1",null,2,0,null,92,"call"],
+z.Rr=J.Q5(z,C.tg,z.Rr,y)},"$1",null,2,0,null,94,"call"],
 $isEH:true},
 cL:{
-"^":"TpZ:141;a",
+"^":"TpZ:145;a",
 $1:[function(a){var z=this.a
-z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,92,"call"],
-$isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
+z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,94,"call"],
+$isEH:true}}],["","",,E,{
 "^":"",
 L4:{
-"^":"V13;PM,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V12;PM,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gkm:function(a){return a.PM},
 skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
-SK:[function(a,b){J.cI(a.PM).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.PM).YM(b)},"$1","gvC",2,0,19,100],
 static:{p4t:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.wd.ZL(a)
 C.wd.XI(a)
 return a}}},
-V13:{
+V12:{
 "^":"uL+Pi;",
 $isd3:true},
 Mb:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{RVI:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -11999,34 +12185,34 @@
 C.Ag.XI(a)
 return a}}},
 mO:{
-"^":"V14;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V13;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,100],
 static:{Ch:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.Ie.ZL(a)
 C.Ie.XI(a)
 return a}}},
-V14:{
+V13:{
 "^":"uL+Pi;",
 $isd3:true},
 DE:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{oB:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -12034,13 +12220,13 @@
 C.Ig.XI(a)
 return a}}},
 U1:{
-"^":"V15;yR,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V14;yR,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gql:function(a){return a.yR},
 sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
-SK:[function(a,b){J.cI(a.yR).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.yR).YM(b)},"$1","gvC",2,0,19,100],
 Lg:[function(a){J.cI(a.yR).YM(new E.XB(a))},"$0","gW6",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
+a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gW6(a))},
 dQ:function(a){var z
 Z.uL.prototype.dQ.call(this,a)
 z=a.mZ
@@ -12051,29 +12237,29 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.x4.ZL(a)
-C.x4.XI(a)
+C.VLs.ZL(a)
+C.VLs.XI(a)
 return a}}},
-V15:{
+V14:{
 "^":"uL+Pi;",
 $isd3:true},
 XB:{
 "^":"TpZ:74;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 H8:{
-"^":"V16;vd,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V15;vd,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gPB:function(a){return a.vd},
 sPB:function(a,b){a.vd=this.ct(a,C.yL,a.vd,b)},
-SK:[function(a,b){J.cI(a.vd).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.vd).YM(b)},"$1","gvC",2,0,19,100],
 Lg:[function(a){J.cI(a.vd).YM(new E.uN(a))},"$0","gW6",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
+a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gW6(a))},
 dQ:function(a){var z
 Z.uL.prototype.dQ.call(this,a)
 z=a.mZ
@@ -12084,30 +12270,30 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.GII.ZL(a)
-C.GII.XI(a)
+C.tO.ZL(a)
+C.tO.XI(a)
 return a}}},
-V16:{
+V15:{
 "^":"uL+Pi;",
 $isd3:true},
 uN:{
 "^":"TpZ:74;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 WS:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{jS:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -12115,14 +12301,14 @@
 C.bP.XI(a)
 return a}}},
 qh:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{va:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -12130,54 +12316,54 @@
 C.wK.XI(a)
 return a}}},
 oF:{
-"^":"V17;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V16;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,100],
 static:{UE:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.Tl.ZL(a)
 C.Tl.XI(a)
 return a}}},
-V17:{
+V16:{
 "^":"uL+Pi;",
 $isd3:true},
 Q6:{
-"^":"V18;uv,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V17;uv,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gj4:function(a){return a.uv},
 sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
-SK:[function(a,b){J.cI(a.uv).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.uv).YM(b)},"$1","gvC",2,0,19,100],
 static:{chF:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.rU.ZL(a)
 C.rU.XI(a)
 return a}}},
-V18:{
+V17:{
 "^":"uL+Pi;",
 $isd3:true},
 uE:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{AW:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -12185,74 +12371,74 @@
 C.Rr.XI(a)
 return a}}},
 Zn:{
-"^":"V19;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V18;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,100],
 static:{kf:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.ij.ZL(a)
 C.ij.XI(a)
 return a}}},
-V19:{
+V18:{
 "^":"uL+Pi;",
 $isd3:true},
 n5:{
-"^":"V20;h1,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V19;h1,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gHy:function(a){return a.h1},
 sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
-SK:[function(a,b){J.cI(a.h1).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.h1).YM(b)},"$1","gvC",2,0,19,100],
 static:{iOo:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.aV.ZL(a)
 C.aV.XI(a)
 return a}}},
-V20:{
+V19:{
 "^":"uL+Pi;",
 $isd3:true},
 Ma:{
-"^":"V21;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V20;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,100],
 static:{Ii:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.iR.ZL(a)
 C.iR.XI(a)
 return a}}},
-V21:{
+V20:{
 "^":"uL+Pi;",
 $isd3:true},
 wN:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{ML:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -12260,13 +12446,13 @@
 C.RVQ.XI(a)
 return a}}},
 ds:{
-"^":"V22;wT,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V21;wT,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gMZ:function(a){return a.wT},
 sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
-SK:[function(a,b){J.cI(a.wT).YM(b)},"$1","gvC",2,0,19,98],
-nK:[function(a){J.cI(a.wT).YM(new E.As(a))},"$0","guT",0,0,17],
+SK:[function(a,b){J.cI(a.wT).YM(b)},"$1","gvC",2,0,19,100],
+Po:[function(a){J.cI(a.wT).YM(new E.As(a))},"$0","guT",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
+a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.guT(a))},
 dQ:function(a){var z
 Z.uL.prototype.dQ.call(this,a)
 z=a.mZ
@@ -12277,43 +12463,43 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.wP.ZL(a)
 C.wP.XI(a)
 return a}}},
-V22:{
+V21:{
 "^":"uL+Pi;",
 $isd3:true},
 As:{
 "^":"TpZ:74;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 qM:{
-"^":"V23;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V22;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,100],
 static:{tX:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.lX.ZL(a)
 C.lX.XI(a)
 return a}}},
-V23:{
+V22:{
 "^":"uL+Pi;",
 $isd3:true},
 av:{
-"^":"ZzR;CB,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"ZzR;CB,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gEQ:function(a){return a.CB},
 sEQ:function(a,b){a.CB=this.ct(a,C.pH,a.CB,b)},
 static:{R7:function(a){var z,y
@@ -12323,25 +12509,25 @@
 a.CB=!1
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.Wa.ZL(a)
-C.Wa.XI(a)
+C.OkI.ZL(a)
+C.OkI.XI(a)
 return a}}},
 ZzR:{
 "^":"xI+Pi;",
 $isd3:true},
 uz:{
-"^":"V24;RX,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V23;RX,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gNN:function(a){return a.RX},
 Fn:function(a){return this.gNN(a).$0()},
 sNN:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
-SK:[function(a,b){J.cI(a.RX).YM(b)},"$1","gvC",2,0,19,98],
-nK:[function(a){J.cI(a.RX).YM(new E.Cc(a))},"$0","guT",0,0,17],
+SK:[function(a,b){J.cI(a.RX).YM(b)},"$1","gvC",2,0,19,100],
+Po:[function(a){J.cI(a.RX).YM(new E.Cc(a))},"$0","guT",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
+a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.guT(a))},
 dQ:function(a){var z
 Z.uL.prototype.dQ.call(this,a)
 z=a.mZ
@@ -12352,21 +12538,21 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.bZ.ZL(a)
 C.bZ.XI(a)
 return a}}},
-V24:{
+V23:{
 "^":"uL+Pi;",
 $isd3:true},
 Cc:{
 "^":"TpZ:74;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
-$isEH:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
+if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
+$isEH:true}}],["","",,X,{
 "^":"",
 Se:{
 "^":"Y2;B1>,SF,H,Zn<,vs<,ki<,Vh<,ZX<,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
@@ -12406,7 +12592,7 @@
 z.mW(a,b,c,d)
 return z}}},
 kK:{
-"^":"V25;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,WC,Hm=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V24;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,WC,Hm=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gB1:function(a){return a.oi},
 sB1:function(a,b){a.oi=this.ct(a,C.vb,a.oi,b)},
 gPL:function(a){return a.TH},
@@ -12452,11 +12638,11 @@
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=R.tB([])
-a.Hm=new G.xK(z,null,null)
+a.Hm=new G.iY(z,null,null)
 this.Zb(a)},
 m5:[function(a,b){this.SK(a,null)},"$1","gb6",2,0,19,59],
 SK:[function(a,b){var z="profile?tags="+H.d(a.TM)
-J.aT(a.oi).cv(z).ml(new X.Xy(a)).YM(b)},"$1","gvC",2,0,19,98],
+J.aT(a.oi).cv(z).ml(new X.Xy(a)).YM(b)},"$1","gvC",2,0,19,100],
 Zb:function(a){if(a.oi==null)return
 this.GN(a)},
 GN:function(a){var z,y,x,w,v
@@ -12467,8 +12653,8 @@
 x=new H.oP(w,null)
 N.QM("").wF("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,99,100],
-LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,99,100],
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,101,102],
+ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,101,102],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
@@ -12479,7 +12665,7 @@
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.oP(u,null)
-N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,101,2,102,103],
+N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,103,2,104,105],
 static:{"^":"B6",jD:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12494,40 +12680,40 @@
 a.TM="uv"
 a.WC="#tableTree"
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.kS.ZL(a)
 C.kS.XI(a)
 return a}}},
-V25:{
+V24:{
 "^":"uL+Pi;",
 $isd3:true},
 Xy:{
-"^":"TpZ:110;a",
+"^":"TpZ:112;a",
 $1:[function(a){var z=this.a
-z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,157,"call"],
-$isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
+z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,160,"call"],
+$isEH:true}}],["","",,N,{
 "^":"",
 oa:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{IB:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.LN.ZL(a)
 C.LN.XI(a)
-return a}}}}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+return a}}}}],["","",,D,{
 "^":"",
 St:{
-"^":"V26;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V25;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{N5:function(a){var z,y
@@ -12535,49 +12721,46 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.OoF.ZL(a)
 C.OoF.XI(a)
 return a}}},
-V26:{
+V25:{
 "^":"uL+Pi;",
 $isd3:true},
 IW:{
-"^":"V27;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V26;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.rf(a))},"$1","gX0",2,0,158,13],
-kf:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,158,13],
+Fv:[function(a,b){return J.fp(a.ow)},"$1","gX0",2,0,161,13],
+kf:[function(a,b){$.Kh.x3(a.ow)
+return J.df(a.ow)},"$1","gDQ",2,0,161,13],
+tb:[function(a,b){$.Kh.x3(a.ow)
+return J.aN(a.ow)},"$1","gLc",2,0,161,13],
+jA:[function(a,b){$.Kh.x3(a.ow)
+return J.MU(a.ow)},"$1","gqF",2,0,161,13],
+Cx:[function(a,b){$.Kh.x3(a.ow)
+return J.Fy(a.ow)},"$1","gVX",2,0,161,13],
 static:{zr:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.lk8.ZL(a)
 C.lk8.XI(a)
 return a}}},
-V27:{
+V26:{
 "^":"uL+Pi;",
 $isd3:true},
-rf:{
-"^":"TpZ:12;a",
-$1:[function(a){return J.cI(this.a.ow)},"$1",null,2,0,null,140,"call"],
-$isEH:true},
-r8:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-$.Kh.x3(z.ow)
-return J.cI(z.ow)},"$1",null,2,0,null,140,"call"],
-$isEH:true},
 Qh:{
-"^":"V28;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V27;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{Qj:function(a){var z,y
@@ -12585,18 +12768,18 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.rCJ.ZL(a)
 C.rCJ.XI(a)
 return a}}},
-V28:{
+V27:{
 "^":"uL+Pi;",
 $isd3:true},
 Oz:{
-"^":"V29;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V28;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{TSH:function(a){var z,y
@@ -12604,20 +12787,20 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.Ji.ZL(a)
 C.Ji.XI(a)
 return a}}},
-V29:{
+V28:{
 "^":"uL+Pi;",
 $isd3:true},
 vT:{
 "^":"a;Y0,WL",
 eC:function(a){var z,y,x,w,v,u
-z=this.Y0.KJ
+z=this.Y0.Yb
 if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Name"])
 z.V7("addColumn",["number","Value"])}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 for(y=J.RE(a),x=J.mY(y.gvc(a));x.G();){w=x.gl()
@@ -12629,7 +12812,7 @@
 u.$builtinTypeInfo=[null]
 z.V7("addRow",[u])}}},
 Z4:{
-"^":"V30;wd,iw,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V29;wd,iw,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gXE:function(a){return a.wd},
 sXE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
 ak:[function(a,b){var z,y,x
@@ -12644,31 +12827,31 @@
 if(x==null){x=new G.qu(null,P.L5(null,null,null,null,null))
 x.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
 z.WL=x}x.W2(z.Y0)}},"$1","ghU",2,0,19,59],
-static:{Oll:function(a){var z,y
+static:{d7:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.aXP.ZL(a)
 C.aXP.XI(a)
 return a}}},
-V30:{
+V29:{
 "^":"uL+Pi;",
-$isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
+$isd3:true}}],["","",,L,{
 "^":"",
 EN:{
 "^":"a;Yi,S2",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.Yi.KJ
+z=this.Yi.Yb
 if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
 for(y=J.mY(a.gaf());y.G();){x=y.lo
 if(J.xC(x,"Idle"))continue
 z.V7("addColumn",["number",x])}}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-w=J.et(a.gaf(),"Idle")
+w=J.Wa(a.gaf(),"Idle")
 v=a.gij()
 for(u=0;u<a.glI().length;++u){y=a.glI()
 if(u>=y.length)return H.e(y,u)
@@ -12699,23 +12882,23 @@
 y.$builtinTypeInfo=[null]
 z.V7("addRow",[y])}}},
 qk:{
-"^":"V31;TO,Cn,Fs,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V30;TO,Cn,Fs,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 god:function(a){return a.TO},
 sod:function(a,b){a.TO=this.ct(a,C.rB,a.TO,b)},
 vV:[function(a,b){var z=a.TO
-return z.cv(J.ew(J.eS(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
+return z.cv(J.ew(J.eS(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,107,108],
 tI:[function(a){a.TO.m7().ml(new L.LX(a))},"$0","gCt",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.Cn=P.rT(P.ii(0,0,0,0,0,1),this.gCt(a))},
+a.Cn=P.cH(P.ii(0,0,0,0,0,1),this.gCt(a))},
 dQ:function(a){var z
 Z.uL.prototype.dQ.call(this,a)
 z=a.Cn
 if(z!=null){z.ed()
 a.Cn=null}},
-SK:[function(a,b){J.cI(a.TO).YM(b)},"$1","gvC",2,0,19,98],
-j9:[function(a,b){J.eg(a.TO).YM(b)},"$1","gDX",2,0,19,98],
-Fv:[function(a,b){return a.TO.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,158,13],
-kf:[function(a,b){return a.TO.cv("resume").ml(new L.QY(a))},"$1","gDQ",2,0,158,13],
+SK:[function(a,b){J.cI(a.TO).YM(b)},"$1","gvC",2,0,19,100],
+Ur:[function(a,b){J.eg(a.TO).YM(b)},"$1","gDX",2,0,19,100],
+Fv:[function(a,b){return a.TO.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,161,13],
+kf:[function(a,b){return a.TO.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,161,13],
 static:{Qtp:function(a){var z,y,x
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -12723,14 +12906,14 @@
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
 a.Fs=new L.EN(new G.Kf(z),null)
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=y
 a.ZQ=x
 C.Xe.ZL(a)
 C.Xe.XI(a)
 return a}}},
-V31:{
+V30:{
 "^":"uL+Pi;",
 $isd3:true},
 LX:{
@@ -12746,16 +12929,16 @@
 y.S2=v
 w.u(0,"isStacked",!0)
 y.S2.bG.u(0,"connectSteps",!1)
-y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.W2(y.Yi)}if(z.Cn!=null)z.Cn=P.rT(P.ii(0,0,0,0,0,1),J.J7(z))},"$1",null,2,0,null,159,"call"],
+y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.W2(y.Yi)}if(z.Cn!=null)z.Cn=P.cH(P.ii(0,0,0,0,0,1),J.J7(z))},"$1",null,2,0,null,162,"call"],
 $isEH:true},
 CV:{
 "^":"TpZ:12;a",
-$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,140,"call"],
+$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,144,"call"],
 $isEH:true},
-QY:{
+Vq:{
 "^":"TpZ:12;a",
-$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,140,"call"],
-$isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,144,"call"],
+$isEH:true}}],["","",,Z,{
 "^":"",
 xh:{
 "^":"a;ue,GO",
@@ -12808,7 +12991,7 @@
 u=x.vM+=typeof v==="string"?v:H.d(v)
 x.vM=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":"V32;Ly,cs,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V31;Ly,cs,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gIr:function(a){return a.Ly},
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:function(a,b){a.Ly=this.ct(a,C.SR,a.Ly,b)},
@@ -12829,55 +13012,55 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.Yt.ZL(a)
 C.Yt.XI(a)
 return a}}},
-V32:{
+V31:{
 "^":"uL+Pi;",
-$isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
+$isd3:true}}],["","",,R,{
 "^":"",
 LU:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
-static:{V4:function(a){var z,y
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
+static:{rA:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.Z3.ZL(a)
 C.Z3.XI(a)
-return a}}}}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+return a}}}}],["","",,M,{
 "^":"",
 CX:{
-"^":"V33;iI,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V32;iI,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gHt:function(a){return a.iI},
 sHt:function(a,b){a.iI=this.ct(a,C.EV,a.iI,b)},
-vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.eS(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
-SK:[function(a,b){J.cI(a.iI).YM(b)},"$1","gvC",2,0,19,98],
-j9:[function(a,b){J.eg(a.iI).YM(b)},"$1","gDX",2,0,19,98],
-static:{SP:function(a){var z,y
+vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.eS(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,107,108],
+SK:[function(a,b){J.cI(a.iI).YM(b)},"$1","gvC",2,0,19,100],
+Ur:[function(a,b){J.eg(a.iI).YM(b)},"$1","gDX",2,0,19,100],
+static:{as:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.MG.ZL(a)
 C.MG.XI(a)
 return a}}},
-V33:{
+V32:{
 "^":"uL+Pi;",
-$isd3:true}}],["logging","package:logging/logging.dart",,N,{
+$isd3:true}}],["","",,N,{
 "^":"",
 TJ:{
 "^":"a;oc>,eT>,n2,Cj>,ks>,Gs",
@@ -12896,7 +13079,9 @@
 gSZ:function(){return this.tQ()},
 mL:function(a){return a.P>=this.gOR().P},
 Y6:function(a,b,c,d){var z,y,x,w,v
-if(a.P>=this.gOR().P){z=this.gB8()
+if(a.P>=this.gOR().P){if(!!J.x(b).$isEH)b=b.$0()
+if(typeof b!=="string")b=J.AG(b)
+z=this.gB8()
 y=new P.iP(Date.now(),!1)
 y.EK()
 x=$.xO
@@ -12907,7 +13092,7 @@
 Z8:function(a,b,c){return this.Y6(C.D8,a,b,c)},
 kS:function(a){return this.Z8(a,null,null)},
 dL:function(a,b,c){return this.Y6(C.t4,a,b,c)},
-Ny:function(a){return this.dL(a,null,null)},
+J4:function(a){return this.dL(a,null,null)},
 ZG:function(a,b,c){return this.Y6(C.IF,a,b,c)},
 To:function(a){return this.ZG(a,null,null)},
 wF:function(a,b,c){return this.Y6(C.nT,a,b,c)},
@@ -12917,7 +13102,7 @@
 tQ:function(){if($.RL||this.eT==null){var z=this.Gs
 if(z==null){z=P.bK(null,null,!0,N.HV)
 this.Gs=z}z.toString
-return H.VM(new P.Ik(z),[H.Oq(z,0)])}else return N.QM("").tQ()},
+return H.VM(new P.Ik(z),[H.u3(z,0)])}else return N.QM("").tQ()},
 cB:function(a){var z=this.Gs
 if(z!=null){if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)}},
@@ -12934,7 +13119,7 @@
 if(y===-1)x=z!==""?N.QM(""):null
 else{x=N.QM(C.xB.Nj(z,0,y))
 z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.TJ)
-v=new N.TJ(z,x,null,w,H.VM(new Q.A2(w),[null,null]),null)
+v=new N.TJ(z,x,null,w,H.VM(new P.A2(w),[null,null]),null)
 v.QL(z,x,w)
 return v},
 $isEH:true},
@@ -12963,39 +13148,39 @@
 static:{"^":"V7K,tmj,Enk,LkO,tY,kH8,hlK,MHK,Uu,lDu,uxc"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,fi,kc>,I4<",
-bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},"$0","gAY",0,0,71],
+bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"$0","gAY",0,0,71],
 $isHV:true,
-static:{"^":"xO"}}}],["","main.dart",,F,{
+static:{"^":"xO"}}}],["","",,F,{
 "^":"",
 E2:function(){var z,y
 N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.e447())
+N.QM("").gSZ().yI(new F.e461())
 N.QM("").To("Starting Observatory")
 N.QM("").To("Loading Google Charts API")
 z=J.UQ($.Si(),"google")
 y=$.Ib()
 z.V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
-$.Ib().MM.ml(G.vN()).ml(new F.e448())},
-e447:{
-"^":"TpZ:161;",
+$.Ib().MM.ml(G.vN()).ml(new F.e462())},
+e461:{
+"^":"TpZ:164;",
 $1:[function(a){var z
 if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
 if(J.co(z.gG1(a),"Error evaluating expression"))z=J.x5(z.gG1(a),"Can't assign to null: ")===!0||J.x5(z.gG1(a),"Expression is not assignable: ")===!0
 else z=!1}else z=!1
 if(z)return
-P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,160,"call"],
+P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,163,"call"],
 $isEH:true},
-e448:{
+e462:{
 "^":"TpZ:12;",
 $1:[function(a){var z,y,x
 N.QM("").To("Initializing Polymer")
 try{A.YK()}catch(y){x=H.Ru(y)
 z=x
 N.QM("").YX("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,13,"call"],
-$isEH:true}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
+$isEH:true}}],["","",,A,{
 "^":"",
 md:{
-"^":"V34;i4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V33;i4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 giC:function(a){return a.i4},
 siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
 static:{DCi:function(a){var z,y
@@ -13004,18 +13189,18 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.i4=!0
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.kD.ZL(a)
 C.kD.XI(a)
 return a}}},
-V34:{
+V33:{
 "^":"uL+Pi;",
 $isd3:true},
 Bm:{
-"^":"V35;KU,V4,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V34;KU,V4,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gdU:function(a){return a.V4},
@@ -13030,18 +13215,18 @@
 a.V4="---"
 a.Jo=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.IG.ZL(a)
 C.IG.XI(a)
 return a}}},
-V35:{
+V34:{
 "^":"uL+Pi;",
 $isd3:true},
 Ya:{
-"^":"V36;KU,V4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V35;KU,V4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gdU:function(a){return a.V4},
@@ -13053,18 +13238,18 @@
 a.KU="#"
 a.V4="---"
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.Nk.ZL(a)
-C.Nk.XI(a)
+C.nn.ZL(a)
+C.nn.XI(a)
 return a}}},
-V36:{
+V35:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":"V37;rU,SB,z2,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V36;rU,SB,z2,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gFR:function(a){return a.rU},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
@@ -13076,7 +13261,7 @@
 Kp:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,111,2,102,103],
+if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,113,2,104,105],
 wY6:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,17],
 static:{ZC:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -13085,32 +13270,32 @@
 a.SB=!1
 a.z2="Refresh"
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.Y6.ZL(a)
 C.Y6.XI(a)
 return a}}},
-V37:{
+V36:{
 "^":"uL+Pi;",
 $isd3:true},
 ye:{
-"^":"uL;tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"uL;tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 static:{W1:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.pl.ZL(a)
-C.pl.XI(a)
+C.br.ZL(a)
+C.br.XI(a)
 return a}}},
 G1:{
-"^":"V38;Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V37;Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 static:{J8:function(a){var z,y
@@ -13119,23 +13304,23 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Jo=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.lx.ZL(a)
-C.lx.XI(a)
+C.OKl.ZL(a)
+C.OKl.XI(a)
 return a}}},
-V38:{
+V37:{
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":"V39;Jo,iy,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V38;Jo,iy,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 god:function(a){return a.iy},
 sod:function(a,b){a.iy=this.ct(a,C.rB,a.iy,b)},
-GU:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,19,59],
+vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,19,59],
 gu6:function(a){var z=a.iy
 if(z!=null)return J.Ds(z)
 else return""},
@@ -13146,18 +13331,18 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Jo=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.RRl.ZL(a)
 C.RRl.XI(a)
 return a}}},
-V39:{
+V38:{
 "^":"uL+Pi;",
 $isd3:true},
 UK:{
-"^":"V40;VW,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V39;VW,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gHt:function(a){return a.VW},
 sHt:function(a,b){a.VW=this.ct(a,C.EV,a.VW,b)},
 grZ:function(a){return a.Jo},
@@ -13168,18 +13353,18 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Jo=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.ct.ZL(a)
 C.ct.XI(a)
 return a}}},
-V40:{
+V39:{
 "^":"uL+Pi;",
 $isd3:true},
 wM:{
-"^":"V41;Au,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V40;Au,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gRu:function(a){return a.Au},
 sRu:function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},
 grZ:function(a){return a.Jo},
@@ -13190,18 +13375,18 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Jo=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.ic.ZL(a)
 C.ic.XI(a)
 return a}}},
-V41:{
+V40:{
 "^":"uL+Pi;",
 $isd3:true},
 NK:{
-"^":"V42;rv,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V41;rv,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gRk:function(a){return a.rv},
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
 static:{Xii:function(a){var z,y
@@ -13209,41 +13394,49 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.Mn.ZL(a)
 C.Mn.XI(a)
 return a}}},
-V42:{
+V41:{
 "^":"uL+Pi;",
 $isd3:true},
 Zx:{
-"^":"V43;rv,Wx,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V42;rv,Wx,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gRk:function(a){return a.rv},
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
 gBk:function(a){return a.Wx},
 sBk:function(a,b){a.Wx=this.ct(a,C.p8,a.Wx,b)},
-cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,162,2,102,103],
-static:{Ow:function(a){var z,y
+kf:[function(a,b){$.Kh.x3(J.aT(a.Wx))
+return J.df(J.aT(a.Wx))},"$1","gDQ",2,0,161,13],
+tb:[function(a,b){$.Kh.x3(J.aT(a.Wx))
+return J.aN(J.aT(a.Wx))},"$1","gLc",2,0,161,13],
+jA:[function(a,b){$.Kh.x3(J.aT(a.Wx))
+return J.MU(J.aT(a.Wx))},"$1","gqF",2,0,161,13],
+Cx:[function(a,b){$.Kh.x3(J.aT(a.Wx))
+return J.Fy(J.aT(a.Wx))},"$1","gVX",2,0,161,13],
+cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,165,2,104,105],
+static:{yno:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.L8.ZL(a)
 C.L8.XI(a)
 return a}}},
-V43:{
+V42:{
 "^":"uL+Pi;",
-$isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
+$isd3:true}}],["","",,V,{
 "^":"",
 F1:{
-"^":"V44;qC,i6=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V43;qC,i6=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gzj:function(a){return a.qC},
 szj:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
 Es:function(a){var z,y,x
@@ -13253,29 +13446,29 @@
 a.i6=z}else{z=H.VM([],[G.OS])
 y=Q.ch(null,D.Mk)
 x=new G.nD(new G.ut("targetManager"),Q.ch(null,null),null,null,null,null)
-x.XA()
+x.Ff()
 y=new G.mL(z,null,new G.ng("/vm",null,null,null,null,null),null,x,null,a,null,y,null,null)
 y.Ty(a)
 a.i6=y}},
-static:{fv:function(a){var z,y
+static:{Lu:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.qC=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.YpE.ZL(a)
 C.YpE.XI(a)
 return a}}},
-V44:{
+V43:{
 "^":"uL+Pi;",
-$isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
+$isd3:true}}],["","",,Z,{
 "^":"",
 uL:{
-"^":"Xfs;tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"Xfs;tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gi6:function(a){return $.Kh},
 gKw:function(a){return J.pP(this.gi6(a).Ef)},
 Es:function(a){A.zs.prototype.Es.call(this,a)
@@ -13293,7 +13486,7 @@
 if(a.tB==null)return
 z=a.kR
 if(z!=null)z.ed()
-a.kR=P.rT(a.tB,this.gwZ(a))},
+a.kR=P.cH(a.tB,this.gwZ(a))},
 Q4:function(a){var z=a.kR
 if(z!=null)z.ed()
 a.kR=null},
@@ -13301,31 +13494,31 @@
 this.yY(a)
 z=a.tB
 if(z==null){this.Q4(a)
-return}a.kR=P.rT(z,this.gwZ(a))},"$0","gwZ",0,0,17],
-cD:[function(a,b,c,d){this.gi6(a).Z6.WV(b,c,d)},"$3","gRh",6,0,162,143,102,103],
-If:[function(a,b){this.gi6(a).Z6
-return"#"+H.d(b)},"$1","gn0",2,0,163,164],
-a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,165,166],
+return}a.kR=P.cH(z,this.gwZ(a))},"$0","gwZ",0,0,17],
+jN:[function(a,b,c,d){this.gi6(a).Z6.Cz(b,c,d)},"$3","gRh",6,0,165,85,104,105],
+Gxe:[function(a,b){this.gi6(a).Z6
+return"#"+H.d(b)},"$1","gn0",2,0,166,167],
+a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,168,169],
 Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,14,15],
-B3:[function(a,b){return H.BU(b,null,null)},"$1","gXr",2,0,133,20],
-uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,167,168],
-MI:[function(a,b){return J.xC(b,"Error")},"$1","gc9",2,0,167,168],
+Kq:[function(a,b){return H.BU(b,null,null)},"$1","gXr",2,0,136,20],
+z4:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,170,171],
+MI:[function(a,b){return J.xC(b,"Error")},"$1","gc9",2,0,170,171],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,167,168],
-RU:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,167,168],
-KJa:[function(a,b){return J.xC(b,"String")},"$1","gO0",2,0,167,168],
-wm:[function(a,b){return J.xC(b,"Instance")},"$1","gnD",2,0,167,168],
-JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,167,168],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,170,171],
+RU:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,170,171],
+ff:[function(a,b){return J.xC(b,"String")},"$1","gO0",2,0,170,171],
+wm:[function(a,b){return J.xC(b,"Instance")},"$1","gnD",2,0,170,171],
+JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,170,171],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,167,168],
-tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,167,168],
-Dz:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,167,168],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,170,171],
+tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,170,171],
+Dz:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,170,171],
 static:{EE:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -13334,12 +13527,12 @@
 return a}}},
 Xfs:{
 "^":"xc+Pi;",
-$isd3:true}}],["observe.src.bindable","package:observe/src/bindable.dart",,A,{
+$isd3:true}}],["","",,A,{
 "^":"",
 OC:{
 "^":"a;",
 sP:function(a,b){},
-$isOC:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+$isOC:true}}],["","",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -13347,9 +13540,9 @@
 if(z==null){z=this.gqw(a)
 z=P.bK(this.gym(a),z,!0,null)
 a.AP=z}z.toString
-return H.VM(new P.Ik(z),[H.Oq(z,0)])},
-k0:[function(a){},"$0","gqw",0,0,17],
-Yd:[function(a){a.AP=null},"$0","gym",0,0,17],
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
+Tr:[function(a){},"$0","gqw",0,0,17],
+NB:[function(a){a.AP=null},"$0","gym",0,0,17],
 HC:[function(a){var z,y,x
 z=a.fn
 a.fn=null
@@ -13357,7 +13550,7 @@
 x=H.VM(new P.Yp(z),[T.yj])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,120],
+return!0}return!1},"$0","gDx",0,0,123],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
@@ -13367,7 +13560,7 @@
 nq:function(a,b){if(!this.gnz(a))return
 if(a.fn==null){a.fn=[]
 P.rb(this.gDx(a))}a.fn.push(b)},
-$isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
+$isd3:true}}],["","",,T,{
 "^":"",
 yj:{
 "^":"a;",
@@ -13375,7 +13568,7 @@
 qI:{
 "^":"yj;WA>,oc>,jL,zZ",
 bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gAY",0,0,71],
-$isqI:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
+$isqI:true}}],["","",,O,{
 "^":"",
 N0:function(){var z,y,x,w,v,u,t,s,r,q
 if($.Td)return
@@ -13395,7 +13588,7 @@
 v=!0}$.Oo.push(t)}}}while(z<1000&&v)
 if(w&&v){w=$.S5()
 w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(s=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]);s.G();){r=s.lo
+for(s=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);s.G();){r=s.lo
 q=J.U6(r)
 w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.ax=$.Oo.length
 $.Td=!1},
@@ -13404,7 +13597,7 @@
 z=new O.YC(z)
 return new P.yQ(null,null,null,null,new O.zI(z),new O.hw(z),null,null,null,null,null,null)},
 YC:{
-"^":"TpZ:169;a",
+"^":"TpZ:172;a",
 $2:function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
@@ -13426,7 +13619,7 @@
 return this.f.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 hw:{
-"^":"TpZ:170;UI",
+"^":"TpZ:173;UI",
 $4:[function(a,b,c,d){if(d==null)return d
 return new O.iu(this.UI,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
 $isEH:true},
@@ -13434,7 +13627,7 @@
 "^":"TpZ:12;bK,Gq,Rm,w3",
 $1:[function(a){this.bK.$2(this.Gq,this.Rm)
 return this.w3.$1(a)},"$1",null,2,0,null,67,"call"],
-$isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
+$isEH:true}}],["","",,G,{
 "^":"",
 B5:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=f-e+1
@@ -13577,7 +13770,7 @@
 z=J.RE(b)
 y=z.gWA(b)
 z=z.gvH(b)
-x=J.qA(b.gem())
+x=J.Nd(b.gem())
 w=b.gNg()
 if(w==null)w=0
 v=new P.Yp(x)
@@ -13605,7 +13798,7 @@
 z=z.Mu(z,0,J.Hn(q.Ft,u.Ft))
 o.toString
 if(typeof o!=="object"||o===null||!!o.fixed$length)H.vh(P.f("insertAll"))
-H.IC(o,0,z)}if(J.z8(J.ew(u.Ft,u.VD.G4.length),J.ew(q.Ft,q.Ld))){z=u.VD
+H.IC(o,0,z)}if(J.xZ(J.ew(u.Ft,u.VD.G4.length),J.ew(q.Ft,q.Ld))){z=u.VD
 J.bj(o,z.Mu(z,J.Hn(J.ew(q.Ft,q.Ld),u.Ft),u.VD.G4.length))}u.em=o
 u.VD=q.VD
 if(J.u6(q.Ft,u.Ft))u.Ft=q.Ft
@@ -13617,12 +13810,12 @@
 t=!0}else t=!1}if(!t)a.push(u)},
 hs:function(a,b){var z,y
 z=H.VM([],[G.DA])
-for(y=H.VM(new H.a7(b,b.length,0,null),[H.Oq(b,0)]);y.G();)G.m1(z,y.lo)
+for(y=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);y.G();)G.m1(z,y.lo)
 return z},
 Qi:function(a,b){var z,y,x,w,v,u
 if(b.length<=1)return b
 z=[]
-for(y=G.hs(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]),x=a.ao;y.G();){w=y.lo
+for(y=G.hs(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=a.XH;y.G();){w=y.lo
 if(J.xC(w.gNg(),1)&&w.gRt().G4.length===1){v=w.gRt().G4
 if(0>=v.length)return H.e(v,0)
 v=v[0]
@@ -13653,12 +13846,12 @@
 if(c==null)c=0
 z=new P.Yp(d)
 z.$builtinTypeInfo=[null]
-return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
+return new G.DA(a,z,d,b,c)}}}}],["","",,K,{
 "^":"",
 nd:{
 "^":"a;"},
 vly:{
-"^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
+"^":"a;"}}],["","",,F,{
 "^":"",
 kM:[function(){return O.N0()},"$0","Jy",0,0,17],
 Wi:function(a,b,c,d){var z=J.RE(a)
@@ -13670,7 +13863,7 @@
 if(this.gR9(a)==null){z=this.gFW(a)
 this.sR9(a,P.bK(this.gkk(a),z,!0,null))}z=this.gR9(a)
 z.toString
-return H.VM(new P.Ik(z),[H.Oq(z,0)])},
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
 gnz:function(a){var z,y
 if(this.gR9(a)!=null){z=this.gR9(a)
 y=z.iE
@@ -13682,11 +13875,11 @@
 $.Oo=z}z.push(a)
 $.ax=$.ax+1
 y=P.L5(null,null,null,P.IN,P.a)
-for(z=this.gbx(a),z=$.mX().Me(0,z,new A.Wq(!0,!1,!0,C.AP,!1,!1,C.Cd,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){x=J.O6(z.lo)
+for(z=this.gbx(a),z=$.mX().Me(0,z,new A.Wq(!0,!1,!0,C.AP,!1,!1,C.Cd,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=J.O6(z.lo)
 w=$.cp().eA.t(0,x)
 if(w==null)H.vh(O.lA("getter \""+H.d(x)+"\" in "+this.bu(a)))
 y.u(0,x,w.$1(a))}this.sV2(a,y)},"$0","gFW",0,0,17],
-L5:[function(a){if(this.gV2(a)!=null)this.sV2(a,null)},"$0","gkk",0,0,17],
+B0:[function(a){if(this.gV2(a)!=null)this.sV2(a,null)},"$0","gkk",0,0,17],
 HC:function(a){var z,y
 z={}
 if(this.gV2(a)==null||!this.gnz(a))return!1
@@ -13715,23 +13908,23 @@
 x=v}else x=w
 x.push(H.VM(new T.qI(z,a,b,y),[null]))
 J.iy(z).u(0,a,y)}},
-$isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
+$isEH:true}}],["","",,A,{
 "^":"",
 xhq:{
 "^":"Pi;",
 gP:function(a){return this.ra},
 sP:function(a,b){this.ra=F.Wi(this,C.ls,this.ra,b)},
-bu:[function(a){return"#<"+H.d(new H.cu(H.wO(this),null))+" value: "+H.d(this.ra)+">"},"$0","gAY",0,0,71]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
+bu:[function(a){return"#<"+H.d(new H.cu(H.wO(this),null))+" value: "+H.d(this.ra)+">"},"$0","gAY",0,0,71]}}],["","",,Q,{
 "^":"",
 wn:{
-"^":"er;b3@,iT,ao,AP,fn",
-gQV:function(){var z=this.iT
+"^":"er;SE@,vZ,XH,AP,fn",
+gQV:function(){var z=this.vZ
 if(z==null){z=P.bK(new Q.xb(this),null,!0,null)
-this.iT=z}z.toString
-return H.VM(new P.Ik(z),[H.Oq(z,0)])},
-gB:function(a){return this.ao.length},
+this.vZ=z}z.toString
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
+gB:function(a){return this.XH.length},
 sB:function(a,b){var z,y,x,w,v
-z=this.ao
+z=this.XH
 y=z.length
 if(y===b)return
 this.ct(this,C.Wn,y,b)
@@ -13739,7 +13932,7 @@
 w=b===0
 this.ct(this,C.ai,x,w)
 this.ct(this,C.nZ,!x,!w)
-x=this.iT
+x=this.vZ
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x)if(b<y){if(b<0||b>z.length)H.vh(P.TE(b,0,z.length))
@@ -13752,24 +13945,24 @@
 x=x.br(0)
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,x,b,0))}else{v=[]
+this.tk(new G.DA(this,w,x,b,0))}else{v=[]
 x=new P.Yp(v)
 x.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,x,v,y,b-y))}C.Nm.sB(z,b)},
-t:function(a,b){var z=this.ao
+this.tk(new G.DA(this,x,v,y,b-y))}C.Nm.sB(z,b)},
+t:function(a,b){var z=this.XH
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 u:function(a,b,c){var z,y,x,w
-z=this.ao
+z=this.XH
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 y=z[b]
-x=this.iT
+x=this.vZ
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x){x=[y]
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
+this.tk(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
 z[b]=c},
 gl0:function(a){return P.lD.prototype.gl0.call(this,this)},
 gor:function(a){return P.lD.prototype.gor.call(this,this)},
@@ -13777,41 +13970,41 @@
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.iT
+z=this.vZ
 if(z!=null){x=z.iE
 z=x==null?z!=null:x!==z}else z=!1
-if(z&&y>0){z=this.ao
+if(z&&y>0){z=this.XH
 H.xF(z,b,y)
-this.iH(G.K6(this,b,y,H.c1(z,b,y,null).br(0)))}H.h8(this.ao,b,c)},
+this.tk(G.K6(this,b,y,H.c1(z,b,y,null).br(0)))}H.h8(this.XH,b,c)},
 h:function(a,b){var z,y,x,w
-z=this.ao
+z=this.XH
 y=z.length
-this.On(y,y+1)
-x=this.iT
+this.Dr(y,y+1)
+x=this.vZ
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
-if(x)this.iH(G.K6(this,y,1,null))
+if(x)this.tk(G.K6(this,y,1,null))
 C.Nm.h(z,b)},
 FV:function(a,b){var z,y,x,w
-z=this.ao
+z=this.XH
 y=z.length
 C.Nm.FV(z,b)
-this.On(y,z.length)
+this.Dr(y,z.length)
 x=z.length-y
-z=this.iT
+z=this.vZ
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&x>0)this.iH(G.K6(this,y,x,null))},
+if(z&&x>0)this.tk(G.K6(this,y,x,null))},
 Rz:function(a,b){var z,y
-for(z=this.ao,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.UZ(0,y,y+1)
+for(z=this.XH,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.UZ(0,y,y+1)
 return!0}return!1},
 UZ:function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
-if(!z||b>this.ao.length)H.vh(P.TE(b,0,this.gB(this)))
+if(!z||b>this.XH.length)H.vh(P.TE(b,0,this.gB(this)))
 y=c>=b
-if(!y||c>this.ao.length)H.vh(P.TE(c,b,this.gB(this)))
+if(!y||c>this.XH.length)H.vh(P.TE(c,b,this.gB(this)))
 x=c-b
-w=this.ao
+w=this.XH
 v=w.length
 u=v-x
 this.ct(this,C.Wn,v,u)
@@ -13819,7 +14012,7 @@
 u=u===0
 this.ct(this,C.ai,t,u)
 this.ct(this,C.nZ,!t,!u)
-u=this.iT
+u=this.vZ
 if(u!=null){t=u.iE
 u=t==null?u!=null:t!==u}else u=!1
 if(u&&x>0){if(!z||b>w.length)H.vh(P.TE(b,0,w.length))
@@ -13832,64 +14025,64 @@
 z=z.br(0)
 y=new P.Yp(z)
 y.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
+this.tk(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
 oF:function(a,b,c){var z,y,x,w
-if(b<0||b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
+if(b<0||b>this.XH.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.ao
+z=this.XH
 x=z.length
 C.Nm.sB(z,x+y)
 w=z.length
 H.qG(z,b+y,w,this,b)
 H.h8(z,b,c)
-this.On(x,z.length)
-z=this.iT
+this.Dr(x,z.length)
+z=this.vZ
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&y>0)this.iH(G.K6(this,b,y,null))},
+if(z&&y>0)this.tk(G.K6(this,b,y,null))},
 xe:function(a,b,c){var z,y,x
-if(b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.ao
+if(b>this.XH.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.XH
 y=z.length
 if(b===y){this.h(0,c)
 return}C.Nm.sB(z,y+1)
 y=z.length
 H.qG(z,b+1,y,this,b)
 y=z.length
-this.On(y-1,y)
-y=this.iT
+this.Dr(y-1,y)
+y=this.vZ
 if(y!=null){x=y.iE
 y=x==null?y!=null:x!==y}else y=!1
-if(y)this.iH(G.K6(this,b,1,null))
+if(y)this.tk(G.K6(this,b,1,null))
 if(b>=z.length)return H.e(z,b)
 z[b]=c},
-iH:function(a){var z,y
-z=this.iT
+tk:function(a){var z,y
+z=this.vZ
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
-if(this.b3==null){this.b3=[]
-P.rb(this.gL6())}this.b3.push(a)},
-On:function(a,b){var z,y
+if(this.SE==null){this.SE=[]
+P.rb(this.gL6())}this.SE.push(a)},
+Dr:function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
 y=b===0
 this.ct(this,C.ai,z,y)
 this.ct(this,C.nZ,!z,!y)},
 Ju:[function(){var z,y,x
-z=this.b3
+z=this.SE
 if(z==null)return!1
 y=G.Qi(this,z)
-this.b3=null
-z=this.iT
+this.SE=null
+z=this.vZ
 if(z!=null){x=z.iE
 x=x==null?z!=null:x!==z}else x=!1
 if(x&&y.length!==0){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,120],
+return!0}return!1},"$0","gL6",0,0,123],
 $iswn:true,
 static:{ch:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])},Y5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -13927,8 +14120,8 @@
 $isd3:true},
 xb:{
 "^":"TpZ:74;a",
-$0:function(){this.a.iT=null},
-$isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
+$0:function(){this.a.vZ=null},
+$isEH:true}}],["","",,V,{
 "^":"",
 ya:{
 "^":"yj;G3>,jL,zZ,aC,w5",
@@ -14000,37 +14193,37 @@
 "^":"TpZ;a",
 $2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,77,20,"call"],
 $isEH:true,
-$signature:function(){return H.IGs(function(a,b){return{func:"lb",args:[a,b]}},this.a,"qC")}},
+$signature:function(){return H.IGs(function(a,b){return{func:"VfV",args:[a,b]}},this.a,"qC")}},
 Lo:{
 "^":"TpZ:79;a",
 $2:function(a,b){var z=this.a
 z.nq(z,H.VM(new V.ya(a,b,null,!1,!0),[null,null]))},
-$isEH:true}}],["observe.src.observer_transform","package:observe/src/observer_transform.dart",,Y,{
+$isEH:true}}],["","",,Y,{
 "^":"",
 Qw:{
-"^":"OC;BS,Or,HM,cS,h5",
-Jy:function(a){return this.Or.$1(a)},
-Kv:function(a){return this.cS.$1(a)},
+"^":"OC;Tw,Hc,pJ,nn,ic",
+HF:function(a){return this.Hc.$1(a)},
+Yc:function(a){return this.nn.$1(a)},
 TR:function(a,b){var z
-this.cS=b
-z=this.Jy(J.mu(this.BS,this.gjr()))
-this.h5=z
+this.nn=b
+z=this.HF(J.mu(this.Tw,this.gRV()))
+this.ic=z
 return z},
-EJ:[function(a){var z=this.Jy(a)
-if(J.xC(z,this.h5))return
-this.h5=z
-return this.Kv(z)},"$1","gjr",2,0,12,60],
-xO:function(a){var z=this.BS
+ab:[function(a){var z=this.HF(a)
+if(J.xC(z,this.ic))return
+this.ic=z
+return this.Yc(z)},"$1","gRV",2,0,12,60],
+xO:function(a){var z=this.Tw
 if(z!=null)J.yd(z)
-this.BS=null
-this.Or=null
-this.HM=null
-this.cS=null
-this.h5=null},
-gP:function(a){var z=this.Jy(J.Vm(this.BS))
-this.h5=z
+this.Tw=null
+this.Hc=null
+this.pJ=null
+this.nn=null
+this.ic=null},
+gP:function(a){var z=this.HF(J.Vm(this.Tw))
+this.ic=z
 return z},
-sP:function(a,b){J.ta(this.BS,b)}}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
+sP:function(a,b){J.ta(this.Tw,b)}}}],["","",,L,{
 "^":"",
 Hj:function(a,b){var z,y,x,w,v
 if(a==null)return
@@ -14048,7 +14241,7 @@
 z=x.$1(z)
 return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.Lm(a)
 v=$.mX().F1(z,C.OV)
-if(!(v!=null&&v.fY===C.hU&&!v.Fo))throw w}else throw w}}z=$.Nd()
+if(!(v!=null&&v.fY===C.hU&&!v.Fo))throw w}else throw w}}z=$.YLt()
 if(z.mL(C.D8))z.kS("can't get "+H.d(b)+" in "+H.d(a))
 return},
 EX:function(a,b,c){var z,y,x
@@ -14063,7 +14256,7 @@
 if(z){J.kW(a,$.Mg().ep.t(0,b),c)
 return!0}try{$.cp().Cq(a,b,c)
 return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.Lm(a)
-if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.Nd()
+if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.YLt()
 if(z.mL(C.D8))z.kS("can't set "+H.d(b)+" in "+H.d(a))
 return!1},
 cB:function(a){a=J.rr(a)
@@ -14072,13 +14265,13 @@
 if(a[0]===".")return!1
 return $.B8().zD(a)},
 WR:{
-"^":"AR;HS,XF,xE,cX,GX,vA,Wf",
+"^":"lg;HS,XF,xE,cX,GX,D2,Wf",
 gqc:function(){return this.HS==null},
 sP:function(a,b){var z=this.HS
 if(z!=null)z.rL(this.XF,b)
 this.hQ(!0)},
 gIn:function(){return 2},
-TR:function(a,b){return L.AR.prototype.TR.call(this,this,b)},
+TR:function(a,b){return L.lg.prototype.TR.call(this,this,b)},
 NJ:function(a){this.xE=L.SE(this,this.XF)
 this.hQ(!0)},
 kH:function(){this.Wf=null
@@ -14094,7 +14287,7 @@
 return!0},
 tF:function(){return this.hQ(!1)},
 $isOC:true},
-Tv:{
+Zl:{
 "^":"a;OK",
 gB:function(a){return this.OK.length},
 gl0:function(a){return this.OK.length===0},
@@ -14104,7 +14297,7 @@
 n:function(a,b){var z,y,x,w,v
 if(b==null)return!1
 if(this===b)return!0
-if(!J.x(b).$isTv)return!1
+if(!J.x(b).$isZl)return!1
 if(this.gPu()!==b.gPu())return!1
 z=this.OK
 y=z.length
@@ -14125,7 +14318,7 @@
 return 536870911&x+((16383&x)<<15>>>0)},
 Tl:function(a){var z,y
 if(!this.gPu())return
-for(z=this.OK,z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){y=z.lo
+for(z=this.OK,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 if(a==null)return
 a=L.Hj(a,y)}return a},
 rL:function(a,b){var z,y,x
@@ -14145,28 +14338,28 @@
 w=x+1
 if(x>=z.length)return H.e(z,x)
 a=L.Hj(a,z[x])}},
-$isTv:true,
+$isZl:true,
 static:{hk:function(a){var z,y,x,w,v,u,t,s
 if(!!J.x(a).$isWO){z=P.F(a,!1,null)
 y=new H.a7(z,z.length,0,null)
-y.$builtinTypeInfo=[H.Oq(z,0)]
+y.$builtinTypeInfo=[H.u3(z,0)]
 for(;y.G();){x=y.lo
-if((typeof x!=="number"||Math.floor(x)!==x)&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints and Symbols"))}return new L.Tv(z)}if(a==null)a=""
+if((typeof x!=="number"||Math.floor(x)!==x)&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints and Symbols"))}return new L.Zl(z)}if(a==null)a=""
 w=$.hW().t(0,a)
 if(w!=null)return w
 if(!L.cB(a))return $.Js()
 v=[]
 y=J.rr(a).split(".")
 u=new H.a7(y,y.length,0,null)
-u.$builtinTypeInfo=[H.Oq(y,0)]
+u.$builtinTypeInfo=[H.u3(y,0)]
 for(;u.G();){x=u.lo
 if(J.xC(x,""))continue
 t=H.BU(x,10,new L.oq())
-v.push(t!=null?t:$.Mg().Nz.t(0,x))}w=new L.Tv(C.Nm.tt(v,!1))
+v.push(t!=null?t:$.Mg().Nz.t(0,x))}w=new L.Zl(C.Nm.tt(v,!1))
 y=$.hW()
 if(y.X5>=100){y.toString
 u=new P.i5(y)
-u.$builtinTypeInfo=[H.Oq(y,0)]
+u.$builtinTypeInfo=[H.u3(y,0)]
 s=u.gA(u)
 if(!s.G())H.vh(H.DU())
 y.Rz(0,s.gl())}y.u(0,a,w)
@@ -14177,10 +14370,10 @@
 $isEH:true},
 f7:{
 "^":"TpZ:12;",
-$1:[function(a){return!!J.x(a).$isIN?$.Mg().ep.t(0,a):a},"$1",null,2,0,null,154,"call"],
+$1:[function(a){return!!J.x(a).$isIN?$.Mg().ep.t(0,a):a},"$1",null,2,0,null,157,"call"],
 $isEH:true},
 TV:{
-"^":"Tv;OK",
+"^":"Zl;OK",
 gPu:function(){return!1},
 static:{"^":"qa"}},
 DOe:{
@@ -14188,14 +14381,14 @@
 $0:function(){return new H.VR("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},
 $isEH:true},
 ww:{
-"^":"AR;xE,TV,cX,GX,vA,Wf",
-gqc:function(){return this.TV==null},
+"^":"lg;xE,VZ,cX,GX,D2,Wf",
+gqc:function(){return this.VZ==null},
 gIn:function(){return 3},
-TR:function(a,b){return L.AR.prototype.TR.call(this,this,b)},
+TR:function(a,b){return L.lg.prototype.TR.call(this,this,b)},
 NJ:function(a){var z,y,x,w
 this.hQ(!0)
-for(z=this.TV,y=z.length,x=0;x<y;x+=2){w=z[x]
-if(w!==C.dV){z=$.xG
+for(z=this.VZ,y=z.length,x=0;x<y;x+=2){w=z[x]
+if(w!==C.aZ){z=$.xG
 if(z!=null){y=z.kTd
 y=y==null?w!=null:y!==w}else y=!0
 if(y){z=new L.zG(w,P.GV(null,null,null,null),null,null,!1)
@@ -14205,40 +14398,40 @@
 break}}},
 kH:function(){var z,y,x,w
 this.Wf=null
-for(z=0;y=this.TV,x=y.length,z<x;z+=2)if(y[z]===C.dV){w=z+1
+for(z=0;y=this.VZ,x=y.length,z<x;z+=2)if(y[z]===C.aZ){w=z+1
 if(w>=x)return H.e(y,w)
-J.yd(y[w])}this.TV=null},
+J.yd(y[w])}this.VZ=null},
 yN:function(a,b){var z
-if(this.GX!=null||this.TV==null)throw H.b(P.w("Cannot add paths once started."))
-if(!J.x(b).$isTv)b=L.hk(b)
-z=this.TV
+if(this.GX!=null||this.VZ==null)throw H.b(P.w("Cannot add paths once started."))
+if(!J.x(b).$isZl)b=L.hk(b)
+z=this.VZ
 z.push(a)
 z.push(b)},
-U2:function(a){return this.yN(a,null)},
+ti:function(a){return this.yN(a,null)},
 Qs:function(a){var z
-if(this.GX!=null||this.TV==null)throw H.b(P.w("Cannot add observers once started."))
+if(this.GX!=null||this.VZ==null)throw H.b(P.w("Cannot add observers once started."))
 J.mu(a,new L.Zu(this))
-z=this.TV
-z.push(C.dV)
+z=this.VZ
+z.push(C.aZ)
 z.push(a)},
 nf:function(a){var z,y,x,w,v
-for(z=0;y=this.TV,x=y.length,z<x;z+=2){w=y[z]
-if(w!==C.dV){v=z+1
+for(z=0;y=this.VZ,x=y.length,z<x;z+=2){w=y[z]
+if(w!==C.aZ){v=z+1
 if(v>=x)return H.e(y,v)
-H.Go(y[v],"$isTv").VV(w,a)}}},
+H.Go(y[v],"$isZl").VV(w,a)}}},
 hQ:function(a){var z,y,x,w,v,u,t,s,r
-J.wg(this.Wf,C.jn.cU(this.TV.length,2))
-for(z=!1,y=null,x=0;w=this.TV,v=w.length,x<v;x+=2){u=x+1
+J.wg(this.Wf,C.jn.cU(this.VZ.length,2))
+for(z=!1,y=null,x=0;w=this.VZ,v=w.length,x<v;x+=2){u=x+1
 if(u>=v)return H.e(w,u)
 t=w[u]
 s=w[x]
-if(s===C.dV){H.Go(t,"$isOC")
-r=t.gP(t)}else r=H.Go(t,"$isTv").Tl(s)
+if(s===C.aZ){H.Go(t,"$isOC")
+r=t.gP(t)}else r=H.Go(t,"$isZl").Tl(s)
 if(a){J.kW(this.Wf,C.jn.cU(x,2),r)
 continue}w=this.Wf
 v=C.jn.cU(x,2)
 if(J.xC(r,J.UQ(w,v)))continue
-w=this.vA
+w=this.D2
 if(typeof w!=="number")return w.F()
 if(w>=2){if(y==null)y=P.L5(null,null,null,null,null)
 y.u(0,v,J.UQ(this.Wf,v))}J.kW(this.Wf,v,r)
@@ -14254,17 +14447,17 @@
 $isEH:true},
 iNc:{
 "^":"a;"},
-AR:{
+lg:{
 "^":"OC;cX<",
-CC:function(){return this.GX.$0()},
+c8:function(){return this.GX.$0()},
 K0:function(a){return this.GX.$1(a)},
-cF:function(a,b){return this.GX.$2(a,b)},
-Mm:function(a,b,c){return this.GX.$3(a,b,c)},
+rF:function(a,b){return this.GX.$2(a,b)},
+uC:function(a,b,c){return this.GX.$3(a,b,c)},
 ga8:function(){return this.GX!=null},
 TR:function(a,b){if(this.GX!=null||this.gqc())throw H.b(P.w("Observer has already been opened."))
-if(X.fy(b)>this.gIn())throw H.b(P.u("callback should take "+this.gIn()+" or fewer arguments"))
+if(X.Cz(b)>this.gIn())throw H.b(P.u("callback should take "+this.gIn()+" or fewer arguments"))
 this.GX=b
-this.vA=P.J(this.gIn(),X.RI(b))
+this.D2=P.J(this.gIn(),X.RI(b))
 this.NJ(0)
 return this.Wf},
 gP:function(a){this.hQ(!0)
@@ -14276,13 +14469,13 @@
 SG:function(){var z=0
 while(!0){if(!(z<1000&&this.tF()))break;++z}return z>0},
 Aw:function(a,b,c){var z,y,x,w
-try{switch(this.vA){case 0:this.CC()
+try{switch(this.D2){case 0:this.c8()
 break
 case 1:this.K0(a)
 break
-case 2:this.cF(a,b)
+case 2:this.rF(a,b)
 break
-case 3:this.Mm(a,b,c)
+case 3:this.uC(a,b,c)
 break}}catch(x){w=H.Ru(x)
 z=w
 y=new H.oP(x,null)
@@ -14294,7 +14487,7 @@
 b.nf(this.gTT(this))},
 dt:[function(a,b){var z=J.x(b)
 if(!!z.$iswn)this.wq(b.gQV())
-if(!!z.$isd3)this.wq(z.gqh(b))},"$1","gTT",2,0,171,92],
+if(!!z.$isd3)this.wq(z.gqh(b))},"$1","gTT",2,0,174,94],
 wq:function(a){var z,y
 if(this.rS==null)this.rS=P.YM(null,null,null,null,null)
 z=this.HN
@@ -14307,37 +14500,37 @@
 if(z==null)z=P.YM(null,null,null,null,null)
 this.HN=this.rS
 this.rS=z
-for(y=this.JD,y=H.VM(new P.ro(y),[H.Oq(y,0),H.Oq(y,1)]),x=y.Fb,w=H.Oq(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.oz]),x.qT,x.bb,null),[H.Oq(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
-if(v.ga8())v.nf(this.gTT(this))}for(y=this.HN,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Oq(y,0),H.Oq(y,1)]);y.G();)y.lo.ed()
+for(y=this.JD,y=H.VM(new P.ro(y),[H.u3(y,0),H.u3(y,1)]),x=y.Fb,w=H.u3(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.oz]),x.qT,x.bb,null),[H.u3(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
+if(v.ga8())v.nf(this.gTT(this))}for(y=this.HN,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.u3(y,0),H.u3(y,1)]);y.G();)y.lo.ed()
 this.HN=null},"$0","gTh",0,0,17],
 F5:[function(a){var z,y
-for(z=this.JD,z=H.VM(new P.ro(z),[H.Oq(z,0),H.Oq(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){y=z.lo
+for(z=this.JD,z=H.VM(new P.ro(z),[H.u3(z,0),H.u3(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 if(y.ga8())y.tF()}this.op=!0
-P.rb(this.gTh(this))},"$1","gCP",2,0,19,172],
+P.rb(this.gTh(this))},"$1","gCP",2,0,19,175],
 static:{"^":"xG",SE:function(a,b){var z,y
 z=$.xG
 if(z!=null){y=z.kTd
 y=y==null?b!=null:y!==b}else y=!0
 if(y){z=new L.zG(b,P.GV(null,null,null,null),null,null,!1)
 $.xG=z}z.JD.u(0,a.cX,a)
-a.nf(z.gTT(z))}}}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
+a.nf(z.gTT(z))}}}}],["","",,R,{
 "^":"",
 tB:[function(a){var z,y,x
 z=J.x(a)
 if(!!z.$isd3)return a
 if(!!z.$isZ0){y=V.AB(a,null,null)
-z.aN(a,new R.yx(y))
+z.aN(a,new R.Qe(y))
 return y}if(!!z.$isQV){z=z.ez(a,R.Ft())
 x=Q.ch(null,null)
 x.FV(0,z)
 return x}return a},"$1","Ft",2,0,12,20],
-yx:{
+Qe:{
 "^":"TpZ:79;a",
-$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,130,66,"call"],
-$isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
+$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,133,66,"call"],
+$isEH:true}}],["","",,A,{
 "^":"",
-YG:function(a,b,c){if(a==null||$.AM()==null)return
-$.AM().V7("shimStyling",[a,b,c])},
+Eo:function(a,b,c){if(a==null||$.lx()==null)return
+$.lx().V7("shimStyling",[a,b,c])},
 q3:function(a){var z,y,x,w,v
 if(a==null)return""
 if($.UG)return""
@@ -14351,7 +14544,7 @@
 return w}catch(v){w=H.Ru(v)
 if(!!J.x(w).$isBK){y=w
 x=new H.oP(v,null)
-$.QJ().Ny("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
+$.QJ().J4("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
 return""}else throw v}},
 M8:[function(a){var z,y
 z=$.Mg().ep.t(0,a)
@@ -14372,7 +14565,7 @@
 if(b===document.head){w=W.vD(document.head.querySelectorAll("style[element]"),null)
 if(w.gor(w))x=J.QP(C.t5.grZ(w.Sn))}b.insertBefore(z,x)},
 YK:function(){if($.UG){A.X1($.M6,!0)
-return $.X3}var z=$.X3.qp(O.Ht())
+return $.X3}var z=$.X3.iT(O.Ht())
 z.Gr(new A.mS())
 return z},
 X1:function(a,b){var z,y
@@ -14386,7 +14579,7 @@
 z.setAttribute("name","auto-binding-dart")
 z.setAttribute("extends","template")
 J.UQ($.XX(),"init").qP([],z)
-for(y=H.VM(new H.a7(a,78,0,null),[H.Oq(a,0)]);y.G();)y.lo.$0()},
+for(y=H.VM(new H.a7(a,79,0,null),[H.u3(a,0)]);y.G();)y.lo.$0()},
 JP:function(){var z,y,x,w
 z=$.Si()
 if(J.UQ(z,"Platform")==null)throw H.b(P.w("platform.js, dart_support.js must be loaded at the top of your application, before any other scripts or HTML imports that use polymer. Putting these two script tags at the top of your <head> element should address this issue: <script src=\"packages/web_components/platform.js\"></script> and  <script src=\"packages/web_components/dart_support.js\"></script>."))
@@ -14398,10 +14591,10 @@
 if(w==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
 J.kW($.XX(),"register",P.mt(new A.k2(x,w)))},
 XP:{
-"^":"a;FL>,t5>,Xj<,oc>,Q7<,NF<,cK>,kK<,Bj<,Qk,q5,Uj>,PS<,Ve,t4",
+"^":"a;FL>,t5>,Xj<,oc>,Q7<,NF<,cK>,kK<,Bj<,Qk,q5,Uj>,PS<,kX,t4",
 gZf:function(){var z,y
 z=J.Eh(this.FL,"template")
-if(z!=null)y=J.NQ(!!J.x(z).$isvy?z:M.SB(z))
+if(z!=null)y=J.Xu(!!J.x(z).$isvy?z:M.SB(z))
 else y=null
 return y},
 Ba:function(a){var z,y,x
@@ -14421,7 +14614,7 @@
 this.Bj=y}}z=this.t5
 this.pI(z)
 x=J.Vs(this.FL).MW.getAttribute("attributes")
-if(x!=null)for(y=C.xB.Fr(x,$.wm()),y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
+if(x!=null)for(y=C.xB.Fr(x,$.wm()),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
 if(v==="")continue
 u=$.Mg().Nz.t(0,v)
 t=L.hk([u])
@@ -14435,7 +14628,7 @@
 if(s==null){s=P.Fl(null,null)
 this.Q7=s}s.u(0,t,r)}},
 pI:function(a){var z,y,x,w
-for(z=$.mX().Me(0,a,C.aj),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){y=z.lo
+for(z=$.mX().Me(0,a,C.aj),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 x=J.RE(y)
 if(x.gV5(y)===!0)continue
 w=this.Q7
@@ -14443,7 +14636,7 @@
 this.Q7=w}w.u(0,L.hk([x.goc(y)]),y)
 w=new H.U5(y.gDv(),new A.Zd())
 w.$builtinTypeInfo=[null]
-if(w.ou(0,new A.Da())){w=this.Bj
+if(w.Vr(0,new A.Da())){w=this.Bj
 if(w==null){w=P.Ls(null,null,null,null)
 this.Bj=w}x=x.goc(y)
 w.h(0,$.Mg().ep.t(0,x))}}},
@@ -14456,22 +14649,22 @@
 W3:function(a){J.Vs(this.FL).aN(0,new A.BO(a))},
 Mi:function(){var z=this.Bg("link[rel=stylesheet]")
 this.Qk=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.Mp(z.lo)},
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.lo)},
 f6:function(){var z=this.Bg("style[polymer-scope]")
 this.q5=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.Mp(z.lo)},
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.lo)},
 OL:function(){var z,y,x,w,v,u,t,s
 z=this.Qk
 z.toString
 y=H.VM(new H.U5(z,new A.ZG()),[null])
 x=this.gZf()
 if(x!=null){w=P.p9("")
-for(z=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.Oq(y,0)]),v=z.OI;z.G();){u=A.q3(v.gl())
+for(z=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.u3(y,0)]),v=z.OI;z.G();){u=A.q3(v.gl())
 t=w.vM+=typeof u==="string"?u:H.d(u)
 w.vM=t+"\n"}if(w.vM.length>0){s=J.Do(this.FL).createElement("style",null)
 J.t3(s,H.d(w))
 z=J.RE(x)
-z.mK(x,s,z.gPZ(x))}}},
+z.mK(x,s,z.glb(x))}}},
 oP:function(a,b){var z,y,x
 z=J.Vj(this.FL,a)
 y=z.br(z)
@@ -14482,9 +14675,9 @@
 kO:function(a){var z,y,x,w,v,u
 z=P.p9("")
 y=new A.Vi("[polymer-scope="+a+"]")
-for(x=this.Qk,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.vG(J.mY(x.l6),x.T6),[H.Oq(x,0)]),w=x.OI;x.G();){v=A.q3(w.gl())
+for(x=this.Qk,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.vG(J.mY(x.l6),x.T6),[H.u3(x,0)]),w=x.OI;x.G();){v=A.q3(w.gl())
 u=z.vM+=typeof v==="string"?v:H.d(v)
-z.vM=u+"\n\n"}for(x=this.q5,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.Oq(y,0)]),x=y.OI;y.G();){v=J.dY(x.gl())
+z.vM=u+"\n\n"}for(x=this.q5,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.u3(y,0)]),x=y.OI;y.G();){v=J.dY(x.gl())
 w=z.vM+=typeof v==="string"?v:H.d(v)
 z.vM=w+"\n\n"}return z.vM},
 J3:function(a,b){var z
@@ -14494,7 +14687,7 @@
 z.setAttribute("element",H.d(this.oc)+"-"+b)
 return z},
 rH:function(){var z,y,x,w,v
-for(z=$.Sz(),z=$.mX().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){y=z.lo
+for(z=$.Sz(),z=$.mX().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
 if(this.cK==null)this.cK=P.YM(null,null,null,null,null)
 x=J.RE(y)
 w=x.goc(y)
@@ -14503,9 +14696,9 @@
 v=w.Nj(v,0,J.Hn(w.gB(v),7))
 this.cK.u(0,L.hk(v),[x.goc(y)])}},
 I9:function(){var z,y,x
-for(z=$.mX().Me(0,this.t5,C.Tb),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){y=z.lo.gDv()
+for(z=$.mX().Me(0,this.t5,C.Tb),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo.gDv()
 x=new H.a7(y,y.length,0,null)
-x.$builtinTypeInfo=[H.Oq(y,0)]
+x.$builtinTypeInfo=[H.u3(y,0)]
 for(;x.G();)continue}},
 Yl:function(a){var z=P.L5(null,null,null,P.qU,null)
 a.aN(0,new A.Tj(z))
@@ -14528,7 +14721,7 @@
 "^":"TpZ:79;a",
 $2:function(a,b){var z,y,x
 z=J.rY(a)
-if(z.nC(a,"on-")){y=J.U6(b).kJ(b,"{{")
+if(z.nC(a,"on-")){y=J.U6(b).Mw(b,"{{")
 x=C.xB.cn(b,"}}")
 if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},
 $isEH:true},
@@ -14540,16 +14733,16 @@
 "^":"TpZ:12;a",
 $1:function(a){return J.Uv(a,this.a)},
 $isEH:true},
-XUG:{
+eM:{
 "^":"TpZ:74;",
 $0:function(){return[]},
 $isEH:true},
 Tj:{
-"^":"TpZ:173;a",
+"^":"TpZ:176;a",
 $2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
 Li:{
-"^":"BG9;Mn,cJ",
+"^":"BG9;Mn,DP",
 US:function(a,b,c){if(J.co(b,"on-"))return this.CZ(a,b,c)
 return this.Mn.US(a,b,c)}},
 BG9:{
@@ -14557,7 +14750,7 @@
 d23:{
 "^":"a;",
 XB:function(a){var z
-for(;z=J.RE(a),z.gBy(a)!=null;){if(!!z.$iszs&&J.UQ(a.SD,"eventController")!=null)return J.UQ(z.gXG(a),"eventController")
+for(;z=J.RE(a),z.gBy(a)!=null;){if(!!z.$iszs&&J.UQ(a.SD,"eventController")!=null)return J.UQ(z.gV6(a),"eventController")
 a=z.gBy(a)}return!!z.$isI0?a.host:null},
 Y2:function(a,b,c){var z={}
 z.a=a
@@ -14579,22 +14772,22 @@
 if(y==null||!J.x(y).$iszs){x=this.b.XB(this.c)
 z.a=x
 y=x}if(!!J.x(y).$iszs){y=J.x(a)
-if(!!y.$isRb){w=y.geyz(a)
+if(!!y.$isRb){w=y.gey(a)
 if(w==null)w=J.UQ(P.XY(a),"detail")}else w=null
 y=y.gSd(a)
 z=z.a
 J.bH(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 na:{
-"^":"TpZ:177;a,b,c",
+"^":"TpZ:180;a,b,c",
 $3:[function(a,b,c){var z,y,x,w
 z=this.c
 y=this.b.Y2(null,b,z)
 x=J.Ei(b).t(0,this.a.a)
-w=H.VM(new W.Ov(0,x.DK,x.Ph,W.aF(y),x.Sg),[H.Oq(x,0)])
+w=H.VM(new W.Ov(0,x.bi,x.Ph,W.aF(y),x.Sg),[H.u3(x,0)])
 w.Zz()
 if(c===!0)return
-return new A.d6(w,z)},"$3",null,6,0,null,174,175,176,"call"],
+return new A.d6(w,z)},"$3",null,6,0,null,177,178,179,"call"],
 $isEH:true},
 d6:{
 "^":"OC;Jq,ED",
@@ -14607,14 +14800,14 @@
 "^":"nd;vn<",
 $ishG:true},
 xc:{
-"^":"TR0;AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"TR0;AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 XI:function(a){this.Pa(a)},
 static:{G7:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -14622,7 +14815,7 @@
 C.Ki.XI(a)
 return a}}},
 re:{
-"^":"Bo+zs;XG:SD=",
+"^":"Bo+zs;V6:SD=",
 $iszs:true,
 $isvy:true,
 $isd3:true,
@@ -14633,7 +14826,7 @@
 "^":"re+Pi;",
 $isd3:true},
 zs:{
-"^":"a;XG:SD=",
+"^":"a;V6:SD=",
 gFL:function(a){return a.IX},
 gUj:function(a){return},
 gRT:function(a){var z,y
@@ -14659,12 +14852,12 @@
 z=a.Wz
 if(z!=null){y=this.gUc(a)
 z.toString
-L.AR.prototype.TR.call(J.x(z),z,y)}if(a.IX.gQ7()!=null)this.gqh(a).yI(this.gGi(a))
+L.lg.prototype.TR.call(J.x(z),z,y)}if(a.IX.gQ7()!=null)this.gqh(a).yI(this.gGi(a))
 this.Z2(a)
 this.fk(a)
 this.qb(a)},
-rf:function(a){if(a.q1)return
-a.q1=!0
+rf:function(a){if(a.Ap)return
+a.Ap=!0
 this.Oh(a,a.IX)
 this.gQg(a).Rz(0,"unresolved")
 this.e1(a)},
@@ -14672,7 +14865,7 @@
 Es:function(a){if(a.IX==null)throw H.b(P.w("polymerCreated was not called for custom element "+H.d(this.gRT(a))+", this should normally be done in the .created() if Polymer is used as a mixin."))
 this.oW(a)
 if(!a.oG){a.oG=!0
-this.rW(a,new A.bl(a))}},
+this.Gy(a,new A.bl(a))}},
 dQ:function(a){this.d9(a)},
 Oh:function(a,b){if(b!=null){this.Oh(a,b.gXj())
 this.aI(a,J.nq(b))}},
@@ -14688,9 +14881,9 @@
 z=this.er(a)
 y=this.gUj(a)
 x=!!J.x(b).$isvy?b:M.SB(b)
-w=J.MO(x,a,y==null&&J.fx(x)==null?J.du(a.IX):y)
+w=J.MO(x,a,y==null&&J.qy(x)==null?J.du(a.IX):y)
 v=$.vH().t(0,w)
-u=v!=null?v.gu2():v
+u=v!=null?v.gmD():v
 a.Cc.push(u)
 z.appendChild(w)
 this.lj(a,z)
@@ -14717,7 +14910,7 @@
 x=J.x(v)
 u=Z.Zh(c,w,(x.n(v,C.AP)||x.n(v,C.wG))&&w!=null?J.Lm(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","ghW",4,0,178],
+$.cp().Cq(a,y,u)}},"$2","ghW",4,0,181],
 B2:function(a,b){var z=a.IX.gNF()
 if(z==null)return
 return z.t(0,b)},
@@ -14725,7 +14918,7 @@
 if(typeof b==="boolean")return b?"":null
 else if(typeof b==="string"||typeof b==="number")return H.d(b)
 return},
-JY:function(a,b){var z,y,x
+QH:function(a,b){var z,y,x
 z=L.hk(b).Tl(a)
 y=this.TW(a,z)
 if(y!=null)this.gQg(a).MW.setAttribute(b,y)
@@ -14737,8 +14930,8 @@
 if(z==null)return J.FS(M.SB(a),b,c,d)
 else{y=J.RE(z)
 x=y.goc(z)
-w=$.zB()
-if(w.mL(C.t4))w.Ny("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gRT(a))+"].["+H.d(x)+"]")
+w=$.fv()
+if(w.mL(C.t4))w.J4("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gRT(a))+"].["+H.d(x)+"]")
 w=J.RE(c)
 if(w.gP(c)==null)w.sP(c,$.cp().jD(a,x))
 v=new A.lK(a,x,c,null,null)
@@ -14750,7 +14943,7 @@
 J.nC(M.SB(a),x)}J.kW(J.QE(M.SB(a)),b,v)}u=a.IX.gBj()
 y=y.goc(z)
 t=$.Mg().ep.t(0,y)
-if(u!=null&&u.tg(0,t))this.JY(a,t)
+if(u!=null&&u.tg(0,t))this.QH(a,t)
 return v}},
 Vz:function(a){return this.rf(a)},
 gCd:function(a){return J.QE(M.SB(a))},
@@ -14758,20 +14951,20 @@
 gmSA:function(a){return J.Zz(M.SB(a))},
 d9:function(a){var z,y
 if(a.Uk===!0)return
-$.iX().Ny("["+H.d(this.gRT(a))+"] asyncUnbindAll")
+$.iX().J4("["+H.d(this.gRT(a))+"] asyncUnbindAll")
 z=a.oq
 y=this.gJg(a)
 if(z==null)z=new A.FT(null,null,null)
 z.t6(0,y,null)
 a.oq=z},
 BM:[function(a){if(a.Uk===!0)return
-H.bQ(a.Cc,this.ghb(a))
+H.bQ(a.Cc,this.gMA(a))
 a.Cc=[]
 this.Uq(a)
 a.Uk=!0},"$0","gJg",0,0,17],
 oW:function(a){var z
 if(a.Uk===!0){$.iX().j2("["+H.d(this.gRT(a))+"] already unbound, cannot cancel unbindAll")
-return}$.iX().Ny("["+H.d(this.gRT(a))+"] cancelUnbindAll")
+return}$.iX().J4("["+H.d(this.gRT(a))+"] cancelUnbindAll")
 z=a.oq
 if(z!=null){z.nY(0)
 a.oq=null}},
@@ -14783,26 +14976,26 @@
 x.Wf=[]
 a.Wz=x
 a.Cc.push([x])
-for(y=H.VM(new P.fG(z),[H.Oq(z,0)]),w=y.Fb,y=H.VM(new P.EQ(w,w.Ig(),0,null),[H.Oq(y,0)]);y.G();){v=y.fD
+for(y=H.VM(new P.fG(z),[H.u3(z,0)]),w=y.Fb,y=H.VM(new P.EQ(w,w.Ig(),0,null),[H.u3(y,0)]);y.G();){v=y.fD
 x.yN(a,v)
 this.rJ(a,v,v.Tl(a),null)}}},
-FQ:[function(a,b,c,d){J.Me(c,new A.N4(a,b,c,d,J.JR(a.IX),P.Rd(null,null,null,null)))},"$3","gUc",6,0,179],
+FQ:[function(a,b,c,d){J.Me(c,new A.N4(a,b,c,d,J.JR(a.IX),P.Rd(null,null,null,null)))},"$3","gUc",6,0,182],
 HT:[function(a,b){var z,y,x,w,v
 for(z=J.mY(b);z.G();){y=z.gl()
 if(!J.x(y).$isqI)continue
 x=y.oc
 w=$.Mg().ep.t(0,x)
 v=a.IX.gBj()
-if(v!=null&&v.tg(0,w))this.JY(a,w)}},"$1","gGi",2,0,180,172],
+if(v!=null&&v.tg(0,w))this.QH(a,w)}},"$1","gGi",2,0,183,175],
 rJ:function(a,b,c,d){var z,y,x,w,v
 z=J.JR(a.IX)
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
 if(!!J.x(d).$iswn){x=$.mj()
-if(x.mL(C.t4))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: unregister "+H.d(b))
+if(x.mL(C.t4))x.J4("["+H.d(this.gRT(a))+"] observeArrayValue: unregister "+H.d(b))
 this.iQ(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.mj()
-if(x.mL(C.t4))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: register "+H.d(b))
+if(x.mL(C.t4))x.J4("["+H.d(this.gRT(a))+"] observeArrayValue: register "+H.d(b))
 w=c.gQV().ht(new A.Y0(a,d,y),null,null,!1)
 x=H.d(b)+"__array"
 v=a.q9
@@ -14810,7 +15003,7 @@
 a.q9=v}v.u(0,x,w)}},
 dvq:[function(a,b){var z,y
 for(z=J.mY(b);z.G();){y=z.gl()
-if(y!=null)J.yd(y)}},"$1","ghb",2,0,181],
+if(y!=null)J.yd(y)}},"$1","gMA",2,0,184],
 iQ:function(a,b){var z=a.q9.Rz(0,b)
 if(z==null)return!1
 z.ed()
@@ -14818,35 +15011,35 @@
 Uq:function(a){var z,y
 z=a.q9
 if(z==null)return
-for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.l6),z.T6),[H.Oq(z,0),H.Oq(z,1)]);z.G();){y=z.lo
+for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.l6),z.T6),[H.u3(z,0),H.u3(z,1)]);z.G();){y=z.lo
 if(y!=null)y.ed()}a.q9.V1(0)
 a.q9=null},
 qb:function(a){var z,y
 z=a.IX.gPS()
 if(z.gl0(z))return
 y=$.ay()
-if(y.mL(C.t4))y.Ny("["+H.d(this.gRT(a))+"] addHostListeners: "+z.bu(0))
+if(y.mL(C.t4))y.J4("["+H.d(this.gRT(a))+"] addHostListeners: "+z.bu(0))
 z.aN(0,new A.SX(a))},
 ea:function(a,b,c,d){var z,y,x,w
 z=$.ay()
 y=z.mL(C.t4)
-if(y)z.Ny(">>> ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))
+if(y)z.J4(">>> ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))
 if(!!J.x(c).$isEH){x=X.RI(c)
 if(x===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
 C.Nm.sB(d,x)
 H.eC(c,d,P.Te(null))}else if(typeof c==="string"){w=$.Mg().Nz.t(0,c)
 $.cp().Ck(b,w,d,!0,null)}else z.j2("invalid callback")
 if(y)z.To("<<< ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))},
-rW:function(a,b){var z
+Gy:function(a,b){var z
 P.rb(F.Jy())
 $.Kc().nQ("flush")
 z=window
 C.ol.pl(z)
 return C.ol.oB(z,W.aF(b))},
-SE:function(a,b,c,d,e,f){var z=W.Q8(b,!0,!0,e)
+KW:function(a,b,c,d,e,f){var z=W.H9(b,!0,!0,e)
 this.H2(a,z)
 return z},
-Tj:function(a,b){return this.SE(a,b,null,null,null,null)},
+te:function(a,b){return this.KW(a,b,null,null,null,null)},
 $iszs:true,
 $isvy:true,
 $isd3:true,
@@ -14884,20 +15077,20 @@
 for(w=J.mY(u),t=this.a,s=J.RE(t),r=this.c,q=this.f;w.G();){p=w.gl()
 if(!q.h(0,p))continue
 s.rJ(t,v,y,b)
-$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,93,59,"call"],
+$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,95,59,"call"],
 $isEH:true},
 Y0:{
 "^":"TpZ:12;a,b,c",
 $1:[function(a){var z,y,x,w
 for(z=J.mY(this.c),y=this.a,x=this.b;z.G();){w=z.gl()
-$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,182,"call"],
+$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,185,"call"],
 $isEH:true},
 SX:{
 "^":"TpZ:79;a",
 $2:function(a,b){var z,y
 z=this.a
 y=J.Ei(z).t(0,a)
-H.VM(new W.Ov(0,y.DK,y.Ph,W.aF(J.du(z.IX).Y2(z,z,b)),y.Sg),[H.Oq(y,0)]).Zz()},
+H.VM(new W.Ov(0,y.bi,y.Ph,W.aF(J.du(z.IX).Y2(z,z,b)),y.Sg),[H.u3(y,0)]).Zz()},
 $isEH:true},
 lK:{
 "^":"OC;I6,iU,q0,Jq,dY",
@@ -14911,7 +15104,7 @@
 v=w.$1(z)
 z=this.dY
 if(z==null?v!=null:z!==v)J.ta(this.q0,v)
-return}}},"$1","gXQ",2,0,180,172],
+return}}},"$1","gXQ",2,0,183,175],
 TR:function(a,b){return J.mu(this.q0,b)},
 gP:function(a){return J.Vm(this.q0)},
 sP:function(a,b){J.ta(this.q0,b)
@@ -14920,7 +15113,7 @@
 if(z!=null){z.ed()
 this.Jq=null}J.yd(this.q0)}},
 FT:{
-"^":"a;jd,ih,lS",
+"^":"a;jd,oK,lS",
 Ws:function(){return this.jd.$0()},
 t6:function(a,b,c){var z
 this.nY(0)
@@ -14933,13 +15126,13 @@
 if(z!=null){y=window
 C.ol.pl(y)
 y.cancelAnimationFrame(z)
-this.lS=null}z=this.ih
+this.lS=null}z=this.oK
 if(z!=null){z.ed()
-this.ih=null}}},
+this.oK=null}}},
 K3:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(z.ih!=null||z.lS!=null){z.nY(0)
+if(z.oK!=null||z.lS!=null){z.nY(0)
 z.Ws()}return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 mS:{
@@ -14954,10 +15147,10 @@
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 k2:{
-"^":"TpZ:185;a,b",
+"^":"TpZ:188;a,b",
 $3:[function(a,b,c){var z=$.Ej().t(0,b)
 if(z!=null)return this.a.Gr(new A.zR(a,b,z,$.vE().t(0,c)))
-return this.b.qP([b,c],a)},"$3",null,6,0,null,183,58,184,"call"],
+return this.b.qP([b,c],a)},"$3",null,6,0,null,186,58,187,"call"],
 $isEH:true},
 zR:{
 "^":"TpZ:74;c,d,e,f",
@@ -14977,7 +15170,7 @@
 t.I9()
 s=J.RE(z)
 r=s.Wk(z,"template")
-if(r!=null)J.vc(!!J.x(r).$isvy?r:M.SB(r),v)
+if(r!=null)J.D4(!!J.x(r).$isvy?r:M.SB(r),v)
 t.Mi()
 t.f6()
 t.OL()
@@ -15009,11 +15202,11 @@
 j=z.Ev
 if(j!=null);else j=null}n=p.ux
 m=p.Bo
-l=p.IE}}i=z.bM
+l=p.IE}}i=z.D6
 if(i!=null);else i=null
 t.t4=new P.q5(m,l,k,o,n,j,i,null,null)
 z=t.gZf()
-A.YG(z,y,w!=null?J.O6(w):null)
+A.Eo(z,y,w!=null?J.O6(w):null)
 if($.mX().n6(x,C.MT))$.cp().Ck(x,C.MT,[t],!1,null)
 t.Ba(y)
 return},"$0",null,0,0,null,"call"],
@@ -15022,31 +15215,31 @@
 "^":"TpZ:74;",
 $0:function(){var z=J.UQ(P.XY(document.createElement("polymer-element",null)),"__proto__")
 return!!J.x(z).$isKV?P.XY(z):z},
-$isEH:true}}],["polymer.auto_binding","package:polymer/auto_binding.dart",,Y,{
+$isEH:true}}],["","",,Y,{
 "^":"",
 q6:{
-"^":"wc;Hf,ro,fb,pt,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"k5d;Hf,ro,fb,pt,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gk8:function(a){return J.ZH(a.Hf)},
-gG5:function(a){return J.fx(a.Hf)},
-sG5:function(a,b){J.vc(a.Hf,b)},
+gA0:function(a){return J.qy(a.Hf)},
+sA0:function(a,b){J.D4(a.Hf,b)},
 V1:function(a){return J.Z8(a.Hf)},
-gUj:function(a){return J.fx(a.Hf)},
+gUj:function(a){return J.qy(a.Hf)},
 ZK:function(a,b,c){return J.MO(a.Hf,b,c)},
 ea:function(a,b,c,d){return A.zs.prototype.ea.call(this,a,b===a?J.ZH(a.Hf):b,c,d)},
 dX:function(a){var z
 this.Pa(a)
 a.Hf=M.SB(a)
 z=T.GF(null,C.qY)
-J.vc(a.Hf,new Y.zp(a,z,null))
+J.D4(a.Hf,new Y.zp(a,z,null))
 $.iF().MM.ml(new Y.lkK(a))},
 $isDT:true,
 $isvy:true,
-static:{Ifw:function(a){var z,y
+static:{zE:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -15054,33 +15247,33 @@
 C.Gkp.dX(a)
 return a}}},
 GLL:{
-"^":"OH+zs;XG:SD=",
+"^":"fX+zs;V6:SD=",
 $iszs:true,
 $isvy:true,
 $isd3:true,
 $ish4:true,
 $isPZ:true,
 $isKV:true},
-wc:{
+k5d:{
 "^":"GLL+d3;R9:ro%,V2:fb%,me:pt%",
 $isd3:true},
 lkK:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 z.setAttribute("bind","")
-J.mI(z,new Y.dv(z))},"$1",null,2,0,null,13,"call"],
+J.rg(z,new Y.Mr(z))},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-dv:{
+Mr:{
 "^":"TpZ:12;b",
 $1:[function(a){var z,y
 z=this.b
 y=J.RE(z)
 y.lj(z,z.parentNode)
-y.Tj(z,"template-bound")},"$1",null,2,0,null,13,"call"],
+y.te(z,"template-bound")},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 zp:{
-"^":"Li;dq,Mn,cJ",
-XB:function(a){return this.dq}}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
+"^":"Li;dq,Mn,DP",
+XB:function(a){return this.dq}}}],["","",,Z,{
 "^":"",
 Zh:function(a,b,c){var z,y,x
 z=$.Rf().t(0,c)
@@ -15122,7 +15315,7 @@
 Lf:{
 "^":"TpZ:12;b",
 $1:function(a){return this.b},
-$isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
+$isEH:true}}],["","",,T,{
 "^":"",
 Rj:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.zg(z.gvc(a),new T.IK(a)).zV(0," ")
@@ -15139,10 +15332,10 @@
 $isEH:true},
 k9:{
 "^":"TpZ:12;a",
-$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,130,"call"],
+$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,133,"call"],
 $isEH:true},
 QB:{
-"^":"VE;VA,jw,iX,WK,cJ",
+"^":"VE;BlM,nF,QA,YH,DP",
 US:function(a,b,c){var z,y,x,w
 z={}
 y=new Y.xv(H.VM([],[Y.qS]),P.p9(""),new P.Kg(a,0,0,null),null)
@@ -15150,22 +15343,22 @@
 x=new T.FX(x,y,null,null)
 y=y.zl()
 x.jQ=y
-x.vi=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)])
+x.R3=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)])
 x.Bp()
 w=x.Te()
 if(M.CF(c)){y=J.x(b)
 y=y.n(b,"bind")||y.n(b,"repeat")}else y=!1
 if(y){z=J.x(w)
-if(!!z.$isb4)return new T.qb(this,w.gxG(),z.gkZ(w))
+if(!!z.$isDI)return new T.qb(this,w.gxG(),z.gkZ(w))
 else return new T.Xyb(this,w)}z.a=null
 y=!!J.x(c).$ish4
 if(y&&J.xC(b,"class"))z.a=T.PG()
 else if(y&&J.xC(b,"style"))z.a=T.Bn()
 return new T.Ddj(z,this,w)},
-CE:function(a){var z=this.WK.t(0,a)
+A5:function(a){var z=this.YH.t(0,a)
 if(z==null)return new T.r6(this,a)
 return new T.Wb(this,a,z)},
-fO:function(a){var z,y,x,w,v
+ZN:function(a){var z,y,x,w,v
 z=J.RE(a)
 y=z.gBy(a)
 if(y==null)return
@@ -15174,121 +15367,121 @@
 w=z.gmSA(x)
 v=w==null?z.gk8(x):w.k8
 if(!!J.x(v).$isGK)return v
-else return this.iX.t(0,a)}return this.fO(y)},
-ey:function(a,b){var z,y
-if(a==null)return K.dZ(b,this.jw)
+else return this.QA.t(0,a)}return this.ZN(y)},
+JY:function(a,b){var z,y
+if(a==null)return K.dZ(b,this.nF)
 z=J.x(a)
 if(!!z.$ish4);if(!!J.x(b).$isGK)return b
-y=this.iX
+y=this.QA
 if(y.t(0,a)!=null){y.t(0,a)
-return y.t(0,a)}else if(z.gBy(a)!=null)return this.Wg(z.gBy(a),b)
+return y.t(0,a)}else if(z.gBy(a)!=null)return this.rp(z.gBy(a),b)
 else{if(!M.CF(a))throw H.b("expected a template instead of "+H.d(a))
-return this.Wg(a,b)}},
-Wg:function(a,b){var z,y,x
+return this.rp(a,b)}},
+rp:function(a,b){var z,y,x
 if(M.CF(a)){z=!!J.x(a).$isvy?a:M.SB(a)
 y=J.RE(z)
 if(y.gmSA(z)==null)y.gk8(z)
-return this.iX.t(0,a)}else{y=J.RE(a)
-if(y.geT(a)==null){x=this.iX.t(0,a)
-return x!=null?x:K.dZ(b,this.jw)}else return this.Wg(y.gBy(a),b)}},
-static:{"^":"DI",GF:function(a,b){var z,y,x
+return this.QA.t(0,a)}else{y=J.RE(a)
+if(y.geT(a)==null){x=this.QA.t(0,a)
+return x!=null?x:K.dZ(b,this.nF)}else return this.rp(y.gBy(a),b)}},
+static:{"^":"rp3",GF:function(a,b){var z,y,x
 z=H.VM(new P.qo(null),[K.GK])
 y=H.VM(new P.qo(null),[P.qU])
 x=P.L5(null,null,null,P.qU,P.a)
 x.FV(0,C.c7o)
 return new T.QB(b,x,z,y,null)}}},
 qb:{
-"^":"TpZ:186;b,c,d",
+"^":"TpZ:189;b,c,d",
 $3:[function(a,b,c){var z,y
 z=this.b
-z.WK.u(0,b,this.c)
-y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
-z.iX.u(0,b,y)
+z.YH.u(0,b,this.c)
+y=!!J.x(a).$isGK?a:K.dZ(a,z.nF)
+z.QA.u(0,b,y)
 z=T.kR()
-return new T.tI(y,z,this.d,null,null,null,null)},"$3",null,6,0,null,174,175,176,"call"],
+return new T.tI(y,z,this.d,null,null,null,null)},"$3",null,6,0,null,177,178,179,"call"],
 $isEH:true},
 Xyb:{
-"^":"TpZ:186;e,f",
+"^":"TpZ:189;e,f",
 $3:[function(a,b,c){var z,y
 z=this.e
-y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
-z.iX.u(0,b,y)
+y=!!J.x(a).$isGK?a:K.dZ(a,z.nF)
+z.QA.u(0,b,y)
 if(c===!0)return T.jF(this.f,y,null)
 z=T.kR()
-return new T.tI(y,z,this.f,null,null,null,null)},"$3",null,6,0,null,174,175,176,"call"],
+return new T.tI(y,z,this.f,null,null,null,null)},"$3",null,6,0,null,177,178,179,"call"],
 $isEH:true},
 Ddj:{
-"^":"TpZ:186;a,UI,bK",
+"^":"TpZ:189;a,UI,bK",
 $3:[function(a,b,c){var z,y
-z=this.UI.ey(b,a)
+z=this.UI.JY(b,a)
 if(c===!0)return T.jF(this.bK,z,this.a.a)
 y=this.a.a
 if(y==null)y=T.kR()
-return new T.tI(z,y,this.bK,null,null,null,null)},"$3",null,6,0,null,174,175,176,"call"],
+return new T.tI(z,y,this.bK,null,null,null,null)},"$3",null,6,0,null,177,178,179,"call"],
 $isEH:true},
 r6:{
 "^":"TpZ:12;a,b",
 $1:[function(a){var z,y,x
 z=this.a
 y=this.b
-x=z.iX.t(0,y)
+x=z.QA.t(0,y)
 if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.dZ(a,z.jw)}else return z.ey(y,a)},"$1",null,2,0,null,174,"call"],
+return K.dZ(a,z.nF)}else return z.JY(y,a)},"$1",null,2,0,null,177,"call"],
 $isEH:true},
 Wb:{
 "^":"TpZ:12;c,d,e",
 $1:[function(a){var z,y,x,w
 z=this.c
 y=this.d
-x=z.iX.t(0,y)
+x=z.QA.t(0,y)
 w=this.e
 if(x!=null)return x.t1(w,a)
-else return z.fO(y).t1(w,a)},"$1",null,2,0,null,174,"call"],
+else return z.ZN(y).t1(w,a)},"$1",null,2,0,null,177,"call"],
 $isEH:true},
 tI:{
-"^":"OC;IM,eI,kG,Tu,T7,zh,IZ",
-bh:function(a){return this.eI.$1(a)},
-tC:function(a){return this.Tu.$1(a)},
-b9:[function(a,b){var z,y
-z=this.IZ
-y=this.bh(a)
-this.IZ=y
-if(b!==!0&&this.Tu!=null&&!J.xC(z,y))this.tC(this.IZ)},function(a){return this.b9(a,!1)},"bU","$2$skipChanges","$1","gNB",2,3,187,188,66,189],
-gP:function(a){if(this.Tu!=null)return this.IZ
-return T.jF(this.kG,this.IM,this.eI)},
+"^":"OC;yr,wx,n4,Fg,JX,zr,HR",
+Gb:function(a){return this.wx.$1(a)},
+WV:function(a){return this.Fg.$1(a)},
+nb:[function(a,b){var z,y
+z=this.HR
+y=this.Gb(a)
+this.HR=y
+if(b!==!0&&this.Fg!=null&&!J.xC(z,y))this.WV(this.HR)},function(a){return this.nb(a,!1)},"zh","$2$skipChanges","$1","gQp",2,3,190,191,66,192],
+gP:function(a){if(this.Fg!=null)return this.HR
+return T.jF(this.n4,this.yr,this.wx)},
 sP:function(a,b){var z,y,x,w,v
-try{z=K.FH(this.kG,b,this.IM,!1)
-this.b9(z,!0)}catch(w){v=H.Ru(w)
+try{z=K.jXm(this.n4,b,this.yr,!1)
+this.nb(z,!0)}catch(w){v=H.Ru(w)
 y=v
 x=new H.oP(w,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.kG)+"': "+H.d(y),x)}},
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.n4)+"': "+H.d(y),x)}},
 TR:function(a,b){var z,y,x,w,v
-if(this.Tu!=null)throw H.b(P.w("already open"))
-this.Tu=b
+if(this.Fg!=null)throw H.b(P.w("already open"))
+this.Fg=b
 x=H.VM(new P.Sw(null,0,0,0),[null])
 x.Eo(null,null)
-w=this.kG.RR(0,new K.Oy(x))
-this.zh=w
-x=w.gUO().yI(this.gNB())
+w=this.n4.RR(0,new K.Oy(x))
+this.zr=w
+x=w.gqM().yI(this.gQp())
 x.fm(0,new T.pI(this))
-this.T7=x
-try{x=this.zh
-J.okV(x,new K.Edh(this.IM))
+this.JX=x
+try{x=this.zr
+J.okV(x,new K.Edh(this.yr))
 x.gK3()
-this.b9(this.zh.gK3(),!0)}catch(v){x=H.Ru(v)
+this.nb(this.zr.gK3(),!0)}catch(v){x=H.Ru(v)
 z=x
 y=new H.oP(v,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.zh)+"': "+H.d(z),y)}return this.IZ},
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.zr)+"': "+H.d(z),y)}return this.HR},
 xO:function(a){var z,y
-if(this.Tu==null)return
-this.T7.ed()
-this.T7=null
-this.Tu=null
-z=$.At()
-y=this.zh
+if(this.Fg==null)return
+this.JX.ed()
+this.JX=null
+this.Fg=null
+z=$.bq()
+y=this.zr
 z.toString
 J.okV(y,z)
-this.zh=null},
+this.zr=null},
 static:{jF:function(a,b,c){var z,y,x,w,v
 try{z=J.okV(a,new K.GQ(b))
 w=c==null?z:c.$1(z)
@@ -15298,36 +15491,36 @@
 H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
 pI:{
 "^":"TpZ:79;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.zh)+"': "+H.d(a),b)},"$2",null,4,0,null,2,154,"call"],
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.zr)+"': "+H.d(a),b)},"$2",null,4,0,null,2,157,"call"],
 $isEH:true},
-yy:{
-"^":"a;"}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
+WM:{
+"^":"a;"}}],["","",,B,{
 "^":"",
 De:{
-"^":"xhq;vq,ra,AP,fn",
-vb:function(a,b){this.vq.yI(new B.fg(b,this))},
+"^":"xhq;vq>,ra,AP,fn",
+vb:function(a,b){this.vq.yI(new B.fg(this,b))},
 $asxhq:function(a){return[null]},
 static:{pe:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
 fg:{
 "^":"TpZ;a,b",
-$1:[function(a){var z=this.b
-z.ra=F.Wi(z,C.ls,z.ra,a)},"$1",null,2,0,null,93,"call"],
+$1:[function(a){var z=this.a
+z.ra=F.Wi(z,C.ls,z.ra,a)},"$1",null,2,0,null,95,"call"],
 $isEH:true,
-$signature:function(){return H.IGs(function(a){return{func:"Ay",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
+$signature:function(){return H.IGs(function(a){return{func:"Ay",args:[a]}},this.a,"De")}}}],["","",,K,{
 "^":"",
-FH:function(a,b,c,d){var z,y,x,w,v,u,t
+jXm:function(a,b,c,d){var z,y,x,w,v,u,t
 z=H.VM([],[U.Ip])
 for(;y=J.x(a),!!y.$isuku;){if(!J.xC(y.gkp(a),"|"))break
 z.push(y.gT8(a))
-a=y.gBb(a)}if(!!y.$isfp){x=y.gP(a)
-w=C.OL
+a=y.gBb(a)}if(!!y.$iselO){x=y.gP(a)
+w=C.x4
 v=!1}else if(!!y.$iszX){w=a.gTf()
 x=a.gJn()
 v=!0}else{if(!!y.$isrX){w=a.gTf()
 x=y.goc(a)}else{if(d)throw H.b(K.xn("Expression is not assignable: "+H.d(a)))
-return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);y.G();){u=y.lo
+return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){u=y.lo
 J.okV(u,new K.GQ(c))
 if(d)throw H.b(K.xn("filter must implement Transformer to be assignable: "+H.d(u)))
 else return}t=J.okV(w,new K.GQ(c))
@@ -15381,7 +15574,7 @@
 $isEH:true},
 w21:{
 "^":"TpZ:79;",
-$2:function(a,b){return J.z8(a,b)},
+$2:function(a,b){return J.xZ(a,b)},
 $isEH:true},
 w22:{
 "^":"TpZ:79;",
@@ -15461,25 +15654,25 @@
 AC:function(a){if(this.Z3.x4(0,a))return!1
 return!J.xC(a,"this")},
 bu:[function(a){var z=this.Z3
-return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.Ix(H.VM(new P.i5(z),[H.Oq(z,0)]),"(",")")+"]"},"$0","gAY",0,0,71]},
+return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.Ix(H.VM(new P.i5(z),[H.u3(z,0)]),"(",")")+"]"},"$0","gAY",0,0,71]},
 Ay0:{
-"^":"a;bO?,Xl<",
-gUO:function(){var z=this.k6
-return H.VM(new P.Ik(z),[H.Oq(z,0)])},
-gK3:function(){return this.Xl},
+"^":"a;fT?,Gl<",
+gqM:function(){var z=this.k6
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
+gK3:function(){return this.Gl},
 Qh:function(a){},
 ub:function(a){var z
 this.Db(0,a)
-z=this.bO
+z=this.fT
 if(z!=null)z.ub(a)},
 pu:function(){var z=this.tj
 if(z!=null){z.ed()
 this.tj=null}},
 Db:function(a,b){var z,y,x
 this.pu()
-z=this.Xl
+z=this.Gl
 this.Qh(b)
-y=this.Xl
+y=this.Gl
 if(y==null?z!=null:y!==z){x=this.k6
 if(x.Gv>=4)H.vh(x.q7())
 x.Iv(y)}},
@@ -15491,12 +15684,12 @@
 me:{
 "^":"cfS;",
 xn:function(a){a.pu()},
-static:{"^":"b3"}},
+static:{"^":"jCU"}},
 GQ:{
-"^":"P55;qu",
+"^":"lW;qu",
 W9:function(a){return J.ZH(this.qu)},
 LT:function(a){return a.wz.RR(0,this)},
-fV:function(a){var z,y,x
+T7:function(a){var z,y,x
 z=J.okV(a.gTf(),this)
 if(z==null)return
 y=a.goc(a)
@@ -15520,15 +15713,15 @@
 Zh:function(a){return H.VM(new H.A8(a.ghL(),this.gnG()),[null,null]).br(0)},
 o0:function(a){var z,y,x
 z=P.Fl(null,null)
-for(y=a.gRl(a),y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]);y.G();){x=y.lo
-z.u(0,J.okV(J.A6(x),this),J.okV(x.gv4(),this))}return z},
-YV:function(a){return H.vh(P.f("should never be called"))},
+for(y=a.gRl(a),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.lo
+z.u(0,J.okV(J.Kt(x),this),J.okV(x.gv4(),this))}return z},
+EZ:function(a){return H.vh(P.f("should never be called"))},
 qs:function(a){return J.UQ(this.qu,a.gP(a))},
 ex:function(a){var z,y,x,w,v
 z=a.gkp(a)
 y=J.okV(a.gBb(a),this)
 x=J.okV(a.gT8(a),this)
-w=$.YP().t(0,z)
+w=$.Xa().t(0,z)
 v=J.x(z)
 if(v.n(z,"&&")||v.n(z,"||")){v=y==null?!1:y
 return w.$2(v,x==null?!1:x)}else if(v.n(z,"==")||v.n(z,"!="))return w.$2(y,x)
@@ -15539,24 +15732,24 @@
 y=$.EU().t(0,a.gkp(a))
 if(J.xC(a.gkp(a),"!"))return y.$1(z==null?!1:z)
 return z==null?null:y.$1(z)},
-RD:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gSl(),this):J.okV(a.gru(),this)},
-e5:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
-xt:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
+RN:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gSl(),this):J.okV(a.gru(),this)},
+ky:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
+Vw:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
 Oy:{
-"^":"P55;ZGj",
+"^":"lW;ZGj",
 W9:function(a){return new K.uD(a,null,null,null,P.bK(null,null,!1,null))},
 LT:function(a){return a.wz.RR(0,this)},
-fV:function(a){var z,y
+T7:function(a){var z,y
 z=J.okV(a.gTf(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(y)
+z.sfT(y)
 return y},
 CU:function(a){var z,y,x
 z=J.okV(a.gTf(),this)
 y=J.okV(a.gJn(),this)
 x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(x)
-y.sbO(x)
+z.sfT(x)
+y.sfT(x)
 return x},
 Y7:function(a){var z,y,x,w,v
 z=J.okV(a.gTf(),this)
@@ -15565,7 +15758,7 @@
 w=this.gnG()
 x.toString
 y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.c3(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(v)
+z.sfT(v)
 if(y!=null)H.bQ(y,new K.zD(v))
 return v},
 tx:function(a){return new K.z0(a,null,null,null,P.bK(null,null,!1,null))},
@@ -15579,110 +15772,110 @@
 y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.Xs(y))
 return y},
-YV:function(a){var z,y,x
+EZ:function(a){var z,y,x
 z=J.okV(a.gG3(a),this)
 y=J.okV(a.gv4(),this)
 x=new K.EL(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(x)
-y.sbO(x)
+z.sfT(x)
+y.sfT(x)
 return x},
 qs:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
 ex:function(a){var z,y,x
 z=J.okV(a.gBb(a),this)
 y=J.okV(a.gT8(a),this)
-x=new K.UW(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(x)
-y.sbO(x)
+x=new K.kyp(z,y,a,null,null,null,P.bK(null,null,!1,null))
+z.sfT(x)
+y.sfT(x)
 return x},
 xN:function(a){var z,y
 z=J.okV(a.gwz(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(y)
+z.sfT(y)
 return y},
-RD:function(a){var z,y,x,w
+RN:function(a){var z,y,x,w
 z=J.okV(a.gdc(),this)
 y=J.okV(a.gSl(),this)
 x=J.okV(a.gru(),this)
 w=new K.WW(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(w)
-y.sbO(w)
-x.sbO(w)
+z.sfT(w)
+y.sfT(w)
+x.sfT(w)
 return w},
-e5:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
-xt:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
+ky:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
+Vw:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
 zD:{
 "^":"TpZ:12;a",
 $1:function(a){var z=this.a
-a.sbO(z)
+a.sfT(z)
 return z},
 $isEH:true},
 XV:{
 "^":"TpZ:12;a",
 $1:function(a){var z=this.a
-a.sbO(z)
+a.sfT(z)
 return z},
 $isEH:true},
 Xs:{
 "^":"TpZ:12;a",
 $1:function(a){var z=this.a
-a.sbO(z)
+a.sfT(z)
 return z},
 $isEH:true},
 uD:{
-"^":"Ay0;KL,bO,tj,Xl,k6",
-Qh:function(a){this.Xl=J.ZH(a)},
+"^":"Ay0;KL,fT,tj,Gl,k6",
+Qh:function(a){this.Gl=J.ZH(a)},
 RR:function(a,b){return b.W9(this)},
 $asAy0:function(){return[U.WH]},
 $isWH:true,
 $isIp:true},
 z0:{
-"^":"Ay0;KL,bO,tj,Xl,k6",
+"^":"Ay0;KL,fT,tj,Gl,k6",
 gP:function(a){var z=this.KL
 return z.gP(z)},
 Qh:function(a){var z=this.KL
-this.Xl=z.gP(z)},
+this.Gl=z.gP(z)},
 RR:function(a,b){return b.tx(this)},
-$asAy0:function(){return[U.no]},
-$asno:function(){return[null]},
-$isno:true,
+$asAy0:function(){return[U.noG]},
+$asnoG:function(){return[null]},
+$isnoG:true,
 $isIp:true},
 kL:{
-"^":"Ay0;hL<,KL,bO,tj,Xl,k6",
-Qh:function(a){this.Xl=H.VM(new H.A8(this.hL,new K.Hv()),[null,null]).br(0)},
+"^":"Ay0;hL<,KL,fT,tj,Gl,k6",
+Qh:function(a){this.Gl=H.VM(new H.A8(this.hL,new K.Hv()),[null,null]).br(0)},
 RR:function(a,b){return b.Zh(this)},
 $asAy0:function(){return[U.c0]},
 $isc0:true,
 $isIp:true},
 Hv:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gXl()},"$1",null,2,0,null,93,"call"],
+$1:[function(a){return a.gGl()},"$1",null,2,0,null,95,"call"],
 $isEH:true},
 ev:{
-"^":"Ay0;Rl>,KL,bO,tj,Xl,k6",
-Qh:function(a){this.Xl=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Kv())},
+"^":"Ay0;Rl>,KL,fT,tj,Gl,k6",
+Qh:function(a){this.Gl=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Kv())},
 RR:function(a,b){return b.o0(this)},
 $asAy0:function(){return[U.Mm]},
 $isMm:true,
 $isIp:true},
 Kv:{
 "^":"TpZ:79;",
-$2:function(a,b){J.kW(a,J.A6(b).gXl(),b.gv4().gXl())
+$2:function(a,b){J.kW(a,J.Kt(b).gGl(),b.gv4().gGl())
 return a},
 $isEH:true},
 EL:{
-"^":"Ay0;G3>,v4<,KL,bO,tj,Xl,k6",
-RR:function(a,b){return b.YV(this)},
+"^":"Ay0;G3>,v4<,KL,fT,tj,Gl,k6",
+RR:function(a,b){return b.EZ(this)},
 $asAy0:function(){return[U.ae]},
 $isae:true,
 $isIp:true},
 ek:{
-"^":"Ay0;KL,bO,tj,Xl,k6",
+"^":"Ay0;KL,fT,tj,Gl,k6",
 gP:function(a){var z=this.KL
 return z.gP(z)},
 Qh:function(a){var z,y,x,w
 z=this.KL
 y=J.U6(a)
-this.Xl=y.t(a,z.gP(z))
+this.Gl=y.t(a,z.gP(z))
 if(!a.AC(z.gP(z)))return
 x=y.gk8(a)
 y=J.x(x)
@@ -15691,46 +15884,46 @@
 w=$.Mg().Nz.t(0,z)
 this.tj=y.gqh(x).yI(new K.V8(this,a,w))},
 RR:function(a,b){return b.qs(this)},
-$asAy0:function(){return[U.fp]},
-$isfp:true,
+$asAy0:function(){return[U.elO]},
+$iselO:true,
 $isIp:true},
 V8:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.GC(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,182,"call"],
+$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
 GC:{
 "^":"TpZ:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 mv:{
-"^":"Ay0;wz<,KL,bO,tj,Xl,k6",
+"^":"Ay0;wz<,KL,fT,tj,Gl,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
 Qh:function(a){var z,y
 z=this.KL
 y=$.EU().t(0,z.gkp(z))
-if(J.xC(z.gkp(z),"!")){z=this.wz.gXl()
-this.Xl=y.$1(z==null?!1:z)}else{z=this.wz
-this.Xl=z.gXl()==null?null:y.$1(z.gXl())}},
+if(J.xC(z.gkp(z),"!")){z=this.wz.gGl()
+this.Gl=y.$1(z==null?!1:z)}else{z=this.wz
+this.Gl=z.gGl()==null?null:y.$1(z.gGl())}},
 RR:function(a,b){return b.xN(this)},
 $asAy0:function(){return[U.cJ]},
 $iscJ:true,
 $isIp:true},
-UW:{
-"^":"Ay0;Bb>,T8>,KL,bO,tj,Xl,k6",
+kyp:{
+"^":"Ay0;Bb>,T8>,KL,fT,tj,Gl,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
 Qh:function(a){var z,y,x
 z=this.KL
-y=$.YP().t(0,z.gkp(z))
-if(J.xC(z.gkp(z),"&&")||J.xC(z.gkp(z),"||")){z=this.Bb.gXl()
+y=$.Xa().t(0,z.gkp(z))
+if(J.xC(z.gkp(z),"&&")||J.xC(z.gkp(z),"||")){z=this.Bb.gGl()
 if(z==null)z=!1
-x=this.T8.gXl()
-this.Xl=y.$2(z,x==null?!1:x)}else if(J.xC(z.gkp(z),"==")||J.xC(z.gkp(z),"!="))this.Xl=y.$2(this.Bb.gXl(),this.T8.gXl())
+x=this.T8.gGl()
+this.Gl=y.$2(z,x==null?!1:x)}else if(J.xC(z.gkp(z),"==")||J.xC(z.gkp(z),"!="))this.Gl=y.$2(this.Bb.gGl(),this.T8.gGl())
 else{x=this.Bb
-if(x.gXl()==null||this.T8.gXl()==null)this.Xl=null
-else{if(J.xC(z.gkp(z),"|")&&!!J.x(x.gXl()).$iswn)this.tj=H.Go(x.gXl(),"$iswn").gQV().yI(new K.P8(this,a))
-this.Xl=y.$2(x.gXl(),this.T8.gXl())}}},
+if(x.gGl()==null||this.T8.gGl()==null)this.Gl=null
+else{if(J.xC(z.gkp(z),"|")&&!!J.x(x.gGl()).$iswn)this.tj=H.Go(x.gGl(),"$iswn").gQV().yI(new K.P8(this,a))
+this.Gl=y.$2(x.gGl(),this.T8.gGl())}}},
 RR:function(a,b){return b.ex(this)},
 $asAy0:function(){return[U.uku]},
 $isuku:true,
@@ -15740,46 +15933,46 @@
 $1:[function(a){return this.a.ub(this.b)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 WW:{
-"^":"Ay0;dc<,Sl<,ru<,KL,bO,tj,Xl,k6",
-Qh:function(a){var z=this.dc.gXl()
-this.Xl=(z==null?!1:z)===!0?this.Sl.gXl():this.ru.gXl()},
-RR:function(a,b){return b.RD(this)},
+"^":"Ay0;dc<,Sl<,ru<,KL,fT,tj,Gl,k6",
+Qh:function(a){var z=this.dc.gGl()
+this.Gl=(z==null?!1:z)===!0?this.Sl.gGl():this.ru.gGl()},
+RR:function(a,b){return b.RN(this)},
 $asAy0:function(){return[U.Dc]},
 $isDc:true,
 $isIp:true},
 vl:{
-"^":"Ay0;Tf<,KL,bO,tj,Xl,k6",
+"^":"Ay0;Tf<,KL,fT,tj,Gl,k6",
 goc:function(a){var z=this.KL
 return z.goc(z)},
 Qh:function(a){var z,y,x
-z=this.Tf.gXl()
-if(z==null){this.Xl=null
+z=this.Tf.gGl()
+if(z==null){this.Gl=null
 return}y=this.KL
 y=y.goc(y)
 x=$.Mg().Nz.t(0,y)
-this.Xl=$.cp().jD(z,x)
+this.Gl=$.cp().jD(z,x)
 y=J.x(z)
 if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.fk(this,a,x))},
-RR:function(a,b){return b.fV(this)},
+RR:function(a,b){return b.T7(this)},
 $asAy0:function(){return[U.rX]},
 $isrX:true,
 $isIp:true},
 fk:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.WKb(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,182,"call"],
+$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
 WKb:{
 "^":"TpZ:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 iT:{
-"^":"Ay0;Tf<,Jn<,KL,bO,tj,Xl,k6",
+"^":"Ay0;Tf<,Jn<,KL,fT,tj,Gl,k6",
 Qh:function(a){var z,y,x
-z=this.Tf.gXl()
-if(z==null){this.Xl=null
-return}y=this.Jn.gXl()
+z=this.Tf.gGl()
+if(z==null){this.Gl=null
+return}y=this.Jn.gGl()
 x=J.U6(z)
-this.Xl=x.t(z,y)
+this.Gl=x.t(z,y)
 if(!!x.$iswn)this.tj=z.gQV().yI(new K.tE(this,a,y))
 else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.z5(this,a,y))},
 RR:function(a,b){return b.CU(this)},
@@ -15788,7 +15981,7 @@
 $isIp:true},
 tE:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.Ku(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,182,"call"],
+$1:[function(a){if(J.VA(a,new K.Ku(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
 Ku:{
 "^":"TpZ:12;d",
@@ -15796,40 +15989,40 @@
 $isEH:true},
 z5:{
 "^":"TpZ:12;e,f,UI",
-$1:[function(a){if(J.nE1(a,new K.ey(this.UI))===!0)this.e.ub(this.f)},"$1",null,2,0,null,182,"call"],
+$1:[function(a){if(J.VA(a,new K.ey(this.UI))===!0)this.e.ub(this.f)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
 ey:{
 "^":"TpZ:12;bK",
 $1:[function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 c3:{
-"^":"Ay0;Tf<,re<,KL,bO,tj,Xl,k6",
+"^":"Ay0;Tf<,re<,KL,fT,tj,Gl,k6",
 gSf:function(a){var z=this.KL
 return z.gSf(z)},
 Qh:function(a){var z,y,x,w
 z=this.re
 z.toString
 y=H.VM(new H.A8(z,new K.vQ()),[null,null]).br(0)
-x=this.Tf.gXl()
-if(x==null){this.Xl=null
+x=this.Tf.gGl()
+if(x==null){this.Gl=null
 return}z=this.KL
 if(z.gSf(z)==null){z=H.eC(x,y,P.Te(null))
-this.Xl=!!J.x(z).$iswS?B.pe(z,null):z}else{z=z.gSf(z)
+this.Gl=!!J.x(z).$iswS?B.pe(z,null):z}else{z=z.gSf(z)
 w=$.Mg().Nz.t(0,z)
-this.Xl=$.cp().Ck(x,w,y,!1,null)
+this.Gl=$.cp().Ck(x,w,y,!1,null)
 z=J.x(x)
-if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.Sr(this,a,w))}},
+if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.Xh(this,a,w))}},
 RR:function(a,b){return b.Y7(this)},
 $asAy0:function(){return[U.Nb]},
 $isNb:true,
 $isIp:true},
 vQ:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gXl()},"$1",null,2,0,null,49,"call"],
+$1:[function(a){return a.gGl()},"$1",null,2,0,null,49,"call"],
 $isEH:true},
-Sr:{
-"^":"TpZ:190;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.ho(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,182,"call"],
+Xh:{
+"^":"TpZ:193;a,b,c",
+$1:[function(a){if(J.VA(a,new K.ho(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
 ho:{
 "^":"TpZ:12;d",
@@ -15838,7 +16031,7 @@
 B03:{
 "^":"a;G1>",
 bu:[function(a){return"EvalException: "+this.G1},"$0","gAY",0,0,71],
-static:{xn:function(a){return new K.B03(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
+static:{xn:function(a){return new K.B03(a)}}}}],["","",,U,{
 "^":"",
 Pu:function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
@@ -15860,7 +16053,7 @@
 return 536870911&a+((16383&a)<<15>>>0)},
 Fs:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,191,2,49]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,194,2,49]},
 Ip:{
 "^":"a;",
 $isIp:true},
@@ -15868,17 +16061,17 @@
 "^":"Ip;",
 RR:function(a,b){return b.W9(this)},
 $isWH:true},
-no:{
+noG:{
 "^":"Ip;P>",
 RR:function(a,b){return b.tx(this)},
 bu:[function(a){var z=this.P
 return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
-z=H.RB(b,"$isno",[H.Oq(this,0)],"$asno")
+z=H.RB(b,"$isnoG",[H.u3(this,0)],"$asnoG")
 return z&&J.xC(J.Vm(b),this.P)},
 giO:function(a){return J.v1(this.P)},
-$isno:true},
+$isnoG:true},
 c0:{
 "^":"Ip;hL<",
 RR:function(a,b){return b.Zh(this)},
@@ -15899,7 +16092,7 @@
 $isMm:true},
 ae:{
 "^":"Ip;G3>,v4<",
-RR:function(a,b){return b.YV(this)},
+RR:function(a,b){return b.EZ(this)},
 bu:[function(a){return this.G3.bu(0)+": "+H.d(this.v4)},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
@@ -15918,16 +16111,16 @@
 return!!J.x(b).$isXC&&J.xC(b.wz,this.wz)},
 giO:function(a){return J.v1(this.wz)},
 $isXC:true},
-fp:{
+elO:{
 "^":"Ip;P>",
 RR:function(a,b){return b.qs(this)},
 bu:[function(a){return this.P},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isfp&&J.xC(z.gP(b),this.P)},
+return!!z.$iselO&&J.xC(z.gP(b),this.P)},
 giO:function(a){return J.v1(this.P)},
-$isfp:true},
+$iselO:true},
 cJ:{
 "^":"Ip;kp>,wz<",
 RR:function(a,b){return b.xN(this)},
@@ -15957,7 +16150,7 @@
 $isuku:true},
 Dc:{
 "^":"Ip;dc<,Sl<,ru<",
-RR:function(a,b){return b.RD(this)},
+RR:function(a,b){return b.RN(this)},
 bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.ru)+")"},"$0","gAY",0,0,71],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isDc&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gru(),this.ru)},
@@ -15969,7 +16162,7 @@
 $isDc:true},
 X7S:{
 "^":"Ip;Bb>,T8>",
-RR:function(a,b){return b.e5(this)},
+RR:function(a,b){return b.ky(this)},
 gxG:function(){var z=this.Bb
 return z.gP(z)},
 gkZ:function(a){return this.T8},
@@ -15982,10 +16175,10 @@
 y=J.v1(this.T8)
 return U.Le(U.C0C(U.C0C(0,z),y))},
 $isX7S:true,
-$isb4:true},
+$isDI:true},
 px:{
 "^":"Ip;Bb>,T8>",
-RR:function(a,b){return b.xt(this)},
+RR:function(a,b){return b.Vw(this)},
 gxG:function(){var z=this.T8
 return z.gP(z)},
 gkZ:function(a){return this.Bb},
@@ -15998,7 +16191,7 @@
 y=y.giO(y)
 return U.Le(U.C0C(U.C0C(0,z),y))},
 $ispx:true,
-$isb4:true},
+$isDI:true},
 zX:{
 "^":"Ip;Tf<,Jn<",
 RR:function(a,b){return b.CU(this)},
@@ -16012,7 +16205,7 @@
 $iszX:true},
 rX:{
 "^":"Ip;Tf<,oc>",
-RR:function(a,b){return b.fV(this)},
+RR:function(a,b){return b.T7(this)},
 bu:[function(a){return H.d(this.Tf)+"."+H.d(this.oc)},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
@@ -16040,67 +16233,67 @@
 lc:{
 "^":"TpZ:79;",
 $2:function(a,b){return U.C0C(a,J.v1(b))},
-$isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
+$isEH:true}}],["","",,T,{
 "^":"",
 FX:{
-"^":"a;rp,Yf,jQ,vi",
-gQi:function(){return this.vi.lo},
+"^":"a;r3,Yf,jQ,R3",
+gQi:function(){return this.R3.lo},
 lx:function(a,b){var z
-if(a!=null){z=this.vi.lo
+if(a!=null){z=this.R3.lo
 z=z==null||!J.xC(J.Iz(z),a)}else z=!1
-if(!z)if(b!=null){z=this.vi.lo
+if(!z)if(b!=null){z=this.R3.lo
 z=z==null||!J.xC(J.Vm(z),b)}else z=!1
 else z=!0
 if(z)throw H.b(Y.RV("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gQi())))
-this.vi.G()},
+this.R3.G()},
 Bp:function(){return this.lx(null,null)},
 GI:function(a){return this.lx(a,null)},
-Te:function(){if(this.vi.lo==null){this.rp.toString
-return C.OL}var z=this.Yq()
+Te:function(){if(this.R3.lo==null){this.r3.toString
+return C.x4}var z=this.ia()
 return z==null?null:this.mi(z,0)},
 mi:function(a,b){var z,y,x,w,v,u
-for(;z=this.vi.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.vi.lo),"(")){y=this.rD()
-this.rp.toString
-a=new U.Nb(a,null,y)}else if(J.xC(J.Vm(this.vi.lo),"[")){x=this.Ew()
-this.rp.toString
+for(;z=this.R3.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.R3.lo),"(")){y=this.rD()
+this.r3.toString
+a=new U.Nb(a,null,y)}else if(J.xC(J.Vm(this.R3.lo),"[")){x=this.Ew()
+this.r3.toString
 a=new U.zX(a,x)}else break
-else if(J.xC(J.Iz(this.vi.lo),3)){this.Bp()
-a=this.j6(a,this.Yq())}else if(J.xC(J.Iz(this.vi.lo),10))if(J.xC(J.Vm(this.vi.lo),"in")){if(!J.x(a).$isfp)H.vh(Y.RV("in... statements must start with an identifier"))
+else if(J.xC(J.Iz(this.R3.lo),3)){this.Bp()
+a=this.F0(a,this.ia())}else if(J.xC(J.Iz(this.R3.lo),10))if(J.xC(J.Vm(this.R3.lo),"in")){if(!J.x(a).$iselO)H.vh(Y.RV("in... statements must start with an identifier"))
 this.Bp()
 w=this.Te()
-this.rp.toString
-a=new U.X7S(a,w)}else if(J.xC(J.Vm(this.vi.lo),"as")){this.Bp()
+this.r3.toString
+a=new U.X7S(a,w)}else if(J.xC(J.Vm(this.R3.lo),"as")){this.Bp()
 w=this.Te()
-if(!J.x(w).$isfp)H.vh(Y.RV("'as' statements must end with an identifier"))
-this.rp.toString
+if(!J.x(w).$iselO)H.vh(Y.RV("'as' statements must end with an identifier"))
+this.r3.toString
 a=new U.px(a,w)}else break
-else{if(J.xC(J.Iz(this.vi.lo),8)){z=this.vi.lo.gnS()
+else{if(J.xC(J.Iz(this.R3.lo),8)){z=this.R3.lo.gnS()
 if(typeof z!=="number")return z.F()
 if(typeof b!=="number")return H.s(b)
 z=z>=b}else z=!1
-if(z)if(J.xC(J.Vm(this.vi.lo),"?")){this.lx(8,"?")
+if(z)if(J.xC(J.Vm(this.R3.lo),"?")){this.lx(8,"?")
 v=this.Te()
 this.GI(5)
 u=this.Te()
-this.rp.toString
+this.r3.toString
 a=new U.Dc(a,v,u)}else a=this.T1(a)
 else break}return a},
-j6:function(a,b){var z,y
+F0:function(a,b){var z,y
 z=J.x(b)
-if(!!z.$isfp){z=z.gP(b)
-this.rp.toString
-return new U.rX(a,z)}else if(!!z.$isNb&&!!J.x(b.gTf()).$isfp){z=J.Vm(b.gTf())
+if(!!z.$iselO){z=z.gP(b)
+this.r3.toString
+return new U.rX(a,z)}else if(!!z.$isNb&&!!J.x(b.gTf()).$iselO){z=J.Vm(b.gTf())
 y=b.gre()
-this.rp.toString
+this.r3.toString
 return new U.Nb(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
 T1:function(a){var z,y,x,w,v
-z=this.vi.lo
+z=this.R3.lo
 y=J.RE(z)
 if(!C.Nm.tg(C.fW,y.gP(z)))throw H.b(Y.RV("unknown operator: "+H.d(y.gP(z))))
 this.Bp()
-x=this.Yq()
-while(!0){w=this.vi.lo
-if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.vi.lo),3)||J.xC(J.Iz(this.vi.lo),9)){w=this.vi.lo.gnS()
+x=this.ia()
+while(!0){w=this.R3.lo
+if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.R3.lo),3)||J.xC(J.Iz(this.R3.lo),9)){w=this.R3.lo.gnS()
 v=z.gnS()
 if(typeof w!=="number")return w.D()
 if(typeof v!=="number")return H.s(v)
@@ -16108,121 +16301,121 @@
 w=v}else w=!1
 else w=!1
 if(!w)break
-x=this.mi(x,this.vi.lo.gnS())}y=y.gP(z)
-this.rp.toString
+x=this.mi(x,this.R3.lo.gnS())}y=y.gP(z)
+this.r3.toString
 return new U.uku(y,a,x)},
-Yq:function(){var z,y,x,w
-if(J.xC(J.Iz(this.vi.lo),8)){z=J.Vm(this.vi.lo)
+ia:function(){var z,y,x,w
+if(J.xC(J.Iz(this.R3.lo),8)){z=J.Vm(this.R3.lo)
 y=J.x(z)
 if(y.n(z,"+")||y.n(z,"-")){this.Bp()
-if(J.xC(J.Iz(this.vi.lo),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.vi.lo)),null,null)
-this.rp.toString
-z=new U.no(y)
+if(J.xC(J.Iz(this.R3.lo),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.R3.lo)),null,null)
+this.r3.toString
+z=new U.noG(y)
 z.$builtinTypeInfo=[null]
 this.Bp()
-return z}else{y=this.rp
-if(J.xC(J.Iz(this.vi.lo),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.vi.lo)),null)
+return z}else{y=this.r3
+if(J.xC(J.Iz(this.R3.lo),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.R3.lo)),null)
 y.toString
-z=new U.no(x)
+z=new U.noG(x)
 z.$builtinTypeInfo=[null]
 this.Bp()
 return z}else{w=this.mi(this.fq(),11)
 y.toString
 return new U.cJ(z,w)}}}else if(y.n(z,"!")){this.Bp()
 w=this.mi(this.fq(),11)
-this.rp.toString
+this.r3.toString
 return new U.cJ(z,w)}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.fq()},
 fq:function(){var z,y
-switch(J.Iz(this.vi.lo)){case 10:z=J.Vm(this.vi.lo)
+switch(J.Iz(this.R3.lo)){case 10:z=J.Vm(this.R3.lo)
 if(J.xC(z,"this")){this.Bp()
-this.rp.toString
-return new U.fp("this")}else if(C.Nm.tg(C.jY,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
+this.r3.toString
+return new U.elO("this")}else if(C.Nm.tg(C.jY,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
 throw H.b(Y.RV("unrecognized keyword: "+H.d(z)))
 case 2:return this.qK()
 case 1:return this.ef()
-case 6:return this.DS()
+case 6:return this.PP()
 case 7:return this.xJ()
-case 9:if(J.xC(J.Vm(this.vi.lo),"(")){this.Bp()
+case 9:if(J.xC(J.Vm(this.R3.lo),"(")){this.Bp()
 y=this.Te()
 this.lx(9,")")
-this.rp.toString
-return new U.XC(y)}else if(J.xC(J.Vm(this.vi.lo),"{"))return this.pH()
-else if(J.xC(J.Vm(this.vi.lo),"["))return this.S9()
+this.r3.toString
+return new U.XC(y)}else if(J.xC(J.Vm(this.R3.lo),"{"))return this.pH()
+else if(J.xC(J.Vm(this.R3.lo),"["))return this.S9()
 return
 case 5:throw H.b(Y.RV("unexpected token \":\""))
 default:return}},
 S9:function(){var z,y
 z=[]
 do{this.Bp()
-if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"]"))break
+if(J.xC(J.Iz(this.R3.lo),9)&&J.xC(J.Vm(this.R3.lo),"]"))break
 z.push(this.Te())
-y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
+y=this.R3.lo}while(y!=null&&J.xC(J.Vm(y),","))
 this.lx(9,"]")
 return new U.c0(z)},
 pH:function(){var z,y,x
 z=[]
 do{this.Bp()
-if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"}"))break
-y=J.Vm(this.vi.lo)
-this.rp.toString
-x=new U.no(y)
+if(J.xC(J.Iz(this.R3.lo),9)&&J.xC(J.Vm(this.R3.lo),"}"))break
+y=J.Vm(this.R3.lo)
+this.r3.toString
+x=new U.noG(y)
 x.$builtinTypeInfo=[null]
 this.Bp()
 this.lx(5,":")
 z.push(new U.ae(x,this.Te()))
-y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
+y=this.R3.lo}while(y!=null&&J.xC(J.Vm(y),","))
 this.lx(9,"}")
 return new U.Mm(z)},
 qK:function(){var z,y,x
-if(J.xC(J.Vm(this.vi.lo),"true")){this.Bp()
-this.rp.toString
-return H.VM(new U.no(!0),[null])}if(J.xC(J.Vm(this.vi.lo),"false")){this.Bp()
-this.rp.toString
-return H.VM(new U.no(!1),[null])}if(J.xC(J.Vm(this.vi.lo),"null")){this.Bp()
-this.rp.toString
-return H.VM(new U.no(null),[null])}if(!J.xC(J.Iz(this.vi.lo),2))H.vh(Y.RV("expected identifier: "+H.d(this.gQi())+".value"))
-z=J.Vm(this.vi.lo)
+if(J.xC(J.Vm(this.R3.lo),"true")){this.Bp()
+this.r3.toString
+return H.VM(new U.noG(!0),[null])}if(J.xC(J.Vm(this.R3.lo),"false")){this.Bp()
+this.r3.toString
+return H.VM(new U.noG(!1),[null])}if(J.xC(J.Vm(this.R3.lo),"null")){this.Bp()
+this.r3.toString
+return H.VM(new U.noG(null),[null])}if(!J.xC(J.Iz(this.R3.lo),2))H.vh(Y.RV("expected identifier: "+H.d(this.gQi())+".value"))
+z=J.Vm(this.R3.lo)
 this.Bp()
-this.rp.toString
-y=new U.fp(z)
+this.r3.toString
+y=new U.elO(z)
 x=this.rD()
 if(x==null)return y
 else return new U.Nb(y,null,x)},
 rD:function(){var z,y
-z=this.vi.lo
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"(")){y=[]
+z=this.R3.lo
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.R3.lo),"(")){y=[]
 do{this.Bp()
-if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),")"))break
+if(J.xC(J.Iz(this.R3.lo),9)&&J.xC(J.Vm(this.R3.lo),")"))break
 y.push(this.Te())
-z=this.vi.lo}while(z!=null&&J.xC(J.Vm(z),","))
+z=this.R3.lo}while(z!=null&&J.xC(J.Vm(z),","))
 this.lx(9,")")
 return y}return},
 Ew:function(){var z,y
-z=this.vi.lo
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"[")){this.Bp()
+z=this.R3.lo
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.R3.lo),"[")){this.Bp()
 y=this.Te()
 this.lx(9,"]")
 return y}return},
 ef:function(){var z,y
-z=J.Vm(this.vi.lo)
-this.rp.toString
-y=H.VM(new U.no(z),[null])
+z=J.Vm(this.R3.lo)
+this.r3.toString
+y=H.VM(new U.noG(z),[null])
 this.Bp()
 return y},
-Bu:function(a){var z,y
-z=H.BU(H.d(a)+H.d(J.Vm(this.vi.lo)),null,null)
-this.rp.toString
-y=H.VM(new U.no(z),[null])
+Nt:function(a){var z,y
+z=H.BU(H.d(a)+H.d(J.Vm(this.R3.lo)),null,null)
+this.r3.toString
+y=H.VM(new U.noG(z),[null])
 this.Bp()
 return y},
-DS:function(){return this.Bu("")},
-u3:function(a){var z,y
-z=H.RR(H.d(a)+H.d(J.Vm(this.vi.lo)),null)
-this.rp.toString
-y=H.VM(new U.no(z),[null])
+PP:function(){return this.Nt("")},
+rR:function(a){var z,y
+z=H.RR(H.d(a)+H.d(J.Vm(this.R3.lo)),null)
+this.r3.toString
+y=H.VM(new U.noG(z),[null])
 this.Bp()
 return y},
-xJ:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+xJ:function(){return this.rR("")}}}],["","",,K,{
 "^":"",
 eq:[function(a){return H.VM(new K.Bt(a),[null])},"$1","BQ",2,0,68,69],
 Aep:{
@@ -16254,7 +16447,7 @@
 if(z.G()){this.CD=H.VM(new K.Aep(this.wX++,z.gl()),[null])
 return!0}this.CD=null
 return!1},
-$asAnv:function(a){return[[K.Aep,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+$asAnv:function(a){return[[K.Aep,a]]}}}],["","",,Y,{
 "^":"",
 wX:function(a){switch(a){case 102:return 12
 case 110:return 10
@@ -16267,7 +16460,7 @@
 bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"$0","gAY",0,0,71],
 $isqS:true},
 xv:{
-"^":"a;MV,H4,jI,x0",
+"^":"a;MV,zy,jI,x0",
 zl:function(){var z,y,x,w,v,u,t,s
 z=this.jI
 this.x0=z.G()?z.Wn:null
@@ -16303,7 +16496,7 @@
 y=this.jI
 x=y.G()?y.Wn:null
 this.x0=x
-for(w=this.H4;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
+for(w=this.zy;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
 if(x===92){x=y.G()?y.Wn:null
 this.x0=x
 if(x==null)throw H.b(Y.RV("unterminated string"))
@@ -16315,7 +16508,7 @@
 this.x0=y.G()?y.Wn:null},
 zI:function(){var z,y,x,w,v
 z=this.jI
-y=this.H4
+y=this.zy
 while(!0){x=this.x0
 if(x!=null){if(typeof x!=="number")return H.s(x)
 if(!(97<=x&&x<=122))if(!(65<=x&&x<=90))w=48<=x&&x<=57||x===95||x===36||x>127
@@ -16331,7 +16524,7 @@
 y.vM=""},
 jj:function(){var z,y,x,w
 z=this.jI
-y=this.H4
+y=this.zy
 while(!0){x=this.x0
 if(x!=null){if(typeof x!=="number")return H.s(x)
 w=48<=x&&x<=57}else w=!1
@@ -16345,7 +16538,7 @@
 else this.MV.push(new Y.qS(3,".",11))}else{this.MV.push(new Y.qS(6,y.vM,0))
 y.vM=""}},
 qv:function(){var z,y,x,w
-z=this.H4
+z=this.zy
 z.KF(H.mx(46))
 y=this.jI
 while(!0){x=this.x0
@@ -16356,37 +16549,37 @@
 z.vM+=x
 this.x0=y.G()?y.Wn:null}this.MV.push(new Y.qS(7,z.vM,0))
 z.vM=""}},
-hA:{
+hAN:{
 "^":"a;G1>",
 bu:[function(a){return"ParseException: "+this.G1},"$0","gAY",0,0,71],
-static:{RV:function(a){return new Y.hA(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
+static:{RV:function(a){return new Y.hAN(a)}}}}],["","",,S,{
 "^":"",
-P55:{
+lW:{
 "^":"a;",
-DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,192,154]},
+DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,195,157]},
 cfS:{
-"^":"P55;",
+"^":"lW;",
 xn:function(a){},
 W9:function(a){this.xn(a)},
 LT:function(a){a.wz.RR(0,this)
 this.xn(a)},
-fV:function(a){J.okV(a.gTf(),this)
+T7:function(a){J.okV(a.gTf(),this)
 this.xn(a)},
 CU:function(a){J.okV(a.gTf(),this)
 J.okV(a.gJn(),this)
 this.xn(a)},
 Y7:function(a){var z
 J.okV(a.gTf(),this)
-if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.okV(z.lo,this)
+if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
 tx:function(a){this.xn(a)},
 Zh:function(a){var z
-for(z=a.ghL(),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.okV(z.lo,this)
+for(z=a.ghL(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
 o0:function(a){var z
-for(z=a.gRl(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.okV(z.lo,this)
+for(z=a.gRl(a),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
-YV:function(a){J.okV(a.gG3(a),this)
+EZ:function(a){J.okV(a.gG3(a),this)
 J.okV(a.gv4(),this)
 this.xn(a)},
 qs:function(a){this.xn(a)},
@@ -16395,21 +16588,21 @@
 this.xn(a)},
 xN:function(a){J.okV(a.gwz(),this)
 this.xn(a)},
-RD:function(a){J.okV(a.gdc(),this)
+RN:function(a){J.okV(a.gdc(),this)
 J.okV(a.gSl(),this)
 J.okV(a.gru(),this)
 this.xn(a)},
-e5:function(a){a.Bb.RR(0,this)
+ky:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
 this.xn(a)},
-xt:function(a){a.Bb.RR(0,this)
+Vw:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
-this.xn(a)}}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
+this.xn(a)}}}],["","",,T,{
 "^":"",
 ov:{
-"^":"V45;oX,t7,fI,Fd,cI,He,xo,ZJ,Kf,nu,Oq,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
-gIs:function(a){return a.oX},
-sIs:function(a,b){a.oX=this.ct(a,C.PX,a.oX,b)},
+"^":"V44;Ny,t7,fI,Fd,cI,He,xo,ZJ,PZ,Kf,nu,Oq,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
+gIs:function(a){return a.Ny},
+sIs:function(a,b){a.Ny=this.ct(a,C.PX,a.Ny,b)},
 gfg:function(a){return a.t7},
 sfg:function(a,b){a.t7=this.ct(a,C.A7,a.t7,b)},
 gGV:function(a){return a.fI},
@@ -16424,14 +16617,17 @@
 sxT:function(a,b){a.xo=this.ct(a,C.nt,a.xo,b)},
 giZ:function(a){return a.ZJ},
 siZ:function(a,b){a.ZJ=this.ct(a,C.vs,a.ZJ,b)},
+gTj:function(a){return a.PZ},
+sTj:function(a,b){a.PZ=this.ct(a,C.uG,a.PZ,b)},
 gGd:function(a){return a.Kf},
 sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
 Nn:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,14,43],
-mJ5:[function(a,b,c){var z,y
+SQ:function(a){var z,y
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#line-"+H.d(a.He))
 if(z!=null){y=!!z.scrollIntoViewIfNeeded
 if(y)z.scrollIntoViewIfNeeded()
-else z.scrollIntoView()}},"$2","gFG",4,0,193,194,195],
+else z.scrollIntoView()}},
+Un:[function(a,b,c){this.SQ(a)},"$2","gFG",4,0,196,197,198],
 Es:function(a){var z,y
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector(".sourceTable")
@@ -16441,54 +16637,98 @@
 dQ:function(a){var z=a.nu
 if(z!=null){z.disconnect()
 a.nu=null}Z.uL.prototype.dQ.call(this,a)},
-GA:[function(a,b){this.mC(a)},"$1","goL",2,0,19,59],
-Yo:[function(a,b){this.mC(a)},"$1","gie",2,0,19,59],
+NQ:[function(a,b){this.mC(a)
+this.SQ(a)},"$1","goL",2,0,19,59],
+KC:[function(a,b){this.mC(a)},"$1","gie",2,0,19,59],
 Ti:[function(a,b){this.mC(a)},"$1","gRq",2,0,19,59],
 ok:[function(a,b){this.mC(a)},"$1","gcY",2,0,19,59],
 mC:function(a){var z,y,x
+a.PZ=this.ct(a,C.uG,a.PZ,!1)
 if(a.Oq!=null)return
-z=a.oX
+z=a.Ny
 if(z==null)return
-if(J.iS(z)!==!0){a.Oq=J.SK(a.oX).ml(new T.Es(a))
+if(J.iS(z)!==!0){a.Oq=J.SK(a.Ny).ml(new T.Es(a))
 return}z=a.Fd
-z=z!=null?a.oX.q6(z):1
+z=z!=null?a.Ny.q6(z):1
 a.xo=this.ct(a,C.nt,a.xo,z)
 z=a.fI
-z=z!=null?a.oX.q6(z):null
+z=z!=null?a.Ny.q6(z):null
 a.He=this.ct(a,C.kI,a.He,z)
 z=a.cI
-y=a.oX
+y=a.Ny
 z=z!=null?y.q6(z):J.q8(J.de(y))
 a.ZJ=this.ct(a,C.vs,a.ZJ,z)
 J.Z8(a.Kf)
-for(x=J.Hn(a.xo,1);z=J.Wx(x),z.E(x,J.Hn(a.ZJ,1));x=z.g(x,1))J.bi(a.Kf,J.UQ(J.de(a.oX),x))},
+for(x=J.Hn(a.xo,1);z=J.Wx(x),z.E(x,J.Hn(a.ZJ,1));x=z.g(x,1))J.bi(a.Kf,J.UQ(J.de(a.Ny),x))
+a.PZ=this.ct(a,C.uG,a.PZ,!0)},
 static:{T5i:function(a){var z,y,x
 z=R.tB([])
 y=P.L5(null,null,null,P.qU,W.I0)
 x=P.qU
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
 a.t7=null
+a.PZ=!1
 a.Kf=z
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=y
 a.ZQ=x
 C.za.ZL(a)
 C.za.XI(a)
 return a}}},
-V45:{
+V44:{
 "^":"uL+Pi;",
 $isd3:true},
 Es:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(J.iS(z.oX)===!0){z.Oq=null
+if(J.iS(z.Ny)===!0){z.Oq=null
 J.TG(z)}},"$1",null,2,0,null,13,"call"],
-$isEH:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
+$isEH:true},
+vr:{
+"^":"V45;X9,xt,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
+gRd:function(a){return a.X9},
+sRd:function(a,b){a.X9=this.ct(a,C.VI,a.X9,b)},
+gv8:function(a){return a.xt},
+sv8:function(a,b){a.xt=this.ct(a,C.S4,a.xt,b)},
+Wp:[function(a,b,c,d){var z,y
+z=a.xt
+if(z===!0)return
+a.xt=this.ct(a,C.S4,z,!0)
+z=a.X9.gqr()
+y=a.X9
+if(z==null)J.aT(J.zH(y)).G5(J.zH(a.X9),J.f2(a.X9)).ml(new T.eE(a))
+else J.aT(J.zH(y)).h4(a.X9.gqr()).ml(new T.b3(a))},"$3","gQP",6,0,82,49,50,83],
+static:{xA:function(a){var z,y
+z=P.L5(null,null,null,P.qU,W.I0)
+y=P.qU
+y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+a.xt=!1
+a.Cc=[]
+a.Ap=!1
+a.oG=!1
+a.ZM=z
+a.ZQ=y
+C.FC.ZL(a)
+C.FC.XI(a)
+return a}}},
+V45:{
+"^":"uL+Pi;",
+$isd3:true},
+eE:{
+"^":"TpZ:12;a",
+$1:[function(a){var z=this.a
+z.xt=J.Q5(z,C.S4,z.xt,!1)},"$1",null,2,0,null,13,"call"],
+$isEH:true},
+b3:{
+"^":"TpZ:12;b",
+$1:[function(a){var z=this.b
+z.xt=J.Q5(z,C.S4,z.xt,!1)},"$1",null,2,0,null,13,"call"],
+$isEH:true}}],["","",,A,{
 "^":"",
 kn:{
-"^":"oEY;jJ,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"oEY;jJ,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gBV:function(a){return a.jJ},
 sBV:function(a,b){a.jJ=this.ct(a,C.tW,a.jJ,b)},
 gJp:function(a){var z=a.tY
@@ -16515,7 +16755,7 @@
 a.jJ=-1
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -16524,10 +16764,10 @@
 return a}}},
 oEY:{
 "^":"xI+Pi;",
-$isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
+$isd3:true}}],["","",,U,{
 "^":"",
 fI:{
-"^":"V46;Uz,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V46;Uz,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gIs:function(a){return a.Uz},
 sIs:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
 Es:function(a){var z
@@ -16535,14 +16775,14 @@
 z=a.Uz
 if(z==null)return
 J.SK(z)},
-SK:[function(a,b){J.cI(a.Uz).YM(b)},"$1","gvC",2,0,19,98],
-j9:[function(a,b){J.eg(a.Uz).YM(b)},"$1","gDX",2,0,19,98],
+SK:[function(a,b){J.cI(a.Uz).YM(b)},"$1","gvC",2,0,19,100],
+Ur:[function(a,b){J.eg(a.Uz).YM(b)},"$1","gDX",2,0,19,100],
 static:{UF:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -16551,7 +16791,7 @@
 return a}}},
 V46:{
 "^":"uL+Pi;",
-$isd3:true}}],["service","package:observatory/service.dart",,D,{
+$isd3:true}}],["","",,D,{
 "^":"",
 Xm:[function(a,b){return J.FW(J.O6(a),J.O6(b))},"$2","E0",4,0,70],
 Nl:function(a,b){var z,y,x,w,v,u,t,s,r,q
@@ -16627,7 +16867,7 @@
 q.$builtinTypeInfo=[t]
 t=P.L5(null,null,null,P.qU,P.CP)
 t=R.tB(t)
-s=new D.bv(x,null,!1,!1,!0,!1,w,new D.tL(v,u,null,null,20,0),null,r,null,q,null,null,null,null,null,t,new D.eK(0,0,0,0,0,0,null,null),new D.eK(0,0,0,0,0,0,null,null),null,null,null,null,null,null,null,z,null,null,!1,null,null,null,null,null)
+s=new D.bv(x,null,!1,!1,!0,!1,w,new D.tL(v,u,null,null,20,0),null,r,null,q,null,null,null,null,null,t,new D.eK(0,0,0,0,0,0,null,null),new D.eK(0,0,0,0,0,0,null,null),null,null,null,null,null,null,null,null,null,z,null,null,!1,null,null,null,null,null)
 break
 case"Library":z=D.U4
 x=[]
@@ -16656,7 +16896,6 @@
 t.$builtinTypeInfo=[z]
 s=new D.U4(null,x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"Null":return
 case"ServiceError":s=new D.N7(null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"ServiceEvent":s=new D.Mk(null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
@@ -16676,6 +16915,8 @@
 z.$builtinTypeInfo=[null,null]
 s=new D.vO(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
 return s},
+UW:function(a){if(!!J.x(a).$isvO&&J.xC(a.mQ,"Null"))return
+return a},
 bF:function(a){var z
 if(a!=null){z=J.U6(a)
 z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
@@ -16686,7 +16927,7 @@
 else if(!!z.$iswn)D.f3(a,b)},
 Gf:function(a,b){a.aN(0,new D.Qf(a,b))},
 f3:function(a,b){var z,y,x,w,v,u
-for(z=a.ao,y=0;y<z.length;++y){x=z[y]
+for(z=a.XH,y=0;y<z.length;++y){x=z[y]
 w=J.x(x)
 v=!!w.$isqC
 if(v)u=w.t(x,"id")!=null&&w.t(x,"type")!=null
@@ -16727,10 +16968,10 @@
 if(w!=null&&!J.xC(w,z.t(a,"id")));this.r0=z.t(a,"id")
 this.mQ=x
 this.bF(0,a,y)},
-Mq:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gLc",2,0,163,196],
+Mq:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gua",2,0,166,199],
 $isaf:true},
 Bf:{
-"^":"TpZ:198;a",
+"^":"TpZ:201;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
@@ -16738,7 +16979,7 @@
 y=this.a
 if(!J.xC(z,y.mQ))return D.Nl(y.P3,a)
 y.eC(a)
-return y},"$1",null,2,0,null,197,"call"],
+return y},"$1",null,2,0,null,200,"call"],
 $isEH:true},
 n1:{
 "^":"TpZ:74;b",
@@ -16747,16 +16988,16 @@
 boh:{
 "^":"a;",
 O5:function(a){J.Me(a,new D.P5(this))},
-Ms:[function(a){return this.gwv(this).jU(this.Mq("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,199]},
+Ms:[function(a){return this.gwv(this).jU(this.Mq("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,202]},
 P5:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,200,"call"],
+z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,203,"call"],
 $isEH:true},
 Rv:{
-"^":"TpZ:198;a",
+"^":"TpZ:201;a",
 $1:[function(a){var z=this.a
-z.O5(D.Nl(J.xC(z.gzS(),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,197,"call"],
+z.O5(D.Nl(J.xC(z.gzS(),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,200,"call"],
 $isEH:true},
 xm:{
 "^":"af;"},
@@ -16767,12 +17008,12 @@
 giR:function(){var z=this.z7
 return z.gUQ(z)},
 gPj:function(a){return H.d(this.r0)},
-Mq:[function(a){return H.d(a)},"$1","gLc",2,0,163,196],
+Mq:[function(a){return H.d(a)},"$1","gua",2,0,166,199],
 gYe:function(a){return this.Ox},
 gJk:function(){return this.RW},
 gA3:function(){return this.Ts},
 gEy:function(){return this.Va},
-gU6:function(){return this.kU},
+gcD:function(){return this.kU},
 gPE:function(){return this.l7},
 EM:function(a){var z,y,x,w
 z={}
@@ -16834,7 +17075,7 @@
 y=z.t(b,"version")
 this.Ox=F.Wi(this,C.zn,this.Ox,y)
 y=z.t(b,"architecture")
-this.GY=F.Wi(this,C.ke,this.GY,y)
+this.GY=F.Wi(this,C.US,this.GY,y)
 y=z.t(b,"uptime")
 this.RW=F.Wi(this,C.mh,this.RW,y)
 y=P.Wu(H.BU(z.t(b,"date"),null,null),!1)
@@ -16872,12 +17113,12 @@
 z=D.Nl(a,this.a.a)
 y=this.b.Rk
 if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)},"$1",null,2,0,null,201,"call"],
+y.Iv(z)},"$1",null,2,0,null,204,"call"],
 $isEH:true},
 MZ:{
 "^":"TpZ:12;a,b",
 $1:[function(a){if(!J.x(a).$iswv)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,140,"call"],
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,144,"call"],
 $isEH:true},
 it:{
 "^":"TpZ:12;a,b",
@@ -16888,12 +17129,12 @@
 else return a.cv(z)},"$1",null,2,0,null,6,"call"],
 $isEH:true},
 lb:{
-"^":"TpZ:198;c,d",
+"^":"TpZ:201;c,d",
 $1:[function(a){var z,y
 z=this.c
 y=D.Nl(z,a)
 if(y.gUm())z.Qy.to(0,this.d,new D.QZ(y))
-return y},"$1",null,2,0,null,197,"call"],
+return y},"$1",null,2,0,null,200,"call"],
 $isEH:true},
 QZ:{
 "^":"TpZ:74;e",
@@ -16902,7 +17143,7 @@
 zA:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-return z.N7(z.ng(a))},"$1",null,2,0,null,144,"call"],
+return z.N7(z.ng(a))},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 tm:{
 "^":"TpZ:12;b",
@@ -16920,7 +17161,7 @@
 $1:[function(a){var z=this.c.Li
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,86,"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,88,"call"],
 $isEH:true},
 hc:{
 "^":"TpZ:12;",
@@ -16957,7 +17198,7 @@
 if(!(w<v))break
 u=z.t(b,w)
 if(w>=x)return H.e(y,w)
-y[w]=J.z8(y[w],u)?y[w]:u;++w}},
+y[w]=J.xZ(y[w],u)?y[w]:u;++w}},
 CJ:function(){var z,y,x
 for(z=this.XE,y=z.length,x=0;x<y;++x)z[x]=0},
 $isER:true},
@@ -17018,7 +17259,7 @@
 z=z.t(a,"avgCollectionPeriodMillis")
 this.hu=F.Wi(this,C.BE,this.hu,z)}},
 bv:{
-"^":"bvc;V3,Jr,EY,eU,yP,XV,Qy,GH,Wm,AI,v9,tW,zb,bN:KT@,GR:f5@,i9,cL,Y8,UY<,xQ<,vJ,yv,BC<,FF,bj,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+"^":"bvc;V3,Jr,EY,eU,yP,XV,Qy,GH,Wm,AI,v9,tW,zb,bN:KT@,GR:f5@,i9,cL,Y8,UY<,xQ<,ip,yv,BC<,I5,bj,iD<,QR,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gwv:function(a){return this.P3},
 god:function(a){return this},
 gXE:function(a){return this.V3},
@@ -17028,7 +17269,7 @@
 gA6:function(){return this.EY},
 gaj:function(){return this.eU},
 gMN:function(){return this.yP},
-Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gLc",2,0,163,196],
+Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gua",2,0,166,199],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
@@ -17046,12 +17287,12 @@
 for(z=J.mY(y);z.G();){w=z.gl()
 J.UQ(w,"code").Il(w,b,x)}},
 WR:function(){return this.cv("classes").ml(this.geL()).ml(this.gMh())},
-Dw:[function(a){var z,y,x,w
+ND:[function(a){var z,y,x,w
 z=[]
 for(y=J.mY(J.UQ(a,"members"));y.G();){x=y.gl()
 w=J.x(x)
-if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","geL",2,0,202,203],
-Nze:[function(a){var z,y,x,w
+if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","geL",2,0,205,206],
+OV:[function(a){var z,y,x,w
 z=this.AI
 z.V1(z)
 this.Wm=F.Wi(this,C.jo,this.Wm,null)
@@ -17060,7 +17301,7 @@
 if(J.xC(x.gTX(),"Object")&&J.xC(x.gi2(),!1)){w=this.Wm
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.jo,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gMh",2,0,204,205],
+this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gMh",2,0,207,208],
 Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -17101,6 +17342,7 @@
 if(c)return
 this.kT=!0
 this.yP=F.Wi(this,C.DY,this.yP,!1)
+this.Xb()
 x=z.t(b,"pauseEvent")
 if(x!=null){y=J.U6(x)
 if(J.xC(y.t(x,"type"),"DebuggerEvent"))y.u(x,"type","ServiceEvent")}D.kT(b,this)
@@ -17163,40 +17405,73 @@
 y.FV(0,z.t(b,"libraries"))
 y.GT(y,D.E0())},
 m7:function(){return this.P3.jU("/"+H.d(this.r0)+"/profile/tag").ml(new D.O5(this))},
-aU:function(a,b){this.FF=0
+aU:function(a,b){this.I5=0
 this.bj=a
 if(a==null)return
 if(J.u6(J.q8(a),3))return
-return this.AW(b)},
-AW:function(a){var z,y,x,w,v,u,t,s,r,q
+return this.tw(b)},
+tw:function(a){var z,y,x,w,v,u,t,s,r,q
 z=this.bj
-y=this.FF
+y=this.I5
 if(typeof y!=="number")return y.g()
-this.FF=y+1
+this.I5=y+1
 x=J.UQ(z,y)
 if(x>>>0!==x||x>=a.length)return H.e(a,x)
 w=a[x]
 y=this.bj
-z=this.FF
+z=this.I5
 if(typeof z!=="number")return z.g()
-this.FF=z+1
+this.I5=z+1
 v=J.UQ(y,z)
 z=[]
 z.$builtinTypeInfo=[D.D5]
 u=new D.D5(w,v,z,0)
 y=this.bj
-t=this.FF
+t=this.I5
 if(typeof t!=="number")return t.g()
-this.FF=t+1
+this.I5=t+1
 s=J.UQ(y,t)
 if(typeof s!=="number")return H.s(s)
 r=0
-for(;r<s;++r){q=this.AW(a)
+for(;r<s;++r){q=this.tw(a)
 z.push(q)
 y=u.Jv
 t=q.Av
 if(typeof t!=="number")return H.s(t)
 u.Jv=y+t}return u},
+pU:function(a){var z,y,x,w,v,u
+z=J.U6(a)
+y=J.UQ(z.t(a,"location"),"script")
+x=J.UQ(z.t(a,"location"),"tokenPos")
+z=J.RE(y)
+if(z.gox(y)===!0){w=y.q6(x)
+J.UQ(z.gGd(y),J.Hn(w,1)).sqr(a)}else{z=z.xW(y)
+z.toString
+v=$.X3
+u=new P.Gc(0,v,null,null,v.wY(new D.Ye(this,a)),null,P.VH(null,$.X3),null)
+u.$builtinTypeInfo=[null]
+z.au(u)}},
+CE:function(a){var z,y,x,w,v,u
+z=this.iD
+if(z!=null)for(z=J.mY(J.UQ(z,"breakpoints"));z.G();){y=z.gl()
+x=J.U6(y)
+w=J.UQ(x.t(y,"location"),"script")
+v=J.UQ(x.t(y,"location"),"tokenPos")
+x=J.RE(w)
+if(x.gox(w)===!0){u=w.q6(v)
+J.UQ(x.gGd(w),J.Hn(u,1)).sqr(null)}}for(z=J.mY(J.UQ(a,"breakpoints"));z.G();)this.pU(z.gl())
+this.iD=a},
+Xb:function(){var z=this.QR
+if(z==null){z=this.cv("debug/breakpoints").ml(new D.y4(this)).YM(new D.Cm(this))
+this.QR=z}return z},
+G5:function(a,b){return this.cv(J.ew(J.eS(a),"/setBreakpoint?line="+H.d(b))).ml(new D.fx(this,a,b))},
+h4:function(a){return this.cv(H.d(J.eS(a))+"/clear").ml(new D.fw(this,a))},
+yy:[function(a){return this.cv("debug/pause").ml(new D.ry(this))},"$0","gX0",0,0,202],
+QE:[function(a){return this.cv("debug/resume").ml(new D.LO(this))},"$0","gDQ",0,0,202],
+fV:[function(a){P.FL("isolate.stepInto")
+return this.cv("debug/resume?step=into").ml(new D.qD(this))},"$0","gLc",0,0,202],
+Fc:[function(a){return this.cv("debug/resume?step=over").ml(new D.A6(this))},"$0","gqF",0,0,202],
+h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.xK(this))},"$0","gVX",0,0,202],
 $isbv:true,
 static:{"^":"ZGx"}},
 PKX:{
@@ -17216,12 +17491,12 @@
 a.Oo.V1(0)}},
 $isEH:true},
 KQ:{
-"^":"TpZ:198;a,b",
+"^":"TpZ:201;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.Nl(z,a)
 if(y.gUm())z.Qy.to(0,this.b,new D.Ea(y))
-return y},"$1",null,2,0,null,197,"call"],
+return y},"$1",null,2,0,null,200,"call"],
 $isEH:true},
 Ea:{
 "^":"TpZ:74;c",
@@ -17230,16 +17505,67 @@
 Qq:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,206,"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,209,"call"],
 $isEH:true},
 O5:{
-"^":"TpZ:198;a",
+"^":"TpZ:201;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
 y=this.a.GH
 y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,157,"call"],
+return y},"$1",null,2,0,null,160,"call"],
+$isEH:true},
+Ye:{
+"^":"TpZ:12;a,b",
+$1:[function(a){this.a.pU(this.b)},"$1",null,2,0,null,13,"call"],
+$isEH:true},
+y4:{
+"^":"TpZ:12;a",
+$1:[function(a){this.a.CE(a)},"$1",null,2,0,null,210,"call"],
+$isEH:true},
+Cm:{
+"^":"TpZ:74;b",
+$0:[function(){this.b.QR=null},"$0",null,0,0,null,"call"],
+$isEH:true},
+fx:{
+"^":"TpZ:12;a,b,c",
+$1:[function(a){if(!!J.x(a).$ispD)J.UQ(J.de(this.b),J.Hn(this.c,1)).sj9(!1)
+return this.a.Xb()},"$1",null,2,0,null,144,"call"],
+$isEH:true},
+fw:{
+"^":"TpZ:12;a,b",
+$1:[function(a){var z,y
+if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+z=this.a
+y=z.Jr
+if(y!=null&&y.gQ1()!=null&&J.xC(J.UQ(z.Jr.gQ1(),"id"),J.UQ(this.b,"id")))return z.RE(0)
+else return z.Xb()},"$1",null,2,0,null,144,"call"],
+$isEH:true},
+ry:{
+"^":"TpZ:12;a",
+$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+return this.a.RE(0)},"$1",null,2,0,null,144,"call"],
+$isEH:true},
+LO:{
+"^":"TpZ:12;a",
+$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+return this.a.RE(0)},"$1",null,2,0,null,144,"call"],
+$isEH:true},
+qD:{
+"^":"TpZ:12;a",
+$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+return this.a.RE(0)},"$1",null,2,0,null,144,"call"],
+$isEH:true},
+A6:{
+"^":"TpZ:12;a",
+$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+return this.a.RE(0)},"$1",null,2,0,null,144,"call"],
+$isEH:true},
+xK:{
+"^":"TpZ:12;a",
+$1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
+return this.a.RE(0)},"$1",null,2,0,null,144,"call"],
 $isEH:true},
 vO:{
 "^":"af;RF,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
@@ -17276,12 +17602,12 @@
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 HC:[function(a){var z=this.RF
-return z.HC(z)},"$0","gDx",0,0,120],
+return z.HC(z)},"$0","gDx",0,0,123],
 nq:function(a,b){var z=this.RF
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
-k0:[function(a){return},"$0","gqw",0,0,17],
-Yd:[function(a){this.RF.AP=null
+Tr:[function(a){return},"$0","gqw",0,0,17],
+NB:[function(a){this.RF.AP=null
 return},"$0","gym",0,0,17],
 gqh:function(a){var z=this.RF
 return z.gqh(z)},
@@ -17317,7 +17643,8 @@
 z="DartError "+H.d(this.I0)
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
-this.GR=this.ct(this,C.Tc,this.GR,z)}},
+this.GR=this.ct(this,C.Tc,this.GR,z)},
+$ispD:true},
 wVq:{
 "^":"af+Pi;",
 $isd3:true},
@@ -17442,9 +17769,9 @@
 sWt:function(a,b){this.wf=F.Wi(this,C.yB,this.wf,b)},
 gfj:function(){return this.rT}},
 Iy:{
-"^":"a;bi<,l<",
+"^":"a;hb<,l<",
 eC:function(a){var z,y,x
-z=this.bi
+z=this.hb
 y=J.U6(a)
 x=y.t(a,6)
 z.wf=F.Wi(z,C.yB,z.wf,x)
@@ -17457,13 +17784,13 @@
 x.rT=F.Wi(x,C.hN,x.rT,y)},
 static:{"^":"jZx,xxx,qWF,SP7,S1O,wXu,WVi,JQ"}},
 dy:{
-"^":"cOr;Gz,ar,x8,Lh,vY,u0,J1,E8,qG,dN,yv,UY<,xQ<,ks>,S5<,tJ<,mu<,p2<,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+"^":"cOr;Gz,ar,kJ,Lh,vY,u0,J1,E8,qG,dN,yv,UY<,xQ<,ks>,S5<,tJ<,mu<,p2<,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gHt:function(a){return this.Gz},
 sHt:function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},
 gIs:function(a){return this.ar},
 sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-guj:function(){return this.x8},
-suj:function(a){this.x8=F.Wi(this,C.Cw,this.x8,a)},
+guj:function(){return this.kJ},
+suj:function(a){this.kJ=F.Wi(this,C.Cw,this.kJ,a)},
 gVM:function(){return this.Lh},
 gRs:function(){return this.vY},
 gi2:function(){return this.J1},
@@ -17473,13 +17800,13 @@
 sej:function(a){this.dN=F.Wi(this,C.Fe,this.dN,a)},
 gkc:function(a){return this.yv},
 skc:function(a,b){this.yv=F.Wi(this,C.yh,this.yv,b)},
-gJL:function(){var z,y
+gMp:function(){var z,y
 z=this.UY
-y=z.bi
+y=z.hb
 if(J.xC(y.wf,0)&&J.xC(y.rT,0)){z=z.l
 z=J.xC(z.wf,0)&&J.xC(z.rT,0)}else z=!1
 if(z){z=this.xQ
-y=z.bi
+y=z.hb
 if(J.xC(y.wf,0)&&J.xC(y.rT,0)){z=z.l
 z=J.xC(z.wf,0)&&J.xC(z.rT,0)}else z=!1}else z=!1
 return z},
@@ -17526,8 +17853,8 @@
 y.FV(0,z.t(b,"functions"))
 y.GT(y,D.E0())
 y=z.t(b,"super")
-y=F.Wi(this,C.Cw,this.x8,y)
-this.x8=y
+y=F.Wi(this,C.Cw,this.kJ,y)
+this.kJ=y
 if(y!=null)y.Ib(this)
 y=z.t(b,"error")
 this.yv=F.Wi(this,C.yh,this.yv,y)
@@ -17545,7 +17872,7 @@
 cOr:{
 "^":"ZzQ+Pi;",
 $isd3:true},
-Hk:{
+ma:{
 "^":"a;zt",
 bu:[function(a){return this.zt},"$0","gAY",0,0,74],
 Q2:function(){return C.Nm.tg([$.b1(),$.l3(),$.zx(),$.MQ()],this)},
@@ -17620,9 +17947,9 @@
 this.qG=F.Wi(this,C.z6,this.qG,y)
 y=z.t(b,"endTokenPos")
 this.dN=F.Wi(this,C.Fe,this.dN,y)
-y=z.t(b,"code")
+y=D.UW(z.t(b,"code"))
 this.TD=F.Wi(this,C.i4,this.TD,y)
-y=z.t(b,"unoptimized_code")
+y=D.UW(z.t(b,"unoptimized_code"))
 this.NM=F.Wi(this,C.OU,this.NM,y)
 y=z.t(b,"is_optimizable")
 this.vf=F.Wi(this,C.Vl,this.vf,y)
@@ -17644,10 +17971,43 @@
 "^":"wvY+Pi;",
 $isd3:true},
 c2:{
-"^":"Pi;Rd<,a4>,x9,AP,fn",
+"^":"Pi;Is>,Rd>,a4>,x9,Yp,am,AP,fn",
 gu9:function(){return this.x9},
 su9:function(a){this.x9=F.Wi(this,C.Ss,this.x9,a)},
-$isc2:true},
+gqr:function(){return this.Yp},
+sqr:function(a){var z=this.Yp
+if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.WC,z,a)
+z.$builtinTypeInfo=[null]
+this.nq(this,z)}this.Yp=a},
+gj9:function(){return this.am},
+sj9:function(a){this.am=F.Wi(this,C.Jf,this.am,a)},
+jY:function(a,b,c){var z,y,x,w,v,u,t
+z=D.eG(this.a4)
+this.am=F.Wi(this,C.Jf,this.am,!z)
+for(z=this.Is,y=J.mY(J.UQ(J.aT(z.P3).giD(),"breakpoints")),x=this.Rd;y.G();){w=y.gl()
+v=J.U6(w)
+u=J.UQ(v.t(w,"location"),"script")
+t=J.UQ(v.t(w,"location"),"tokenPos")
+if(J.xC(u,z)&&J.xC(u.q6(t),x)){v=this.Yp
+if(this.gnz(this)&&!J.xC(v,w)){v=new T.qI(this,C.WC,v,w)
+v.$builtinTypeInfo=[null]
+this.nq(this,v)}this.Yp=w}}},
+$isc2:true,
+static:{Fu:function(a){var z,y
+z=J.x(a)
+if(z.n(a,"else"))return!0
+z=z.Fr(a,"")
+y=new H.a7(z,z.length,0,null)
+y.$builtinTypeInfo=[H.u3(z,0)]
+for(;y.G();)switch(y.lo){case"{":case"}":case"(":case")":case";":break
+default:return!1}return!0},eG:function(a){var z,y,x,w
+z=J.It(a,new H.VR("(\\s)+",H.v4("(\\s)+",!1,!0,!1),null,null))
+for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){x=J.It(y.lo,new H.VR("(\\b)",H.v4("(\\b)",!1,!0,!1),null,null))
+w=new H.a7(x,x.length,0,null)
+w.$builtinTypeInfo=[H.u3(x,0)]
+for(;w.G();)if(!D.Fu(w.lo))return!1}return!0},NQ:function(a,b,c){var z=new D.c2(a,b,c,null,null,!0,null,null)
+z.jY(a,b,c)
+return z}}},
 vx:{
 "^":"vix;Gd>,d6,I0,U9,nE,EG,Ge,wA,y6,FB,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gfY:function(a){return this.I0},
@@ -17657,7 +18017,7 @@
 gM8:function(){return!0},
 rK:function(a){var z,y
 z=J.Hn(a,1)
-y=this.Gd.ao
+y=this.Gd.XH
 if(z>>>0!==z||z>=y.length)return H.e(y,z)
 return y[z]},
 q6:function(a){return this.y6.t(0,a)},
@@ -17681,7 +18041,7 @@
 this.PT(z.t(b,"tokenPosTable"))
 z=z.t(b,"owning_library")
 this.EG=F.Wi(this,C.If,this.EG,z)},
-PT:function(a){var z,y,x,w,v,u,t,s,r,q,p
+PT:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 if(a==null)return
 z=this.y6
 z.V1(0)
@@ -17689,34 +18049,37 @@
 y.V1(0)
 this.U9=F.Wi(this,C.Gd,this.U9,null)
 this.nE=F.Wi(this,C.kA,this.nE,null)
-for(x=J.mY(a);x.G();){w=x.gl()
-v=J.U6(w)
-u=v.t(w,0)
-t=1
-while(!0){s=v.gB(w)
-if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
-r=v.t(w,t)
-q=v.t(w,t+1)
-s=this.U9
-if(s==null){if(this.gnz(this)&&!J.xC(s,r)){s=new T.qI(this,C.Gd,s,r)
-s.$builtinTypeInfo=[null]
-this.nq(this,s)}this.U9=r
-s=this.nE
-if(this.gnz(this)&&!J.xC(s,r)){s=new T.qI(this,C.kA,s,r)
-s.$builtinTypeInfo=[null]
-this.nq(this,s)}this.nE=r}else{s=J.Bl(s,r)?this.U9:r
-p=this.U9
-if(this.gnz(this)&&!J.xC(p,s)){p=new T.qI(this,C.Gd,p,s)
-p.$builtinTypeInfo=[null]
-this.nq(this,p)}this.U9=s
-s=J.J5(this.nE,r)?this.nE:r
-p=this.nE
-if(this.gnz(this)&&!J.xC(p,s)){p=new T.qI(this,C.kA,p,s)
-p.$builtinTypeInfo=[null]
-this.nq(this,p)}this.nE=s}z.u(0,r,u)
-y.u(0,r,q)
-t+=2}}},
+x=P.Ls(null,null,null,null)
+for(w=J.mY(a);w.G();){v=w.gl()
+u=J.U6(v)
+t=u.t(v,0)
+x.h(0,t)
+s=1
+while(!0){r=u.gB(v)
+if(typeof r!=="number")return H.s(r)
+if(!(s<r))break
+q=u.t(v,s)
+p=u.t(v,s+1)
+r=this.U9
+if(r==null){if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.Gd,r,q)
+r.$builtinTypeInfo=[null]
+this.nq(this,r)}this.U9=q
+r=this.nE
+if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.kA,r,q)
+r.$builtinTypeInfo=[null]
+this.nq(this,r)}this.nE=q}else{r=J.Bl(r,q)?this.U9:q
+o=this.U9
+if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.Gd,o,r)
+o.$builtinTypeInfo=[null]
+this.nq(this,o)}this.U9=r
+r=J.J5(this.nE,q)?this.nE:q
+o=this.nE
+if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.kA,o,r)
+o.$builtinTypeInfo=[null]
+this.nq(this,o)}this.nE=r}z.u(0,q,t)
+y.u(0,q,p)
+s+=2}}for(z=this.Gd,z=z.gA(z);z.G();){v=z.lo
+if(!x.tg(0,J.f2(v)))v.sj9(!1)}},
 SC:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=this.d6
@@ -17739,12 +18102,10 @@
 y.V1(y)
 N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
 for(x=0;x<z.length;x=w){w=x+1
-y.h(0,new D.c2(w,z[x],null,null,null))}this.zL()},
+y.h(0,D.NQ(this,w,z[x]))}this.zL()},
 zL:function(){var z,y,x
-z=this.Gd
-if(z.ao.length===0)return
-for(z=z.gA(z),y=this.d6;z.G();){x=z.lo
-x.su9(y.t(0,x.gRd()))}},
+for(z=this.Gd,z=z.gA(z),y=this.d6;z.G();){x=z.lo
+x.su9(y.t(0,J.f2(x)))}},
 $isvx:true},
 Vlh:{
 "^":"af+boh;"},
@@ -17775,10 +18136,10 @@
 this.up=F.Wi(this,C.oI,this.up,z)},
 $isZ9:true},
 Q4:{
-"^":"Pi;Yu<,jA,L4<,dh,uH<,AP,fn",
+"^":"Pi;Yu<,vI,L4<,dh,uH<,AP,fn",
 gEB:function(){return this.dh},
 gUB:function(){return J.xC(this.Yu,0)},
-gGf:function(){return this.uH.ao.length>0},
+gGf:function(){return this.uH.XH.length>0},
 dV:[function(){var z,y
 z=this.Yu
 y=J.x(z)
@@ -17789,12 +18150,12 @@
 z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
 if(J.xC(z.gfF(),z.gDu()))return""
-return D.dJ(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,207,76],
+return D.dJ(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,211,76],
 HU:[function(a){var z
 if(a==null)return""
 z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
-return D.dJ(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,207,76],
+return D.dJ(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,211,76],
 eQ:function(){var z,y,x,w
 y=J.It(this.L4," ")
 x=y.length
@@ -17805,13 +18166,13 @@
 try{x=H.BU(z,16,null)
 return x}catch(w){H.Ru(w)
 return 0}},
-Tc:function(a){var z,y,x,w,v
+ju:function(a){var z,y,x,w,v
 z=this.L4
 if(!J.co(z,"j"))return
 y=this.eQ()
 x=J.x(y)
 if(x.n(y,0)){N.QM("").YX("Could not determine jump address for "+H.d(z))
-return}for(z=a.ao,w=0;w<z.length;++w){v=z[w]
+return}for(z=a.XH,w=0;w<z.length;++w){v=z[w]
 if(J.xC(v.gYu(),y)){z=this.dh
 if(this.gnz(this)&&!J.xC(z,v)){z=new T.qI(this,C.b5,z,v)
 z.$builtinTypeInfo=[null]
@@ -17853,7 +18214,7 @@
 gM8:function(){return!0},
 p7:[function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gUH",2,0,208,209],
+for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gUH",2,0,212,213],
 OF:function(){if(this.ar!=null)return
 if(!J.xC(this.I0,C.l8))return
 var z=this.MO
@@ -17906,7 +18267,7 @@
 if(v!=null)this.xs(v)
 u=z.t(b,"descriptors")
 if(u!=null)this.WY(J.UQ(u,"members"))
-z=this.va.ao
+z=this.va.XH
 this.kT=z.length!==0||!J.xC(this.I0,C.l8)
 z=z.length!==0&&J.xC(this.I0,C.l8)
 this.Mk=F.Wi(this,C.zS,this.Mk,z)},
@@ -17928,7 +18289,7 @@
 s=new Q.wn(null,null,s,null,null)
 s.$builtinTypeInfo=[w]
 z.h(0,new D.Q4(t,v,u,null,s,null,null))
-x+=3}for(y=z.gA(z);y.G();)y.lo.Tc(z)},
+x+=3}for(y=z.gA(z);y.G();)y.lo.ju(z)},
 QX:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=H.BU(z.t(a,"pc"),16,null)
@@ -17965,7 +18326,7 @@
 z=this.a
 y=J.zH(z.MO)
 if(y==null)return
-J.SK(y).ml(z.gUH())},"$1",null,2,0,null,210,"call"],
+J.SK(y).ml(z.gUH())},"$1",null,2,0,null,214,"call"],
 $isEH:true},
 Cq:{
 "^":"TpZ:79;",
@@ -17982,7 +18343,7 @@
 N.QM("").j2("Unknown socket kind "+H.d(a))
 throw H.b(P.a9())}}},
 WP:{
-"^":"D3i;V8@,jel,Ue,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+"^":"D3i;V8@,jel,IHj,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gUm:function(){return!0},
 gHY:function(){return J.xC(this.I0,C.FJ)},
 gfY:function(a){return this.I0},
@@ -18039,47 +18400,7 @@
 if(y&&D.bF(b))this.a.u(0,a,this.b.Qn(b))
 else if(!!z.$iswn)D.f3(b,this.b)
 else if(y)D.Gf(b,this.b)},
-$isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
-"^":"",
-zM:{
-"^":"V47;S4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
-gkc:function(a){return a.S4},
-skc:function(a,b){a.S4=this.ct(a,C.yh,a.S4,b)},
-static:{ZmK:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Cc=[]
-a.q1=!1
-a.oG=!1
-a.ZM=z
-a.ZQ=y
-C.U0.ZL(a)
-C.U0.XI(a)
-return a}}},
-V47:{
-"^":"uL+Pi;",
-$isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
-"^":"",
-Rk:{
-"^":"V48;Xc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
-gja:function(a){return a.Xc},
-sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
-static:{bZp:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Cc=[]
-a.q1=!1
-a.oG=!1
-a.ZM=z
-a.ZQ=y
-C.Vd.ZL(a)
-C.Vd.XI(a)
-return a}}},
-V48:{
-"^":"uL+Pi;",
-$isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
+$isEH:true}}],["","",,L,{
 "^":"",
 Z5:{
 "^":"a;eX@,A9<,oc*,w8<",
@@ -18093,63 +18414,48 @@
 this.w8=z
 if(this.oc==null)this.oc=z},
 $isZ5:true,
-static:{K9:function(a){var z=new U.Z5(0,!1,null,null)
+static:{K9:function(a){var z=new L.Z5(0,!1,null,null)
 z.UT(a)
 return z}}},
 U2:{
 "^":"a;jO>,mh<",
 $isU2:true},
-KM:{
-"^":"wv;eG,Mp,N>,JS,S3,yb,bs,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,Qy,z7,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
-gEH:function(){return this.eG.MM},
-t3:function(){var z=this.Mp.MM
+Uon:{
+"^":"wv;N>",
+gEH:function(){return this.bO.MM},
+Ue:function(){var z=this.DS.MM
 if(z.Gv===0){N.QM("").To("WebSocketVM connection error: "+H.d(this.N.gw8()))
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(this)}},
-giG:function(a){return this.Mp.MM},
-je:function(a){var z=this.bs
-if(z!=null)z.close()
-this.CS()
-this.t3()},
+giG:function(a){return this.DS.MM},
+je:function(a){if(this.xu)this.TU.bs.close()
+this.vt()
+this.Ue()},
 z6:function(a,b){var z,y,x
-if(this.bs==null){z=W.pS(this.N.gw8(),null)
-this.bs=z
-z=H.VM(new W.RO(z,C.i6.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gxb()),z.Sg),[H.Oq(z,0)]).Zz()
-z=this.bs
-z.toString
-z=H.VM(new W.RO(z,C.MD.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gpU()),z.Sg),[H.Oq(z,0)]).Zz()
-z=this.bs
-z.toString
-z=H.VM(new W.RO(z,C.JL.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gqM()),z.Sg),[H.Oq(z,0)]).Zz()
-z=this.bs
-z.toString
-z=H.VM(new W.RO(z,C.ph.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.ga9()),z.Sg),[H.Oq(z,0)]).Zz()}y=C.jn.bu(this.yb++)
-z=P.qU
-z=H.VM(new P.Zf(P.Dt(z)),[z])
-x=new U.U2(b,z)
-if(this.bs.readyState===1)this.ti(y,x)
-else this.JS.u(0,y,x)
-return z.MM},
-W4X:[function(a){this.CS()
-this.t3()},"$1","gxb",2,0,211,143],
-Wp:[function(a){this.CS()
-this.t3()},"$1","gpU",2,0,19,212],
-MLC:[function(a){var z,y
+if(!this.xu){this.xu=!0
+this.TU.Tc(this.N.gw8(),this.gBU(),this.gCC(),this.gyE(),this.gM5())}z=C.jn.bu(this.fW++)
+y=P.qU
+y=H.VM(new P.Zf(P.Dt(y)),[y])
+x=new L.U2(b,y)
+if(this.TU.bs.readyState===1)this.L8(z,x)
+else this.hZ.u(0,z,x)
+return y.MM},
+yg:[function(){this.vt()
+this.Ue()},"$0","gM5",0,0,17],
+os:[function(){this.vt()
+this.Ue()},"$0","gyE",0,0,17],
+yl5:[function(){var z,y
 z=this.N
 y=Date.now()
 new P.iP(y,!1).EK()
 z.seX(y)
-this.cf()
-y=this.eG.MM
+this.uP()
+y=this.bO.MM
 if(y.Gv===0){N.QM("").To("WebSocketVM connection opened: "+H.d(z.gw8()))
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(this)}},"$1","gqM",2,0,19,212],
-SS:[function(a){var z,y,x,w,v
-z=C.xr.kV(J.Qd(a))
+y.OH(this)}},"$0","gBU",0,0,17],
+wDh:[function(a){var z,y,x,w,v
+z=C.xr.kV(a)
 if(z==null){N.QM("").YX("WebSocketVM got empty message")
 return}if(this.N.gA9()===!0){y=J.U6(z)
 if(!J.xC(y.t(z,"method"),"Dart.observatoryData"))return
@@ -18157,44 +18463,123 @@
 w=J.UQ(y.t(z,"params"),"data")}else{y=J.U6(z)
 x=y.t(z,"seq")
 w=y.t(z,"response")}if(x==null){this.EM(w)
-return}v=this.S3.Rz(0,x)
+return}v=this.AW.Rz(0,x)
 if(v==null){N.QM("").YX("Received unexpected message: "+H.d(z))
 return}y=v.gmh().MM
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(w)},"$1","ga9",2,0,213,143],
-z1:function(a){a.aN(0,new U.Fw(this))
+y.OH(w)},"$1","gCC",2,0,19],
+BF:function(a){a.aN(0,new L.dV(this))
 a.V1(0)},
-CS:function(){var z=this.S3
+vt:function(){var z=this.AW
 if(z.X5>0){N.QM("").To("Cancelling all pending requests.")
-this.z1(z)}z=this.JS
+this.BF(z)}z=this.hZ
 if(z.X5>0){N.QM("").To("Cancelling all delayed requests.")
-this.z1(z)}},
-cf:function(){var z=this.JS
+this.BF(z)}},
+uP:function(){var z=this.hZ
 if(z.X5===0)return
 N.QM("").To("Sending all delayed requests.")
-z.aN(0,this.gkB())
+z.aN(0,this.grW())
 z.V1(0)},
-ti:[function(a,b){var z,y
+L8:[function(a,b){var z,y
 z=J.RE(b)
 if(!J.Vr(z.gjO(b),"/profile/tag"))N.QM("").To("GET "+H.d(z.gjO(b))+" from "+H.d(this.N.gw8()))
-this.S3.u(0,a,b)
+this.AW.u(0,a,b)
 y=this.N.gA9()===!0?C.xr.KP(P.EF(["id",H.BU(a,null,null),"method","Dart.observatoryQuery","params",P.EF(["id",a,"query",z.gjO(b)],null,null)],null,null)):C.xr.KP(P.EF(["seq",a,"request",z.gjO(b)],null,null))
-this.bs.send(y)},"$2","gkB",4,0,214],
-$isKM:true},
-Fw:{
-"^":"TpZ:215;a",
+this.TU.bs.send(y)},"$2","grW",4,0,215]},
+dV:{
+"^":"TpZ:216;a",
 $2:function(a,b){var z,y
 z=b.gmh()
 y=C.xr.KP(P.EF(["type","ServiceException","id","","kind","NetworkException","message","WebSocket disconnected"],null,null))
 z=z.MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(y)},
+$isEH:true}}],["","",,R,{
+"^":"",
+zM:{
+"^":"V47;S4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
+gkc:function(a){return a.S4},
+skc:function(a,b){a.S4=this.ct(a,C.yh,a.S4,b)},
+static:{ZmK:function(a){var z,y
+z=P.L5(null,null,null,P.qU,W.I0)
+y=P.qU
+y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+a.Cc=[]
+a.Ap=!1
+a.oG=!1
+a.ZM=z
+a.ZQ=y
+C.U0.ZL(a)
+C.U0.XI(a)
+return a}}},
+V47:{
+"^":"uL+Pi;",
+$isd3:true}}],["","",,D,{
+"^":"",
+Rk:{
+"^":"V48;Xc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
+gja:function(a){return a.Xc},
+sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
+static:{bZp:function(a){var z,y
+z=P.L5(null,null,null,P.qU,W.I0)
+y=P.qU
+y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+a.Cc=[]
+a.Ap=!1
+a.oG=!1
+a.ZM=z
+a.ZQ=y
+C.Vd.ZL(a)
+C.Vd.XI(a)
+return a}}},
+V48:{
+"^":"uL+Pi;",
+$isd3:true}}],["","",,U,{
+"^":"",
+hA:{
+"^":"a;bs",
+Tc:function(a,b,c,d,e){var z=W.pS(a,null)
+this.bs=z
+z=H.VM(new W.RO(z,C.i6.Ph,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new U.lo(e)),z.Sg),[H.u3(z,0)]).Zz()
+z=this.bs
+z.toString
+z=H.VM(new W.RO(z,C.MD.Ph,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new U.j3(d)),z.Sg),[H.u3(z,0)]).Zz()
+z=this.bs
+z.toString
+z=H.VM(new W.RO(z,C.JL.Ph,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new U.Fz(b)),z.Sg),[H.u3(z,0)]).Zz()
+z=this.bs
+z.toString
+z=H.VM(new W.RO(z,C.ph.Ph,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new U.oy(c)),z.Sg),[H.u3(z,0)]).Zz()},
+wR:function(a,b){this.bs.send(b)},
+xO:function(a){this.bs.close()}},
+lo:{
+"^":"TpZ:12;a",
+$1:[function(a){return this.a.$0()},"$1",null,2,0,null,217,"call"],
 $isEH:true},
+j3:{
+"^":"TpZ:12;b",
+$1:[function(a){return this.b.$0()},"$1",null,2,0,null,218,"call"],
+$isEH:true},
+Fz:{
+"^":"TpZ:12;c",
+$1:[function(a){return this.c.$0()},"$1",null,2,0,null,218,"call"],
+$isEH:true},
+oy:{
+"^":"TpZ:219;d",
+$1:[function(a){return this.d.$1(J.Qd(a))},"$1",null,2,0,null,85,"call"],
+$isEH:true},
+KM:{
+"^":"Uon;bO,DS,N,hZ,AW,fW,xu,TU,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,Qy,z7,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+$isKM:true},
 dS:{
-"^":"wv;eG,Mp,S3,yb,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,Qy,z7,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+"^":"wv;eG,mc,S3,yb,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,Qy,z7,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 je:function(a){},
 gEH:function(){return this.eG.MM},
-giG:function(a){return this.Mp.MM},
+giG:function(a){return this.mc.MM},
 q3:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -18204,7 +18589,7 @@
 z=this.S3
 v=z.t(0,y)
 z.Rz(0,y)
-J.KD(v,w)},"$1","gVx",2,0,19,216],
+J.KD(v,w)},"$1","gVx",2,0,19,220],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -18216,13 +18601,13 @@
 J.tT(W.Pv(window.parent),C.xr.KP(y),"*")
 return x.MM},
 ZH:function(){var z=H.VM(new W.RO(window,C.ph.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gVx()),z.Sg),[H.Oq(z,0)]).Zz()
+H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(this.gVx()),z.Sg),[H.u3(z,0)]).Zz()
 z=this.eG.MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(this)}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
+z.OH(this)}}}],["","",,U,{
 "^":"",
 Ti:{
-"^":"V49;Ll,Sa,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V49;Ll,Sa,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gWA:function(a){return a.Ll},
 sWA:function(a,b){a.Ll=this.ct(a,C.td,a.Ll,b)},
 gKw:function(a){return a.Sa},
@@ -18283,7 +18668,7 @@
 J.tH(z,a.Ll)
 return z
 case"Isolate":z=W.r3("isolate-view",null)
-J.uM(z,a.Ll)
+J.Rp(z,a.Ll)
 return z
 case"Library":z=W.r3("library-view",null)
 J.cl(z,a.Ll)
@@ -18301,7 +18686,7 @@
 J.A4(z,a.Ll)
 return z
 case"RandomAccessFile":z=W.r3("io-random-access-file-view",null)
-J.fR(z,a.Ll)
+J.OH(z,a.Ll)
 return z
 case"ServiceError":z=W.r3("service-error-view",null)
 J.Qr(z,a.Ll)
@@ -18336,7 +18721,7 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -18345,10 +18730,10 @@
 return a}}},
 V49:{
 "^":"uL+Pi;",
-$isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
+$isd3:true}}],["","",,Q,{
 "^":"",
 xI:{
-"^":"Vfx;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"Vfx;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gnv:function(a){return a.tY},
 snv:function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},
 gjT:function(a){return a.Pe},
@@ -18375,7 +18760,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -18384,10 +18769,10 @@
 return a}}},
 Vfx:{
 "^":"uL+Pi;",
-$isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
+$isd3:true}}],["","",,Q,{
 "^":"",
 CY:{
-"^":"ImK;kF,IK,bP,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"ImK;kF,IK,bP,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gd4:function(a){return a.kF},
 sd4:function(a,b){a.kF=this.ct(a,C.bk,a.kF,b)},
 gEu:function(a){return a.IK},
@@ -18395,13 +18780,13 @@
 gRY:function(a){return a.bP},
 sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
 RC:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,111,2,217,103],
+a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,113,2,221,105],
 static:{Sm:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -18410,7 +18795,7 @@
 return a}}},
 ImK:{
 "^":"xc+Pi;",
-$isd3:true}}],["smoke","package:smoke/smoke.dart",,A,{
+$isd3:true}}],["","",,A,{
 "^":"",
 Wq:{
 "^":"a;c1,BH,Mg,nN,ER,Ja,MR,tu",
@@ -18446,7 +18831,7 @@
 return z.vM},"$0","gAY",0,0,71],
 $isES:true},
 iYn:{
-"^":"a;fY>"}}],["smoke.src.common","package:smoke/src/common.dart",,X,{
+"^":"a;fY>"}}],["","",,X,{
 "^":"",
 Na:function(a,b,c){var z,y
 z=a.length
@@ -18459,18 +18844,18 @@
 return z}return a},
 ZO:function(a,b){var z,y,x,w,v,u
 z=new H.a7(a,a.length,0,null)
-z.$builtinTypeInfo=[H.Oq(a,0)]
+z.$builtinTypeInfo=[H.u3(a,0)]
 for(;z.G();){y=z.lo
 b.length
 x=new H.a7(b,1,0,null)
-x.$builtinTypeInfo=[H.Oq(b,0)]
+x.$builtinTypeInfo=[H.u3(b,0)]
 w=J.x(y)
 for(;x.G();){v=x.lo
 if(w.n(y,v))return!0
 if(!!J.x(v).$isuq){u=w.gbx(y)
 u=$.mX().dM(u,v)}else u=!1
 if(u)return!0}}return!1},
-fy:function(a){var z,y
+Cz:function(a){var z,y
 z=H.G3()
 y=H.KT(z).BD(a)
 if(y)return 0
@@ -18500,12 +18885,12 @@
 x.FV(0,b)
 for(w=0;w<a.length;++w)if(!x.tg(0,a[w]))return!1}else for(w=0;w<z;++w){v=a[w]
 if(w>=y)return H.e(b,w)
-if(v!==b[w])return!1}return!0}}],["smoke.src.implementation","package:smoke/src/implementation.dart",,D,{
+if(v!==b[w])return!1}return!0}}],["","",,D,{
 "^":"",
-kP:function(){throw H.b(P.FM("The \"smoke\" library has not been configured. Make sure you import and configure one of the implementations (package:smoke/mirrors.dart or package:smoke/static.dart)."))}}],["smoke.static","package:smoke/static.dart",,O,{
+kP:function(){throw H.b(P.FM("The \"smoke\" library has not been configured. Make sure you import and configure one of the implementations (package:smoke/mirrors.dart or package:smoke/static.dart)."))}}],["","",,O,{
 "^":"",
 Oj:{
-"^":"a;LH,AH,ZGj,BJ,Yp,af<,yQ"},
+"^":"a;E4e,AH,ZGj,of,NX,af<,yQ"},
 fH:{
 "^":"a;eA,vk,Si",
 jD:function(a,b){var z=this.eA.t(0,b)
@@ -18520,7 +18905,7 @@
 z=null}else{x=this.eA.t(0,b)
 z=x==null?null:x.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
 y=null
-if(d){w=X.fy(z)
+if(d){w=X.Cz(z)
 if(w>3){y="we tried to adjust the arguments for calling \""+H.d(b)+"\", but we couldn't determine the exact number of arguments it expects (it is more than 3)."
 c=X.Na(c,w,P.y(w,J.q8(c)))}else{v=X.RI(z)
 u=v>=0?v:J.q8(c)
@@ -18567,21 +18952,21 @@
 throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
 rD:{
 "^":"a;ep,Nz",
-Ut:function(a){this.ep.aN(0,new O.m8(this))},
+Ut:function(a){this.ep.aN(0,new O.Fi(this))},
 static:{ty:function(a){var z=new O.rD(a.af,P.Fl(null,null))
 z.Ut(a)
 return z}}},
-m8:{
+Fi:{
 "^":"TpZ:79;a",
 $2:function(a,b){this.a.Nz.u(0,b,a)},
 $isEH:true},
 tk:{
 "^":"a;GB",
 bu:[function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},"$0","gAY",0,0,71],
-static:{lA:function(a){return new O.tk(a)}}}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
+static:{lA:function(a){return new O.tk(a)}}}}],["","",,K,{
 "^":"",
 nm:{
-"^":"V50;xP,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V50;xP,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gM6:function(a){return a.xP},
 sM6:function(a,b){a.xP=this.ct(a,C.rE,a.xP,b)},
 static:{an:function(a){var z,y
@@ -18589,7 +18974,7 @@
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -18598,28 +18983,28 @@
 return a}}},
 V50:{
 "^":"uL+Pi;",
-$isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
+$isd3:true}}],["","",,X,{
 "^":"",
 uw:{
-"^":"V51;ju,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
-gtN:function(a){return a.ju},
-stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
-SK:[function(a,b){J.cI(a.ju).YM(b)},"$1","gvC",2,0,19,98],
+"^":"V51;Jl,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
+gtN:function(a){return a.Jl},
+stN:function(a,b){a.Jl=this.ct(a,C.kw,a.Jl,b)},
+SK:[function(a,b){J.cI(a.Jl).YM(b)},"$1","gvC",2,0,19,100],
 static:{lt2:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.wB.ZL(a)
-C.wB.XI(a)
+C.uC.ZL(a)
+C.uC.XI(a)
 return a}}},
 V51:{
 "^":"uL+Pi;",
-$isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
+$isd3:true}}],["","",,M,{
 "^":"",
 AD:function(a,b,c,d){var z,y
 if(c){z=null!=d&&!1!==d
@@ -18635,17 +19020,17 @@
 dg:function(a,b){var z,y,x,w,v,u
 z=M.pNz(a,b)
 if(z==null)z=new M.PW([],null,null)
-for(y=J.RE(a),x=y.gPZ(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.dg(x,b)
+for(y=J.RE(a),x=y.glb(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.dg(x,b)
 if(u==null)continue
-if(w==null){w=Array(y.gyT(a).NL.childNodes.length)
+if(w==null){w=Array(y.gUN(a).NL.childNodes.length)
 w.fixed$length=init}if(v>=w.length)return H.e(w,v)
 w[v]=u}z.ks=w
 return z},
 S0:function(a,b,c,d,e,f,g,h){var z,y,x,w
-z=b.appendChild(J.Ha(c,a,!1))
+z=b.appendChild(J.Lh(c,a,!1))
 for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.S0(y,z,c,x?d.JW(w):null,e,f,g,null)
-if(d.ghK()){M.SB(z).bt(a)
-if(f!=null)J.vc(M.SB(z),f)}M.mV(z,d,e,g)
+if(d.ghK()){M.SB(z).wh(a)
+if(f!=null)J.D4(M.SB(z),f)}M.mV(z,d,e,g)
 return z},
 tA:function(a){var z
 for(;z=J.TmB(a),z!=null;a=z);return a},
@@ -18656,13 +19041,13 @@
 y=$.vH()
 y.toString
 x=H.of(a,"expando$values")
-w=x==null?null:H.of(x,y.J4())
+w=x==null?null:H.of(x,y.YV())
 y=w==null
-if(!y&&w.gC0()!=null)v=J.Eh(w.gC0(),z)
+if(!y&&w.gj6()!=null)v=J.Eh(w.gj6(),z)
 else{u=J.x(a)
 v=!!u.$isYN||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
 if(y)return
-a=w.gCi()
+a=w.gCv()
 if(a==null)return}},
 H4o:function(a,b,c){if(c==null)return
 return new M.hg(a,b,c)},
@@ -18685,15 +19070,15 @@
 z=w}else z=x
 v=new M.qf(null,null,null,z,null,null)
 z=M.rJ(a,"if",b)
-v.qd=z
+v.EI=z
 x=M.rJ(a,"bind",b)
-v.fu=x
+v.YI=x
 u=M.rJ(a,"repeat",b)
-v.zy=u
-if(z!=null&&x==null&&u==null)v.fu=S.j9("{{}}",M.H4o("bind",a,b))
+v.Lx=u
+if(z!=null&&x==null&&u==null)v.YI=S.j9("{{}}",M.H4o("bind",a,b))
 return v}z=z.a
 return z==null?null:new M.PW(z,null,null)},
-fX:function(a,b,c,d){var z,y,x,w,v,u,t
+i8:function(a,b,c,d){var z,y,x,w,v,u,t
 if(b.gqz()){z=b.HH(0)
 y=z!=null?z.$3(d,c,!0):b.Pn(0).Tl(d)
 return b.gaW()?y:b.qm(y)}x=J.U6(b)
@@ -18711,11 +19096,11 @@
 if(u>=w)return H.e(v,u)
 v[u]=t;++u}return b.qm(v)},
 oO:function(a,b,c,d){var z,y,x,w,v,u,t,s
-if(b.gwD())return M.fX(a,b,c,d)
+if(b.gwD())return M.i8(a,b,c,d)
 if(b.gqz()){z=b.HH(0)
 if(z!=null)y=z.$3(d,c,!1)
 else{x=b.Pn(0)
-x=!!J.x(x).$isTv?x:L.hk(x)
+x=!!J.x(x).$isZl?x:L.hk(x)
 w=$.ps
 $.ps=w+1
 y=new L.WR(x,d,null,w,null,null,null)}return b.gaW()?y:new Y.Qw(y,b.gEO(),null,null,null)}x=$.ps
@@ -18730,10 +19115,10 @@
 c$0:{u=b.l8(v)
 z=b.HH(v)
 if(z!=null){t=z.$3(d,c,u)
-if(u===!0)y.U2(t)
+if(u===!0)y.ti(t)
 else y.Qs(t)
 break c$0}s=b.Pn(v)
-if(u===!0)y.U2(s.Tl(d))
+if(u===!0)y.ti(s.Tl(d))
 else y.yN(d,s)}++v}return new Y.Qw(y,b.gEO(),null,null,null)},
 mV:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p
 z=J.RE(b)
@@ -18745,17 +19130,17 @@
 if(r!=null&&!0)d.push(r)}v.Vz(x)
 if(!z.$isqf)return
 q=M.SB(a)
-q.sCz(c)
-p=q.ZZ(b)
+q.skr(c)
+p=q.Cm(b)
 if(p!=null&&!0)d.push(p)},
 SB:function(a){var z,y,x,w
 z=$.cm()
 z.toString
 y=H.of(a,"expando$values")
-x=y==null?null:H.of(y,z.J4())
+x=y==null?null:H.of(y,z.YV())
 if(x!=null)return x
 w=J.x(a)
-if(!!w.$isMi)x=new M.L1(a,null,null)
+if(!!w.$isMi)x=new M.Q8(a,null,null)
 else if(!!w.$islpR)x=new M.ug(a,null,null)
 else if(!!w.$isHR)x=new M.VT(a,null,null)
 else if(!!w.$ish4){if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.lY.x4(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
@@ -18771,31 +19156,31 @@
 else z=!1
 return z},
 VE:{
-"^":"a;cJ",
+"^":"a;DP",
 US:function(a,b,c){return},
 static:{"^":"ac"}},
 V2:{
-"^":"vy;rF,Cd,Vw",
+"^":"vy;N1,Cd,Xl",
 nR:function(a,b,c,d){var z,y,x,w,v,u
 z={}
 z.a=b
-y=this.grF()
+y=this.gN1()
 x=J.x(y)
 w=!!x.$isQlt&&J.xC(z.a,"value")
 v=z.a
 if(w){new W.E9(y).Rz(0,v)
-if(d)return this.Dt(c)
-x=this.ge2()
+if(d)return this.Lm(c)
+x=this.gKX()
 x.$1(J.mu(c,x))}else{u=J.Vr(v,"?")
 if(u){x.gQg(y).Rz(0,z.a)
 x=z.a
 w=J.U6(x)
-z.a=w.Nj(x,0,J.Hn(w.gB(x),1))}if(d)return M.AD(this.grF(),z.a,u,c)
-x=new M.BL(z,this,u)
+z.a=w.Nj(x,0,J.Hn(w.gB(x),1))}if(d)return M.AD(this.gN1(),z.a,u,c)
+x=new M.IoZ(z,this,u)
 x.$1(J.mu(c,x))}z=z.a
-return $.rK?this.Un(z,c):c},
-Dt:[function(a){var z,y,x,w,v,u,t,s
-z=this.grF()
+return $.rK?this.Zr(z,c):c},
+Lm:[function(a){var z,y,x,w,v,u,t,s
+z=this.gN1()
 y=J.RE(z)
 x=y.gBy(z)
 w=J.x(x)
@@ -18807,37 +19192,37 @@
 s=null}}else{t=null
 s=null}y.sP(z,a==null?"":H.d(a))
 if(s!=null&&!J.xC(w.gP(x),t)){y=w.gP(x)
-J.ta(s.gvt(),y)}},"$1","ge2",2,0,19,60]},
-BL:{
+J.ta(s.gOi(),y)}},"$1","gKX",2,0,19,60]},
+IoZ:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,67,"call"],
+$1:[function(a){return M.AD(this.b.gN1(),this.a.a,this.c,a)},"$1",null,2,0,null,67,"call"],
 $isEH:true},
 b2:{
-"^":"OC;rF<,E3,vt<,jS",
-HF:[function(a){return M.pw(this.rF,a,this.jS)},"$1","ghZ",2,0,19,60],
-Uh:[function(a){var z,y,x,w,v
-switch(this.jS){case"value":z=J.Vm(this.rF)
-J.ta(this.vt,z)
+"^":"OC;N1<,Ca,Oi<,M7",
+Cno:[function(a){return M.pw(this.N1,a,this.M7)},"$1","gRD",2,0,19,60],
+wU:[function(a){var z,y,x,w,v
+switch(this.M7){case"value":z=J.Vm(this.N1)
+J.ta(this.Oi,z)
 break
-case"checked":z=this.rF
+case"checked":z=this.N1
 y=J.RE(z)
 x=y.gd4(z)
-J.ta(this.vt,x)
-if(!!y.$isMi&&J.xC(y.gt5(z),"radio"))for(z=J.mY(M.pt(z));z.G();){w=z.gl()
+J.ta(this.Oi,x)
+if(!!y.$isMi&&J.xC(y.gt5(z),"radio"))for(z=J.mY(M.YP(z));z.G();){w=z.gl()
 v=J.UQ(J.QE(!!J.x(w).$isvy?w:M.SB(w)),"checked")
 if(v!=null)J.ta(v,!1)}break
-case"selectedIndex":z=J.Lr(this.rF)
-J.ta(this.vt,z)
-break}O.N0()},"$1","gCL",2,0,19,2],
-TR:function(a,b){return J.mu(this.vt,b)},
-gP:function(a){return J.Vm(this.vt)},
-sP:function(a,b){J.ta(this.vt,b)
+case"selectedIndex":z=J.Lr(this.N1)
+J.ta(this.Oi,z)
+break}O.N0()},"$1","gd1",2,0,19,2],
+TR:function(a,b){return J.mu(this.Oi,b)},
+gP:function(a){return J.Vm(this.Oi)},
+sP:function(a,b){J.ta(this.Oi,b)
 return b},
-xO:function(a){var z=this.E3
+xO:function(a){var z=this.Ca
 if(z!=null){z.ed()
-this.E3=null}z=this.vt
+this.Ca=null}z=this.Oi
 if(z!=null){J.yd(z)
-this.vt=null}},
+this.Oi=null}},
 $isb2:true,
 static:{"^":"S8",pw:function(a,b,c){switch(c){case"checked":J.Ae(a,null!=b&&!1!==b)
 return
@@ -18849,7 +19234,7 @@
 switch(z.gt5(a)){case"checkbox":return $.FF().LX(a)
 case"radio":case"select-multiple":case"select-one":return z.gEr(a)
 case"range":if(J.x5(window.navigator.userAgent,new H.VR("Trident|MSIE",H.v4("Trident|MSIE",!1,!0,!1),null,null)))return z.gEr(a)
-break}return z.gLm(a)},pt:function(a){var z,y,x
+break}return z.gQb(a)},YP:function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
 z.toString
@@ -18857,7 +19242,7 @@
 return z.ad(z,new M.qx(a))}else{y=M.y9(a)
 if(y==null)return C.dn
 x=J.Vj(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ad(x,new M.y4(a))}},Fa:function(a){if(typeof a==="string")return H.BU(a,null,new M.LG())
+return x.ad(x,new M.di(a))}},Fa:function(a){if(typeof a==="string")return H.BU(a,null,new M.LG())
 return typeof a==="number"&&Math.floor(a)===a?a:0}}},
 Raa:{
 "^":"TpZ:74;",
@@ -18867,14 +19252,14 @@
 y.st5(z,"checkbox")
 x=[]
 w=y.gfs(z)
-H.VM(new W.Ov(0,w.DK,w.Ph,W.aF(new M.pp(x)),w.Sg),[H.Oq(w,0)]).Zz()
+H.VM(new W.Ov(0,w.bi,w.Ph,W.aF(new M.pp(x)),w.Sg),[H.u3(w,0)]).Zz()
 y=y.gEr(z)
-H.VM(new W.Ov(0,y.DK,y.Ph,W.aF(new M.LfS(x)),y.Sg),[H.Oq(y,0)]).Zz()
+H.VM(new W.Ov(0,y.bi,y.Ph,W.aF(new M.LfS(x)),y.Sg),[H.u3(y,0)]).Zz()
 y=window
 v=document.createEvent("MouseEvent")
 J.Dh(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
 z.dispatchEvent(v)
-return x.length===1?C.U3:C.Nm.gTw(x)},
+return x.length===1?C.U3:C.Nm.gne(x)},
 $isEH:true},
 pp:{
 "^":"TpZ:12;a",
@@ -18896,7 +19281,7 @@
 else z=!1
 return z},
 $isEH:true},
-y4:{
+di:{
 "^":"TpZ:12;b",
 $1:function(a){var z=J.x(a)
 return!z.n(a,this.b)&&z.gMB(a)==null},
@@ -18905,44 +19290,44 @@
 "^":"TpZ:12;",
 $1:function(a){return 0},
 $isEH:true},
-L1:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
+Q8:{
+"^":"V2;N1,Cd,Xl",
+gN1:function(){return this.N1},
 nR:function(a,b,c,d){var z,y,x
 z=J.x(b)
 if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.nR.call(this,this,b,c,d)
-J.Vs(this.rF).Rz(0,b)
-if(d){M.pw(this.rF,c,b)
-return}z=this.rF
+J.Vs(this.N1).Rz(0,b)
+if(d){M.pw(this.N1,c,b)
+return}z=this.N1
 y=new M.b2(z,null,c,b)
-y.E3=M.IPt(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return this.Un(b,y)}},
+y.Ca=M.IPt(z).yI(y.gd1())
+x=y.gRD()
+M.pw(z,J.mu(y.Oi,x),b)
+return this.Zr(b,y)}},
 PW:{
-"^":"a;Cd>,ks>,jb>",
+"^":"a;Cd>,ks>,q1>",
 ghK:function(){return!1},
 JW:function(a){var z=this.ks
 if(z==null||a>=z.length)return
 if(a>=z.length)return H.e(z,a)
 return z[a]}},
 qf:{
-"^":"PW;qd,fu,zy,Cd,ks,jb",
+"^":"PW;EI,YI,Lx,Cd,ks,q1",
 ghK:function(){return!0},
 $isqf:true},
 vy:{
-"^":"a;rF<,Cd*,Vw?",
+"^":"a;N1<,Cd*,Xl?",
 nR:function(a,b,c,d){var z
 window
 z="Unhandled binding to Node: "+H.a5(this)+" "+H.d(b)+" "+H.d(c)+" "+d
 if(typeof console!="undefined")console.error(z)
 return},
 Vz:function(a){},
-gmSA:function(a){var z=this.Vw
-if(z!=null);else if(J.Lp(this.grF())!=null){z=J.Lp(this.grF())
+gmSA:function(a){var z=this.Xl
+if(z!=null);else if(J.Lp(this.gN1())!=null){z=J.Lp(this.gN1())
 z=J.Zz(!!J.x(z).$isvy?z:M.SB(z))}else z=null
 return z},
-Un:function(a,b){var z,y
+Zr:function(a,b){var z,y
 z=this.Cd
 if(z==null){z=P.Fl(null,null)
 this.Cd=z}y=z.t(0,a)
@@ -18951,137 +19336,137 @@
 return b},
 $isvy:true},
 ze:{
-"^":"a;k8>,EA,Po"},
+"^":"a;k8>,Mm,Ve"},
 ug:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
+"^":"V2;N1,Cd,Xl",
+gN1:function(){return this.N1},
 nR:function(a,b,c,d){var z,y,x
 if(J.xC(b,"selectedindex"))b="selectedIndex"
 z=J.x(b)
 if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.nR.call(this,this,b,c,d)
-J.Vs(this.rF).Rz(0,b)
-if(d){M.pw(this.rF,c,b)
-return}z=this.rF
+J.Vs(this.N1).Rz(0,b)
+if(d){M.pw(this.N1,c,b)
+return}z=this.N1
 y=new M.b2(z,null,c,b)
-y.E3=M.IPt(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return this.Un(b,y)}},
+y.Ca=M.IPt(z).yI(y.gd1())
+x=y.gRD()
+M.pw(z,J.mu(y.Oi,x),b)
+return this.Zr(b,y)}},
 DT:{
-"^":"V2;Cz?,nF,os<,xU,q4?,Bx?,ZV?,le,VZ,q8,rF,Cd,Vw",
-grF:function(){return this.rF},
+"^":"V2;kr?,dH,F3<,z7E,QO?,jH?,mj?,my,dv,kC,N1,Cd,Xl",
+gN1:function(){return this.N1},
 nR:function(a,b,c,d){var z
 if(!J.xC(b,"ref"))return M.V2.prototype.nR.call(this,this,b,c,d)
 z=d?c:J.mu(c,new M.pi(this))
-J.Vs(this.rF).MW.setAttribute("ref",z)
-this.aX()
+J.Vs(this.N1).MW.setAttribute("ref",z)
+this.Yo()
 if(d)return
-return this.Un("ref",c)},
-ZZ:function(a){var z=this.os
-if(z!=null)z.NC()
-if(a.qd==null&&a.fu==null&&a.zy==null){z=this.os
+return this.Zr("ref",c)},
+Cm:function(a){var z=this.F3
+if(z!=null)z.z9()
+if(a.EI==null&&a.YI==null&&a.Lx==null){z=this.F3
 if(z!=null){z.xO(0)
-this.os=null}return}z=this.os
-if(z==null){z=new M.aY(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
-this.os=z}z.dE(a,this.Cz)
-J.ZW($.ik(),this.rF,["ref"],!0)
-return this.os},
+this.F3=null}return}z=this.F3
+if(z==null){z=new M.TGm(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
+this.F3=z}z.Bq(a,this.kr)
+J.ZW($.ik(),this.N1,["ref"],!0)
+return this.F3},
 ZK:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-if(c==null)c=this.nF
-z=this.q8
-if(z==null){z=this.gNK()
-z=J.NQ(!!J.x(z).$isvy?z:M.SB(z))
-this.q8=z}y=J.RE(z)
-if(y.gPZ(z)==null)return $.zl()
-x=c==null?$.HT():c
-w=x.cJ
+if(c==null)c=this.dH
+z=this.kC
+if(z==null){z=this.gyT()
+z=J.Xu(!!J.x(z).$isvy?z:M.SB(z))
+this.kC=z}y=J.RE(z)
+if(y.glb(z)==null)return $.zl()
+x=c==null?$.Bu():c
+w=x.DP
 if(w==null){w=H.VM(new P.qo(null),[null])
-x.cJ=w}v=w.t(0,z)
+x.DP=w}v=w.t(0,z)
 if(v==null){v=M.dg(z,x)
-x.cJ.u(0,z,v)}w=this.le
-if(w==null){u=J.Do(this.rF)
+x.DP.u(0,z,v)}w=this.my
+if(w==null){u=J.Do(this.N1)
 w=$.we()
 t=w.t(0,u)
 if(t==null){t=u.implementation.createHTMLDocument("")
 $.Ks().u(0,t,!0)
-M.lo(t)
-w.u(0,u,t)}this.le=t
+M.Uk(t)
+w.u(0,u,t)}this.my=t
 w=t}s=J.bs(w)
 w=[]
-r=new M.Fi(w,null,null,null)
+r=new M.qdK(w,null,null,null)
 q=$.vH()
-r.Ci=this.rF
-r.C0=z
+r.Cv=this.N1
+r.j6=z
 q.u(0,s,r)
 p=new M.ze(b,null,null)
-M.SB(s).sVw(p)
-for(o=y.gPZ(z),z=v!=null,n=0,m=!1;o!=null;o=o.nextSibling,++n){if(o.nextSibling==null)m=!0
+M.SB(s).sXl(p)
+for(o=y.glb(z),z=v!=null,n=0,m=!1;o!=null;o=o.nextSibling,++n){if(o.nextSibling==null)m=!0
 l=z?v.JW(n):null
-k=M.S0(o,s,this.le,l,b,c,w,null)
-M.SB(k).sVw(p)
-if(m)r.Qo=k}p.EA=s.firstChild
-p.Po=s.lastChild
-r.C0=null
-r.Ci=null
+k=M.S0(o,s,this.my,l,b,c,w,null)
+M.SB(k).sXl(p)
+if(m)r.he=k}p.Mm=s.firstChild
+p.Ve=s.lastChild
+r.j6=null
+r.Cv=null
 return s},
-gk8:function(a){return this.Cz},
-gG5:function(a){return this.nF},
-sG5:function(a,b){var z
-if(this.nF!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
-this.nF=b
-this.VZ=null
-z=this.os
-if(z!=null){z.Wv=!1
-z.eY=null
-z.TC=null}},
-aX:function(){var z,y
-if(this.os!=null){z=this.q8
-y=this.gNK()
-y=J.NQ(!!J.x(y).$isvy?y:M.SB(y))
+gk8:function(a){return this.kr},
+gA0:function(a){return this.dH},
+sA0:function(a,b){var z
+if(this.dH!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
+this.dH=b
+this.dv=null
+z=this.F3
+if(z!=null){z.vJ=!1
+z.DO=null
+z.Fy=null}},
+Yo:function(){var z,y
+if(this.F3!=null){z=this.kC
+y=this.gyT()
+y=J.Xu(!!J.x(y).$isvy?y:M.SB(y))
 y=z==null?y==null:z===y
 z=y}else z=!0
 if(z)return
-this.q8=null
-this.os.Io(null)
-this.os.vr(null)},
+this.kC=null
+this.F3.t3(null)
+this.F3.xY(null)},
 V1:function(a){var z,y
-this.Cz=null
-this.nF=null
+this.kr=null
+this.dH=null
 z=this.Cd
 if(z!=null){y=z.Rz(0,"ref")
-if(y!=null)J.yd(y)}this.q8=null
-z=this.os
+if(y!=null)J.yd(y)}this.kC=null
+z=this.F3
 if(z==null)return
-z.Io(null)
-this.os.xO(0)
-this.os=null},
-gNK:function(){var z,y
-this.GC()
-z=M.cS(this.rF,J.Vs(this.rF).MW.getAttribute("ref"))
-if(z==null){z=this.q4
-if(z==null)return this.rF}y=M.SB(z).gNK()
+z.t3(null)
+this.F3.xO(0)
+this.F3=null},
+gyT:function(){var z,y
+this.wo()
+z=M.cS(this.N1,J.Vs(this.N1).MW.getAttribute("ref"))
+if(z==null){z=this.QO
+if(z==null)return this.N1}y=M.SB(z).gyT()
 return y!=null?y:z},
-gjb:function(a){var z
-this.GC()
-z=this.Bx
-return z!=null?z:H.Go(this.rF,"$isOH").content},
-bt:function(a){var z,y,x,w,v,u,t
-if(this.ZV===!0)return!1
+gq1:function(a){var z
+this.wo()
+z=this.jH
+return z!=null?z:H.Go(this.N1,"$isfX").content},
+wh:function(a){var z,y,x,w,v,u,t
+if(this.mj===!0)return!1
 M.oR()
 M.hb()
-this.ZV=!0
-z=!!J.x(this.rF).$isOH
+this.mj=!0
+z=!!J.x(this.N1).$isfX
 y=!z
-if(y){x=this.rF
+if(y){x=this.N1
 w=J.RE(x)
 if(w.gQg(x).MW.hasAttribute("template")===!0&&C.lY.x4(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
-v=M.pZ(this.rF)
+v=M.pZ(this.N1)
 v=!!J.x(v).$isvy?v:M.SB(v)
-v.sZV(!0)
-z=!!J.x(v.grF()).$isOH
-u=!0}else{x=this.rF
+v.smj(!0)
+z=!!J.x(v.gN1()).$isfX
+u=!0}else{x=this.N1
 w=J.RE(x)
-if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.rF
+if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.N1
 w=J.RE(x)
 t=w.gM0(x).createElement("template",null)
 w.gBy(x).insertBefore(t,x)
@@ -19090,15 +19475,15 @@
 w.gQg(x).V1(0)
 w.wg(x)
 v=!!J.x(t).$isvy?t:M.SB(t)
-v.sZV(!0)
-z=!!J.x(v.grF()).$isOH}else{v=this
+v.smj(!0)
+z=!!J.x(v.gN1()).$isfX}else{v=this
 z=!1}u=!1}}else{v=this
-u=!1}if(!z)v.sBx(J.bs(M.TA(v.grF())))
-if(a!=null)v.sq4(a)
-else if(y)M.O1(v,this.rF,u)
-else M.Af(J.NQ(v))
+u=!1}if(!z)v.sjH(J.bs(M.TA(v.gN1())))
+if(a!=null)v.sQO(a)
+else if(y)M.O1(v,this.N1,u)
+else M.Af(J.Xu(v))
 return!0},
-GC:function(){return this.bt(null)},
+wo:function(){return this.wh(null)},
 $isDT:true,
 static:{"^":"mn,v2,YO,vU,xV,joK",TA:function(a){var z,y,x,w
 z=J.Do(a)
@@ -19110,7 +19495,7 @@
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
 z.gBy(a).insertBefore(y,a)
-for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.Oq(x,0)]);x.G();){w=x.lo
+for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.lo
 switch(w){case"template":v=z.gQg(a).MW
 v.getAttribute(w)
 v.removeAttribute(w)
@@ -19121,9 +19506,9 @@
 v.removeAttribute(w)
 y.setAttribute(w,u)
 break}}return y},O1:function(a,b,c){var z,y,x,w
-z=J.NQ(a)
+z=J.Xu(a)
 if(c){J.y2(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gPZ(b),w!=null;)x.mx(z,w)},Af:function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.glb(b),w!=null;)x.mx(z,w)},Af:function(a){var z,y
 z=new M.yi()
 y=J.Vj(a,$.S1())
 if(M.CF(a))z.$1(a)
@@ -19135,38 +19520,38 @@
 if($.xV===!0)return
 $.xV=!0
 z=document.createElement("template",null)
-if(!!J.x(z).$isOH){y=z.content.ownerDocument
+if(!!J.x(z).$isfX){y=z.content.ownerDocument
 if(y.documentElement==null)y.appendChild(y.createElement("html",null)).appendChild(y.createElement("head",null))
-if(J.m5(y).querySelector("base")==null)M.lo(y)}},lo:function(a){var z=a.createElement("base",null)
+if(J.m5(y).querySelector("base")==null)M.Uk(y)}},Uk:function(a){var z=a.createElement("base",null)
 J.dc(z,document.baseURI)
 J.m5(a).appendChild(z)}}},
 pi:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-J.Vs(z.rF).MW.setAttribute("ref",a)
-z.aX()},"$1",null,2,0,null,218,"call"],
+J.Vs(z.N1).MW.setAttribute("ref",a)
+z.Yo()},"$1",null,2,0,null,222,"call"],
 $isEH:true},
 yi:{
 "^":"TpZ:19;",
-$1:function(a){if(!M.SB(a).bt(null))M.Af(J.NQ(!!J.x(a).$isvy?a:M.SB(a)))},
+$1:function(a){if(!M.SB(a).wh(null))M.Af(J.Xu(!!J.x(a).$isvy?a:M.SB(a)))},
 $isEH:true},
 YJG:{
 "^":"TpZ:12;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,130,"call"],
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,133,"call"],
 $isEH:true},
 lPa:{
 "^":"TpZ:79;",
 $2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.SB(J.l2(z.gl())).aX()},"$2",null,4,0,null,172,13,"call"],
+for(z=J.mY(a);z.G();)M.SB(J.l2(z.gl())).Yo()},"$2",null,4,0,null,175,13,"call"],
 $isEH:true},
 Ufa:{
 "^":"TpZ:74;",
 $0:function(){var z=document.createDocumentFragment()
-$.vH().u(0,z,new M.Fi([],null,null,null))
+$.vH().u(0,z,new M.qdK([],null,null,null))
 return z},
 $isEH:true},
-Fi:{
-"^":"a;u2<,Qo<,Ci<,C0<"},
+qdK:{
+"^":"a;mD<,he<,Cv<,j6<"},
 hg:{
 "^":"TpZ:12;a,b,c",
 $1:function(a){return this.c.US(a,this.a,this.b)},
@@ -19187,99 +19572,99 @@
 z.push(a)
 z.push(y)}},
 $isEH:true},
-aY:{
-"^":"OC;YS,Rj,vy,S6,ky,vL,wC,D2,ts,qe,ur,VC,Wv,eY,TC",
-RV:function(a){return this.eY.$1(a)},
+TGm:{
+"^":"OC;e9,JI,d8,h5,Ag,DM,h6,Yq,xS,C8,k0,IY,vJ,DO,Fy",
+Mv:function(a){return this.DO.$1(a)},
 TR:function(a,b){return H.vh(P.w("binding already opened"))},
-gP:function(a){return this.wC},
-NC:function(){var z,y
-z=this.vL
+gP:function(a){return this.h6},
+z9:function(){var z,y
+z=this.DM
 y=J.x(z)
 if(!!y.$isOC){y.xO(z)
-this.vL=null}z=this.wC
+this.DM=null}z=this.h6
 y=J.x(z)
 if(!!y.$isOC){y.xO(z)
-this.wC=null}},
-dE:function(a,b){var z,y,x
-this.NC()
-z=this.YS.rF
-y=a.qd
+this.h6=null}},
+Bq:function(a,b){var z,y,x
+this.z9()
+z=this.e9.N1
+y=a.EI
 x=y!=null
-this.D2=x
-this.ts=a.zy!=null
-if(x){this.qe=y.wD
+this.Yq=x
+this.xS=a.Lx!=null
+if(x){this.C8=y.wD
 y=M.oO("if",y,z,b)
-this.vL=y
-if(this.qe===!0){if(!(null!=y&&!1!==y)){this.vr(null)
-return}}else H.Go(y,"$isOC").TR(0,this.gNt())}if(this.ts===!0){y=a.zy
-this.ur=y.wD
+this.DM=y
+if(this.C8===!0){if(!(null!=y&&!1!==y)){this.xY(null)
+return}}else H.Go(y,"$isOC").TR(0,this.gAJ())}if(this.xS===!0){y=a.Lx
+this.k0=y.wD
 y=M.oO("repeat",y,z,b)
-this.wC=y}else{y=a.fu
-this.ur=y.wD
+this.h6=y}else{y=a.YI
+this.k0=y.wD
 y=M.oO("bind",y,z,b)
-this.wC=y}if(this.ur!==!0)J.mu(y,this.gNt())
-this.vr(null)},
-vr:[function(a){var z,y
-if(this.D2===!0){z=this.vL
-if(this.qe!==!0){H.Go(z,"$isOC")
-z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Io([])
-return}}y=this.wC
-if(this.ur!==!0){H.Go(y,"$isOC")
-y=y.gP(y)}this.Io(this.ts!==!0?[y]:y)},"$1","gNt",2,0,19,13],
-Io:function(a){var z,y
+this.h6=y}if(this.k0!==!0)J.mu(y,this.gAJ())
+this.xY(null)},
+xY:[function(a){var z,y
+if(this.Yq===!0){z=this.DM
+if(this.C8!==!0){H.Go(z,"$isOC")
+z=z.gP(z)}if(!(null!=z&&!1!==z)){this.t3([])
+return}}y=this.h6
+if(this.k0!==!0){H.Go(y,"$isOC")
+y=y.gP(y)}this.t3(this.xS!==!0?[y]:y)},"$1","gAJ",2,0,19,13],
+t3:function(a){var z,y
 z=J.x(a)
 if(!z.$isWO)a=!!z.$isQV?z.br(a):[]
-z=this.vy
+z=this.d8
 if(a===z)return
-this.Ke()
-this.S6=a
-if(!!J.x(a).$iswn&&this.ts===!0&&this.ur!==!0){if(a.gb3()!=null)a.sb3([])
-this.VC=a.gQV().yI(this.gU0())}y=this.S6
+this.R5()
+this.h5=a
+if(!!J.x(a).$iswn&&this.xS===!0&&this.k0!==!0){if(a.gSE()!=null)a.sSE([])
+this.IY=a.gQV().yI(this.gLH())}y=this.h5
 y=y!=null?y:[]
-this.lw(G.jj(y,0,J.q8(y),z,0,z.length))},
-xS:function(a){var z,y,x,w
-if(J.xC(a,-1))return this.YS.rF
+this.lC(G.jj(y,0,J.q8(y),z,0,z.length))},
+OW:function(a){var z,y,x,w
+if(J.xC(a,-1))return this.e9.N1
 z=$.vH()
-y=this.Rj
+y=this.JI
 if(a>>>0!==a||a>=y.length)return H.e(y,a)
-x=z.t(0,y[a]).gQo()
-if(x==null)return this.xS(a-1)
-if(!M.CF(x)||x===this.YS.rF)return x
-w=M.SB(x).gos()
+x=z.t(0,y[a]).ghe()
+if(x==null)return this.OW(a-1)
+if(!M.CF(x)||x===this.e9.N1)return x
+w=M.SB(x).gF3()
 if(w==null)return x
-return w.xS(w.Rj.length-1)},
-ne:function(a){var z,y,x,w,v,u,t
-z=this.xS(J.Hn(a,1))
-y=this.xS(a)
-J.TmB(this.YS.rF)
-x=C.Nm.W4(this.Rj,a)
+return w.OW(w.JI.length-1)},
+nV:function(a){var z,y,x,w,v,u,t
+z=this.OW(J.Hn(a,1))
+y=this.OW(a)
+J.TmB(this.e9.N1)
+x=C.Nm.W4(this.JI,a)
 for(w=J.RE(x),v=J.RE(z);!J.xC(y,z);){u=v.guD(z)
 if(u==null?y==null:u===y)y=z
 t=u.parentNode
 if(t!=null)t.removeChild(u)
 w.mx(x,u)}return x},
-lw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
-if(this.ky||J.FN(a)===!0)return
-u=this.YS
-t=u.rF
+lC:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
+if(this.Ag||J.FN(a)===!0)return
+u=this.e9
+t=u.N1
 if(J.TmB(t)==null){this.xO(0)
-return}s=this.vy
-Q.Y5(s,this.S6,a)
-z=u.nF
-if(!this.Wv){this.Wv=!0
-r=J.fx(!!J.x(u.rF).$isDT?u.rF:u)
-if(r!=null){this.eY=r.Mn.CE(t)
-this.TC=null}}q=P.YM(P.N3R(),null,null,null,null)
+return}s=this.d8
+Q.Y5(s,this.h5,a)
+z=u.dH
+if(!this.vJ){this.vJ=!0
+r=J.qy(!!J.x(u.N1).$isDT?u.N1:u)
+if(r!=null){this.DO=r.Mn.A5(t)
+this.Fy=null}}q=P.YM(P.N3R(),null,null,null,null)
 for(p=J.w1(a),o=p.gA(a),n=0;o.G();){m=o.gl()
 for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.lo
-i=this.ne(J.ew(k.gvH(m),n))
+i=this.nV(J.ew(k.gvH(m),n))
 if(!J.xC(i,$.zl()))q.u(0,j,i)}l=m.gNg()
 if(typeof l!=="number")return H.s(l)
 n-=l}for(p=p.gA(a);p.G();){m=p.gl()
 for(o=J.RE(m),h=o.gvH(m);J.u6(h,J.ew(o.gvH(m),m.gNg()));++h){if(h>>>0!==h||h>=s.length)return H.e(s,h)
 y=s[h]
 x=q.Rz(0,y)
-if(x==null)try{if(this.eY!=null)y=this.RV(y)
+if(x==null)try{if(this.DO!=null)y=this.Mv(y)
 if(y==null)x=$.zl()
 else x=u.ZK(0,y,z)}catch(g){l=H.Ru(g)
 w=l
@@ -19292,55 +19677,55 @@
 if(l.Gv!==0)H.vh(P.w("Future already completed"))
 l.CG(k,v)
 x=$.zl()}l=x
-f=this.xS(h-1)
-e=J.TmB(u.rF)
-C.Nm.xe(this.Rj,h,l)
-e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.Oq(u,0),H.Oq(u,1)]);u.G();)this.Ep(u.lo)},"$1","gU0",2,0,219,220],
-Ep:[function(a){var z,y,x
+f=this.OW(h-1)
+e=J.TmB(u.N1)
+C.Nm.xe(this.JI,h,l)
+e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.u3(u,0),H.u3(u,1)]);u.G();)this.ET(u.lo)},"$1","gLH",2,0,223,224],
+ET:[function(a){var z,y,x
 z=$.vH()
 z.toString
 y=H.of(a,"expando$values")
-x=(y==null?null:H.of(y,z.J4())).gu2()
+x=(y==null?null:H.of(y,z.YV())).gmD()
 z=new H.a7(x,x.length,0,null)
-z.$builtinTypeInfo=[H.Oq(x,0)]
-for(;z.G();)J.yd(z.lo)},"$1","gV6",2,0,221],
-Ke:function(){var z=this.VC
+z.$builtinTypeInfo=[H.u3(x,0)]
+for(;z.G();)J.yd(z.lo)},"$1","gvi",2,0,225],
+R5:function(){var z=this.IY
 if(z==null)return
 z.ed()
-this.VC=null},
+this.IY=null},
 xO:function(a){var z
-if(this.ky)return
-this.Ke()
-z=this.Rj
-H.bQ(z,this.gV6())
+if(this.Ag)return
+this.R5()
+z=this.JI
+H.bQ(z,this.gvi())
 C.Nm.sB(z,0)
-this.NC()
-this.YS.os=null
-this.ky=!0}},
+this.z9()
+this.e9.F3=null
+this.Ag=!0}},
 XT:{
-"^":"vy;rF,Cd,Vw",
+"^":"vy;N1,Cd,Xl",
 nR:function(a,b,c,d){var z
 if(!J.xC(b,"text"))return M.vy.prototype.nR.call(this,this,b,c,d)
 if(d){z=c==null?"":H.d(c)
-J.t3(this.rF,z)
-return}z=this.gmt()
+J.t3(this.N1,z)
+return}z=this.gBS()
 z.$1(J.mu(c,z))
-return $.rK?this.Un(b,c):c},
-lrv:[function(a){var z=a==null?"":H.d(a)
-J.t3(this.rF,z)},"$1","gmt",2,0,12,20]},
+return $.rK?this.Zr(b,c):c},
+un:[function(a){var z=a==null?"":H.d(a)
+J.t3(this.N1,z)},"$1","gBS",2,0,12,20]},
 VT:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
+"^":"V2;N1,Cd,Xl",
+gN1:function(){return this.N1},
 nR:function(a,b,c,d){var z,y,x
 if(!J.xC(b,"value"))return M.V2.prototype.nR.call(this,this,b,c,d)
-J.Vs(this.rF).Rz(0,b)
-if(d){M.pw(this.rF,c,b)
-return}z=this.rF
+J.Vs(this.N1).Rz(0,b)
+if(d){M.pw(this.N1,c,b)
+return}z=this.N1
 y=new M.b2(z,null,c,b)
-y.E3=M.IPt(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return $.rK?this.Un(b,y):y}}}],["template_binding.src.mustache_tokens","package:template_binding/src/mustache_tokens.dart",,S,{
+y.Ca=M.IPt(z).yI(y.gd1())
+x=y.gRD()
+M.pw(z,J.mu(y.Oi,x),b)
+return $.rK?this.Zr(b,y):y}}}],["","",,S,{
 "^":"",
 jb:{
 "^":"a;iB,wD<,UV",
@@ -19378,8 +19763,8 @@
 x=z.length
 w=C.jn.cU(x,4)*4
 if(w>=x)return H.e(z,w)
-return y+H.d(z[w])},"$1","geb",2,0,222,20],
-Xb:[function(a){var z,y,x,w,v,u,t,s
+return y+H.d(z[w])},"$1","geb",2,0,226,20],
+eF:[function(a){var z,y,x,w,v,u,t,s
 z=this.iB
 if(0>=z.length)return H.e(z,0)
 y=P.p9(z[0])
@@ -19389,7 +19774,7 @@
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gqt",2,0,223,224],
+y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gqt",2,0,227,228],
 l3:function(a,b){this.UV=this.iB.length===5?this.geb():this.gqt()},
 static:{"^":"rz5,xN8,t3a,epG,oM,Ftg",j9:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 if(a==null||a.length===0)return
@@ -19416,10 +19801,10 @@
 v=o+2}if(v===z)w.push("")
 y=new S.jb(w,u,null)
 y.l3(w,u)
-return y}}}}],["vm_connect_element","package:observatory/src/elements/vm_connect.dart",,V,{
+return y}}}}],["","",,V,{
 "^":"",
 Pa:{
-"^":"V52;P5,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V52;P5,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gN:function(a){return a.P5},
 sN:function(a,b){a.P5=this.ct(a,C.ft,a.P5,b)},
 ghS:function(a){var z=a.P5
@@ -19428,7 +19813,7 @@
 gnI:function(a){var z=$.Kh.Eh
 if(z==null)return!1
 return J.xC(H.Go(z,"$isKM").N,a.P5)},
-xX:[function(a,b,c,d){var z,y,x,w
+Ke:[function(a,b,c,d){var z,y,x,w
 z=J.RE(b)
 y=z.gpL(b)
 if(typeof y!=="number")return y.D()
@@ -19437,25 +19822,25 @@
 x=$.Kh.Eh
 if(x==null||!J.xC(J.l2(x),a.P5)){z=$.Kh
 y=a.P5
-y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 y.Lw()
 z.swv(0,y)}w=J.Vs(d).MW.getAttribute("href")
-$.Kh.Z6.bo(0,w)},"$3","gkD",6,0,162,143,102,175],
+$.Kh.Z6.bo(0,w)},"$3","gkD",6,0,165,85,104,178],
 MeB:[function(a,b,c,d){var z,y,x,w
 z=$.Kh.m2
 y=a.P5
-x=z.jY
+x=z.bq
 x.Rz(0,y)
 z.XT()
 z.XT()
 w=z.wu.IU+".history"
-$.Vy().setItem(w,C.xr.KP(x))},"$3","gAS",6,0,162,143,102,175],
+$.Vy().setItem(w,C.xr.KP(x))},"$3","gAS",6,0,165,85,104,178],
 static:{fXx:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -19466,7 +19851,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 D2:{
-"^":"V53;ot,YE,lr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V53;ot,YE,lr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gvm:function(a){return a.ot},
 svm:function(a,b){a.ot=this.ct(a,C.uX,a.ot,b)},
 gHL:function(a){return a.YE},
@@ -19476,22 +19861,22 @@
 yY:function(a){this.Vf(a)},
 Kl:function(a,b){if(J.co(b,"ws://"))return b
 return"ws://"+H.d(b)+"/ws"},
-ny:[function(a,b,c,d){var z,y,x
+nyC:[function(a,b,c,d){var z,y,x
 J.Kr(b)
 z=this.Kl(a,a.ot)
 d=$.Kh.m2.TP(z)
 y=$.Kh
-x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 x.Lw()
 y.swv(0,x)
-$.Kh.Z6.bo(0,"#/vm")},"$3","gMt",6,0,111,2,102,103],
+$.Kh.Z6.bo(0,"#/vm")},"$3","gMt",6,0,113,2,104,105],
 qf:[function(a,b,c,d){J.Kr(b)
-this.Vf(a)},"$3","gzG",6,0,111,2,102,103],
-Vf:function(a){G.FI(a.YE).ml(new V.Vn(a)).OA(new V.oU(a))},
-Kq:function(a){var z=P.ii(0,0,0,0,0,1)
+this.Vf(a)},"$3","gzG",6,0,113,2,104,105],
+Vf:function(a){G.n8(a.YE).ml(new V.Vn(a)).OA(new V.oU(a))},
+U2:function(a){var z=P.ii(0,0,0,0,0,1)
 a.tB=this.ct(a,C.O9,a.tB,z)},
 static:{NI:function(a){var z,y,x
-z=Q.ch(null,U.Z5)
+z=Q.ch(null,L.Z5)
 y=P.L5(null,null,null,P.qU,W.I0)
 x=P.qU
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
@@ -19499,13 +19884,13 @@
 a.YE="localhost:9222"
 a.lr=z
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=y
 a.ZQ=x
 C.aXh.ZL(a)
 C.aXh.XI(a)
-C.aXh.Kq(a)
+C.aXh.U2(a)
 return a}}},
 V53:{
 "^":"uL+Pi;",
@@ -19522,42 +19907,42 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 c$0:{if(y.t(a,x).gw8()==null)break c$0
-J.bi(z.lr,y.t(a,x))}++x}},"$1",null,2,0,null,225,"call"],
+J.bi(z.lr,y.t(a,x))}++x}},"$1",null,2,0,null,229,"call"],
 $isEH:true},
 oU:{
 "^":"TpZ:12;b",
 $1:[function(a){J.Z8(this.b.lr)},"$1",null,2,0,null,2,"call"],
-$isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
+$isEH:true}}],["","",,X,{
 "^":"",
 I5:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
-static:{vC:function(a){var z,y
+"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
+static:{yC:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Pe=!1
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
 C.vA.ZL(a)
 C.vA.XI(a)
-return a}}}}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
+return a}}}}],["","",,U,{
 "^":"",
 el:{
-"^":"V54;uB,lc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"V54;uB,lc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,Ap,SD,oG,ZM,ZQ",
 gwv:function(a){return a.uB},
 swv:function(a,b){a.uB=this.ct(a,C.RJ,a.uB,b)},
 gkc:function(a){return a.lc},
 skc:function(a,b){a.lc=this.ct(a,C.yh,a.lc,b)},
-SK:[function(a,b){J.cI(a.uB).YM(b)},"$1","gvC",2,0,19,98],
+SK:[function(a,b){J.cI(a.uB).YM(b)},"$1","gvC",2,0,19,100],
 static:{oH:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 a.Cc=[]
-a.q1=!1
+a.Ap=!1
 a.oG=!1
 a.ZM=z
 a.ZQ=y
@@ -19610,13 +19995,13 @@
 y.$ish4=z
 y.$isKV=z
 y.$isa=z
+P.ns.$isa=z
 P.oz.$isa=z
 P.a.$isa=z
 y=P.WO
 y.$isWO=z
 y.$isQV=z
 y.$isa=z
-P.ns.$isa=z
 y=K.Aep
 y.$isAep=z
 y.$isa=z
@@ -19629,8 +20014,8 @@
 y=U.uku
 y.$isIp=z
 y.$isa=z
-y=U.fp
-y.$isfp=z
+y=U.elO
+y.$iselO=z
 y.$isIp=z
 y.$isa=z
 y=U.ae
@@ -19642,7 +20027,7 @@
 y=U.c0
 y.$isIp=z
 y.$isa=z
-y=U.no
+y=U.noG
 y.$isIp=z
 y.$isa=z
 y=U.Nb
@@ -19673,7 +20058,7 @@
 y.$ish4=z
 y.$isKV=z
 y.$isa=z
-y=U.U2
+y=L.U2
 y.$isU2=z
 y.$isa=z
 y=D.af
@@ -19712,9 +20097,7 @@
 y=G.DA
 y.$isDA=z
 y.$isa=z
-D.Z9.$isa=z
 y=W.BI
-y.$isBI=z
 y.$isea=z
 y.$isa=z
 y=W.ea
@@ -19730,6 +20113,7 @@
 y=P.a2
 y.$isa2=z
 y.$isa=z
+D.Z9.$isa=z
 W.fJ.$isa=z
 y=W.ew7
 y.$isea=z
@@ -19750,18 +20134,19 @@
 y.$isa=z
 G.OS.$isa=z
 y=D.Mk
+y.$isMk=z
 y.$isaf=z
 y.$isa=z
 y=W.f5
 y.$isf5=z
 y.$isea=z
 y.$isa=z
-P.A5.$isa=z
+P.A0.$isa=z
 y=W.PGY
 y.$isea=z
 y.$isa=z
-y=L.Tv
-y.$isTv=z
+y=L.Zl
+y.$isZl=z
 y.$isa=z
 K.GK.$isa=z
 y=N.HV
@@ -19784,7 +20169,7 @@
 y=U.Ip
 y.$isIp=z
 y.$isa=z
-y=U.Z5
+y=L.Z5
 y.$isZ5=z
 y.$isa=z
 G.Ni.$isa=z
@@ -19806,8 +20191,8 @@
 y.$isNOT=z
 y.$isyX=z
 y.$isa=z
-y=P.e4y
-y.$ise4y=z
+y=P.AN
+y.$isAN=z
 y.$isa=z
 y=P.dl
 y.$isdl=z
@@ -19821,8 +20206,8 @@
 y=P.Z0
 y.$isZ0=z
 y.$isa=z
-y=P.Xa
-y.$isXa=z
+y=P.kWp
+y.$iskWp=z
 y.$isa=z
 y=P.QV
 y.$isQV=z
@@ -19868,8 +20253,8 @@
 y=A.Wq
 y.$isWq=z
 y.$isa=z
-y=L.AR
-y.$isAR=z
+y=L.lg
+y.$islg=z
 y.$isOC=z
 y.$isa=z
 y=W.hsw
@@ -19884,13 +20269,13 @@
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
+return J.Dx(a)}
 J.U6=function(a){if(typeof a=="string")return J.O.prototype
 if(a==null)return a
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
+return J.Dx(a)}
 J.Wx=function(a){if(typeof a=="number")return J.P.prototype
 if(a==null)return a
 if(!(a instanceof P.a))return J.kdQ.prototype
@@ -19903,27 +20288,29 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
-J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.Xh.prototype
-return J.VA.prototype}if(typeof a=="string")return J.O.prototype
+return J.Dx(a)}
+J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
+return J.VA7.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.CDU.prototype
 if(typeof a=="boolean")return J.yEe.prototype
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
+return J.Dx(a)}
 J.A1=function(a,b){return J.RE(a).seT(a,b)}
 J.A4=function(a,b){return J.RE(a).sjx(a,b)}
-J.A6=function(a){return J.RE(a).gG3(a)}
 J.AF=function(a){return J.RE(a).gIi(a)}
 J.AG=function(a){return J.x(a).bu(a)}
 J.AI=function(a,b){return J.RE(a).su6(a,b)}
 J.AL=function(a){return J.RE(a).gW6(a)}
+J.AR=function(a){return J.RE(a).gWt(a)}
 J.Ac=function(a,b){return J.RE(a).siZ(a,b)}
 J.Ae=function(a,b){return J.RE(a).sd4(a,b)}
+J.At=function(a){return J.RE(a).gvC(a)}
 J.Aw=function(a){return J.RE(a).gb6(a)}
 J.B9=function(a,b){return J.RE(a).shN(a,b)}
 J.BC=function(a,b){return J.RE(a).sja(a,b)}
+J.BL=function(a,b){return J.RE(a).sRd(a,b)}
 J.BT=function(a){return J.RE(a).gNG(a)}
 J.BZ=function(a){return J.RE(a).gnv(a)}
 J.Bj=function(a,b){return J.RE(a).Tk(a,b)}
@@ -19931,18 +20318,17 @@
 return J.Wx(a).E(a,b)}
 J.By=function(a,b){return J.RE(a).sLW(a,b)}
 J.C3=function(a,b){return J.RE(a).sig(a,b)}
+J.C7=function(a){return J.RE(a).gLc(a)}
 J.C8=function(a){return J.RE(a).gSO(a)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
 J.CN=function(a){return J.RE(a).gd0(a)}
 J.Cg=function(a){return J.RE(a).goL(a)}
 J.Cl=function(a,b){return J.Wx(a).Z(a,b)}
-J.Cm=function(a){return J.RE(a).gvC(a)}
-J.Cr=function(a){return J.RE(a).gEQ(a)}
 J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
+J.D4=function(a,b){return J.RE(a).sA0(a,b)}
 J.DB=function(a){return J.RE(a).gn0(a)}
 J.DF=function(a,b){return J.RE(a).soc(a,b)}
 J.DO=function(a){return J.RE(a).gR(a)}
-J.DP=function(a,b,c){return J.U6(a).XU(a,b,c)}
 J.Dh=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
 J.Do=function(a){return J.RE(a).gM0(a)}
 J.Ds=function(a){return J.RE(a).gPj(a)}
@@ -19956,10 +20342,15 @@
 J.Er=function(a){return J.RE(a).gu6(a)}
 J.Ew=function(a){return J.RE(a).gkm(a)}
 J.F9=function(a){return J.RE(a).gvm(a)}
+J.FH=function(a,b){return J.RE(a).sVX(a,b)}
+J.FI=function(a,b){return J.RE(a).sih(a,b)}
 J.FN=function(a){return J.U6(a).gl0(a)}
 J.FS=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
 J.FW=function(a,b){return J.Qc(a).iM(a,b)}
+J.FY=function(a){return J.RE(a).gKJ(a)}
 J.Fd=function(a,b,c){return J.w1(a).aM(a,b,c)}
+J.Fy=function(a){return J.RE(a).h9(a)}
+J.G0=function(a,b,c){return J.U6(a).XU(a,b,c)}
 J.GH=function(a){return J.RE(a).gyW(a)}
 J.GJ=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
 J.GL=function(a){return J.RE(a).gfN(a)}
@@ -19971,12 +20362,14 @@
 J.H4=function(a,b){return J.RE(a).wR(a,b)}
 J.HB=function(a){return J.RE(a).gxT(a)}
 J.HP=function(a){return J.RE(a).gFK(a)}
-J.Ha=function(a,b,c){return J.RE(a).ek(a,b,c)}
+J.HT=function(a,b){return J.RE(a).sLc(a,b)}
+J.Hg=function(a){return J.RE(a).gYe(a)}
 J.Hh=function(a){return J.Wx(a).yu(a)}
 J.Hn=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
 return J.Wx(a).W(a,b)}
 J.I2=function(a){return J.RE(a).gwv(a)}
 J.IA=function(a){return J.RE(a).gjT(a)}
+J.II=function(a){return J.w1(a).Jd(a)}
 J.IO=function(a){return J.RE(a).gRH(a)}
 J.IP=function(a){return J.RE(a).gSs(a)}
 J.IR=function(a){return J.RE(a).gYt(a)}
@@ -20002,7 +20395,9 @@
 J.Kd=function(a){return J.RE(a).gCF(a)}
 J.Kl=function(a){return J.RE(a).gBP(a)}
 J.Kr=function(a){return J.RE(a).e6(a)}
+J.Kt=function(a){return J.RE(a).gG3(a)}
 J.Ky=function(a){return J.RE(a).gRk(a)}
+J.L1=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
 J.L6=function(a){return J.RE(a).glD(a)}
 J.L9=function(a,b){return J.RE(a).sdU(a,b)}
 J.LB=function(a){return J.RE(a).gX0(a)}
@@ -20010,7 +20405,7 @@
 J.LL=function(a){return J.Wx(a).HG(a)}
 J.LM=function(a,b){return J.RE(a).szj(a,b)}
 J.Ld=function(a,b){return J.w1(a).eR(a,b)}
-J.Lh=function(a){return J.RE(a).gff(a)}
+J.Lh=function(a,b,c){return J.RE(a).ek(a,b,c)}
 J.Lm=function(a){return J.x(a).gbx(a)}
 J.Ln=function(a){return J.RE(a).gdU(a)}
 J.Lp=function(a){return J.RE(a).geT(a)}
@@ -20018,9 +20413,10 @@
 J.MB=function(a){return J.RE(a).gzG(a)}
 J.ME=function(a,b){return J.RE(a).sUo(a,b)}
 J.MO=function(a,b,c){return J.RE(a).ZK(a,b,c)}
+J.MU=function(a){return J.RE(a).Fc(a)}
 J.MX=function(a,b){return J.RE(a).sPj(a,b)}
 J.Me=function(a,b){return J.w1(a).aN(a,b)}
-J.Mh=function(a){return J.RE(a).gMt(a)}
+J.Mh=function(a,b){return J.RE(a).sTj(a,b)}
 J.Mo=function(a){return J.RE(a).gx6(a)}
 J.Mp=function(a){return J.w1(a).wg(a)}
 J.Mx=function(a){return J.RE(a).gks(a)}
@@ -20030,10 +20426,10 @@
 J.NC=function(a){return J.RE(a).gHy(a)}
 J.NE=function(a,b){return J.RE(a).sHL(a,b)}
 J.NO=function(a,b){return J.RE(a).soE(a,b)}
-J.NQ=function(a){return J.RE(a).gjb(a)}
 J.NT=function(a,b,c){return J.U6(a).eM(a,b,c)}
 J.NV=function(a,b){return J.RE(a).sKw(a,b)}
 J.NZ=function(a,b){return J.RE(a).sRu(a,b)}
+J.Nd=function(a){return J.w1(a).br(a)}
 J.Nf=function(a,b){return J.RE(a).syw(a,b)}
 J.Nj=function(a,b,c){return J.rY(a).Nj(a,b,c)}
 J.No=function(a,b){return J.RE(a).sR(a,b)}
@@ -20042,16 +20438,17 @@
 J.O6=function(a){return J.RE(a).goc(a)}
 J.OB=function(a){return J.RE(a).gfg(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
+J.OH=function(a,b){return J.RE(a).sMZ(a,b)}
 J.OT=function(a){return J.RE(a).gXE(a)}
 J.Ok=function(a){return J.RE(a).ghU(a)}
 J.P2=function(a,b){return J.RE(a).sU4(a,b)}
-J.P4=function(a){return J.RE(a).gVr(a)}
 J.PN=function(a,b){return J.RE(a).sCI(a,b)}
 J.PP=function(a,b){return J.RE(a).snv(a,b)}
 J.PY=function(a){return J.RE(a).goN(a)}
 J.Pf=function(a){return J.RE(a).gWw(a)}
 J.Pl=function(a,b){return J.RE(a).sM6(a,b)}
 J.Pp=function(a,b){return J.rY(a).j(a,b)}
+J.Pq=function(a){return J.RE(a).gqF(a)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
 J.Q2=function(a){return J.RE(a).gO3(a)}
 J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
@@ -20071,6 +20468,7 @@
 J.RC=function(a){return J.RE(a).gTA(a)}
 J.RX=function(a,b){return J.RE(a).sjl(a,b)}
 J.Rg=function(a){return J.x(a).gAY(a)}
+J.Rp=function(a,b){return J.RE(a).sod(a,b)}
 J.Ry=function(a){return J.RE(a).gLW(a)}
 J.SF=function(a,b){return J.RE(a).sIi(a,b)}
 J.SG=function(a){return J.RE(a).gDI(a)}
@@ -20079,7 +20477,9 @@
 J.SO=function(a,b){return J.RE(a).sCF(a,b)}
 J.Sf=function(a,b){return J.RE(a).sXE(a,b)}
 J.Sj=function(a,b){return J.RE(a).svC(a,b)}
+J.Sl=function(a){return J.RE(a).gxb(a)}
 J.So=function(a,b){return J.RE(a).X3(a,b)}
+J.Sr=function(a){return J.RE(a).gvq(a)}
 J.T5=function(a,b){return J.RE(a).stT(a,b)}
 J.TG=function(a){return J.RE(a).mC(a)}
 J.TM=function(a){return J.RE(a).gOd(a)}
@@ -20090,21 +20490,19 @@
 J.TmB=function(a){return J.RE(a).gBy(a)}
 J.Tr=function(a){return J.RE(a).gCj(a)}
 J.Ts=function(a){return J.RE(a).gfG(a)}
+J.Tv=function(a){return J.RE(a).gB1(a)}
 J.Tx=function(a,b){return J.RE(a).spf(a,b)}
-J.U8=function(a){return J.RE(a).gUQ(a)}
-J.UA=function(a){return J.RE(a).gP2(a)}
+J.U8=function(a){return J.RE(a).gEQ(a)}
 J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
 return J.Wx(a).w(a,b)}
 J.UP=function(a){return J.RE(a).gnZ(a)}
 J.UQ=function(a,b){if(a.constructor==Array||typeof a=="string"||H.Gp(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
 return J.U6(a).t(a,b)}
-J.US=function(a){return J.RE(a).gWt(a)}
 J.UT=function(a){return J.RE(a).gDQ(a)}
 J.Uf=function(a){return J.RE(a).gDD(a)}
 J.Uv=function(a,b){return J.RE(a).WO(a,b)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
-J.V5=function(a,b,c,d){return J.RE(a).Yb(a,b,c,d)}
-J.VL=function(a){return J.RE(a).gR2(a)}
+J.VA=function(a,b){return J.w1(a).Vr(a,b)}
 J.VZ=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
 J.Vf=function(a){return J.RE(a).gVE(a)}
 J.Vj=function(a,b){return J.RE(a).Md(a,b)}
@@ -20117,6 +20515,7 @@
 J.WI=function(a,b){return J.RE(a).sLF(a,b)}
 J.WT=function(a){return J.RE(a).gFR(a)}
 J.WX=function(a){return J.RE(a).gbJ(a)}
+J.Wa=function(a,b){return J.U6(a).Mw(a,b)}
 J.Wk=function(a){return J.RE(a).gc9(a)}
 J.Wp=function(a){return J.RE(a).gQU(a)}
 J.Wy=function(a,b){return J.RE(a).sBk(a,b)}
@@ -20125,8 +20524,11 @@
 return J.Wx(a).V(a,b)}
 J.XF=function(a,b){return J.RE(a).siC(a,b)}
 J.XJ=function(a){return J.RE(a).gRY(a)}
+J.Xf=function(a){return J.RE(a).gbq(a)}
 J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
 J.Xi=function(a){return J.RE(a).gr9(a)}
+J.Xu=function(a){return J.RE(a).gq1(a)}
+J.YG=function(a){return J.RE(a).gQP(a)}
 J.YH=function(a){return J.RE(a).gpM(a)}
 J.YQ=function(a){return J.RE(a).gPL(a)}
 J.Yf=function(a){return J.w1(a).gIr(a)}
@@ -20147,6 +20549,7 @@
 J.a3=function(a){return J.RE(a).gBk(a)}
 J.aA=function(a){return J.RE(a).gzY(a)}
 J.aB=function(a){return J.RE(a).gql(a)}
+J.aN=function(a){return J.RE(a).fV(a)}
 J.aT=function(a){return J.RE(a).god(a)}
 J.aW=function(a){return J.RE(a).gJp(a)}
 J.au=function(a,b){return J.RE(a).sNG(a,b)}
@@ -20155,9 +20558,10 @@
 J.bH=function(a,b,c,d){return J.RE(a).ea(a,b,c,d)}
 J.bL=function(a){return J.RE(a).ghS(a)}
 J.bN=function(a,b){return J.RE(a).GE(a,b)}
+J.bS=function(a){return J.RE(a).gUo(a)}
+J.bh=function(a){return J.RE(a).gLf(a)}
 J.bi=function(a,b){return J.w1(a).h(a,b)}
 J.bj=function(a,b){return J.w1(a).FV(a,b)}
-J.br=function(a){return J.RE(a).gj8(a)}
 J.bs=function(a){return J.RE(a).JP(a)}
 J.bu=function(a){return J.RE(a).gyw(a)}
 J.cG=function(a){return J.RE(a).Ki(a)}
@@ -20165,38 +20569,40 @@
 J.cO=function(a){return J.RE(a).gjx(a)}
 J.cU=function(a){return J.RE(a).gHh(a)}
 J.cV=function(a,b){return J.RE(a).sjT(a,b)}
+J.cZ=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
 J.cj=function(a){return J.RE(a).gMT(a)}
 J.cl=function(a,b){return J.RE(a).sHt(a,b)}
 J.co=function(a,b){return J.rY(a).nC(a,b)}
 J.cs=function(a){return J.RE(a).gwJ(a)}
 J.d5=function(a){return J.Wx(a).gKy(a)}
-J.d7=function(a){return J.RE(a).giG(a)}
 J.dA=function(a){return J.RE(a).gV5(a)}
 J.dF=function(a){return J.w1(a).zH(a)}
 J.dY=function(a){return J.RE(a).ga4(a)}
 J.dc=function(a,b){return J.RE(a).smH(a,b)}
 J.de=function(a){return J.RE(a).gGd(a)}
-J.df=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
+J.df=function(a){return J.RE(a).QE(a)}
 J.dk=function(a,b){return J.RE(a).sMj(a,b)}
 J.du=function(a){return J.RE(a).gUj(a)}
+J.dw=function(a){return J.RE(a).gMt(a)}
 J.eS=function(a){return J.RE(a).gjO(a)}
 J.eT=function(a){return J.RE(a).gnD(a)}
 J.eU=function(a){return J.RE(a).gRh(a)}
 J.ee=function(a){return J.RE(a).giC(a)}
 J.eg=function(a){return J.RE(a).Ms(a)}
-J.et=function(a,b){return J.U6(a).kJ(a,b)}
 J.ew=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
 return J.Qc(a).g(a,b)}
+J.f2=function(a){return J.RE(a).gRd(a)}
 J.fD=function(a,b){return J.RE(a).Id(a,b)}
-J.fR=function(a,b){return J.RE(a).sMZ(a,b)}
 J.fU=function(a){return J.RE(a).gDX(a)}
 J.fa=function(a,b){return J.RE(a).sEQ(a,b)}
 J.fb=function(a,b){return J.RE(a).sql(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
 J.fi=function(a,b){return J.RE(a).ps(a,b)}
-J.fx=function(a){return J.RE(a).gG5(a)}
+J.fp=function(a){return J.RE(a).yy(a)}
+J.fy=function(a){return J.RE(a).gTj(a)}
 J.h6=function(a){return J.RE(a).gML(a)}
 J.h9=function(a,b){return J.RE(a).sWA(a,b)}
+J.hI=function(a){return J.RE(a).gUQ(a)}
 J.hS=function(a,b){return J.w1(a).srZ(a,b)}
 J.hh=function(a,b){return J.Wx(a).Y(a,b)}
 J.hn=function(a){return J.RE(a).gEu(a)}
@@ -20207,7 +20613,6 @@
 J.iL=function(a){return J.RE(a).gNb(a)}
 J.iM=function(a,b){return J.RE(a).st5(a,b)}
 J.iS=function(a){return J.RE(a).gox(a)}
-J.iY=function(a){return J.RE(a).gvc(a)}
 J.id=function(a){return J.RE(a).gR1(a)}
 J.ih=function(a){return J.RE(a).ga5(a)}
 J.io=function(a){return J.RE(a).gja(a)}
@@ -20234,7 +20639,6 @@
 J.kX=function(a,b){return J.RE(a).sNb(a,b)}
 J.kZ=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
 J.kl=function(a,b){return J.w1(a).ez(a,b)}
-J.ks=function(a){return J.RE(a).gB1(a)}
 J.kv=function(a){return J.RE(a).gDf(a)}
 J.ky=function(a,b,c){return J.RE(a).dR(a,b,c)}
 J.l2=function(a){return J.RE(a).gN(a)}
@@ -20245,8 +20649,8 @@
 J.lk=function(a){return J.RE(a).gRq(a)}
 J.m4=function(a){return J.RE(a).gig(a)}
 J.m5=function(a){return J.RE(a).gQr(a)}
+J.m8=function(a){return J.RE(a).gR2(a)}
 J.mB=function(a){return J.RE(a).Zi(a)}
-J.mI=function(a,b){return J.RE(a).rW(a,b)}
 J.mP=function(a){return J.RE(a).gzj(a)}
 J.mU=function(a,b){return J.RE(a).skm(a,b)}
 J.mY=function(a){return J.w1(a).gA(a)}
@@ -20254,15 +20658,15 @@
 J.my=function(a,b){return J.RE(a).sQl(a,b)}
 J.mz=function(a,b){return J.RE(a).scH(a,b)}
 J.n0=function(a,b){return J.RE(a).Rf(a,b)}
-J.n8=function(a){return J.RE(a).gUo(a)}
 J.n9=function(a){return J.RE(a).gQq(a)}
 J.nA=function(a,b){return J.RE(a).sPL(a,b)}
 J.nC=function(a,b){return J.RE(a).sCd(a,b)}
-J.nE1=function(a,b){return J.w1(a).ou(a,b)}
 J.nG=function(a){return J.RE(a).gv8(a)}
 J.nb=function(a){return J.RE(a).gyX(a)}
 J.nq=function(a){return J.RE(a).gFL(a)}
 J.o4=function(a){return J.RE(a).gAS(a)}
+J.o8=function(a,b){return J.RE(a).sqF(a,b)}
+J.o9=function(a){return J.RE(a).gP2(a)}
 J.oD=function(a,b){return J.RE(a).hP(a,b)}
 J.oJ=function(a,b){return J.RE(a).srs(a,b)}
 J.oN=function(a){return J.RE(a).gj4(a)}
@@ -20279,22 +20683,21 @@
 J.pm=function(a){return J.RE(a).gt0(a)}
 J.q0=function(a,b){return J.RE(a).syG(a,b)}
 J.q8=function(a){return J.U6(a).gB(a)}
-J.qA=function(a){return J.w1(a).br(a)}
-J.qD=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.ql=function(a){return J.RE(a).gaB(a)}
 J.qq=function(a){return J.RE(a).dQ(a)}
 J.qv=function(a){return J.RE(a).pj(a)}
+J.qy=function(a){return J.RE(a).gA0(a)}
 J.r0=function(a){return J.RE(a).gi6(a)}
-J.rA=function(a,b){return J.w1(a).Nk(a,b)}
+J.r5=function(a,b,c){return J.RE(a).aD(a,b,c)}
+J.r8=function(a,b){return J.w1(a).Nk(a,b)}
 J.ra=function(a){return J.RE(a).gJ6(a)}
+J.rg=function(a,b){return J.RE(a).Gy(a,b)}
 J.rr=function(a){return J.rY(a).bS(a)}
 J.rw=function(a){return J.RE(a).gMl(a)}
-J.ry=function(a){return J.RE(a).gYe(a)}
 J.t3=function(a,b){return J.RE(a).sa4(a,b)}
 J.t8=function(a){return J.RE(a).gYQ(a)}
-J.tC=function(a){return J.RE(a).gjY(a)}
+J.tC=function(a){return J.RE(a).gj8(a)}
 J.tH=function(a,b){return J.RE(a).sHy(a,b)}
-J.tO=function(a){return J.w1(a).Jd(a)}
 J.tQ=function(a,b){return J.RE(a).swv(a,b)}
 J.tT=function(a,b,c){return J.RE(a).X6(a,b,c)}
 J.ta=function(a,b){return J.RE(a).sP(a,b)}
@@ -20305,7 +20708,6 @@
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
 J.uH=function(a,b){return J.RE(a).sP2(a,b)}
-J.uM=function(a,b){return J.RE(a).sod(a,b)}
 J.uP=function(a,b){return J.RE(a).sJ6(a,b)}
 J.uW=function(a){return J.RE(a).gyG(a)}
 J.uY=function(a){return J.w1(a).grZ(a)}
@@ -20314,13 +20716,12 @@
 J.up=function(a){return J.RE(a).gkh(a)}
 J.uy=function(a){return J.RE(a).gHm(a)}
 J.v1=function(a){return J.x(a).giO(a)}
+J.vI=function(a){return J.RE(a).gVX(a)}
 J.vJ=function(a,b){return J.RE(a).spM(a,b)}
 J.vP=function(a){return J.RE(a).My(a)}
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
-J.vc=function(a,b){return J.RE(a).sG5(a,b)}
 J.vi=function(a){return J.RE(a).gNa(a)}
-J.w4=function(a,b){return J.RE(a).x4(a,b)}
 J.w7=function(a,b){return J.RE(a).syW(a,b)}
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wD=function(a,b){return J.w1(a).sIr(a,b)}
@@ -20340,13 +20741,15 @@
 J.xQ=function(a,b){return J.RE(a).sGd(a,b)}
 J.xR=function(a){return J.RE(a).ghf(a)}
 J.xW=function(a,b){return J.RE(a).sZm(a,b)}
+J.xZ=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
+return J.Wx(a).D(a,b)}
 J.xa=function(a){return J.RE(a).geS(a)}
 J.xe=function(a){return J.RE(a).gPB(a)}
 J.xo=function(a){return J.RE(a).gJN(a)}
 J.xp=function(a,b){return J.w1(a).zV(a,b)}
 J.y2=function(a,b){return J.RE(a).mx(a,b)}
 J.yH=function(a){return J.Wx(a).Vy(a)}
-J.yI=function(a){return J.RE(a).gLf(a)}
+J.yI=function(a){return J.RE(a).gih(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
 J.yc=function(a){return J.RE(a).guS(a)}
 J.yd=function(a){return J.RE(a).xO(a)}
@@ -20355,8 +20758,6 @@
 J.yz=function(a){return J.RE(a).gLF(a)}
 J.z1=function(a){return J.RE(a).gXr(a)}
 J.z2=function(a){return J.RE(a).gG1(a)}
-J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
-return J.Wx(a).D(a,b)}
 J.zF=function(a){return J.RE(a).gHL(a)}
 J.zH=function(a){return J.RE(a).gIs(a)}
 J.zN=function(a){return J.RE(a).gM6(a)}
@@ -20367,9 +20768,10 @@
 C.Df=X.hV.prototype
 C.Gkp=Y.q6.prototype
 C.Mw=B.G6.prototype
+C.FC=T.vr.prototype
 C.ic=A.wM.prototype
 C.YZz=Q.eW.prototype
-C.RD=O.eo.prototype
+C.fe=O.eo.prototype
 C.ka=Z.ak.prototype
 C.tWO=O.VY.prototype
 C.ux=F.Be.prototype
@@ -20378,21 +20780,21 @@
 C.Jh=L.nJ.prototype
 C.qL=R.Eg.prototype
 C.MC=D.i7.prototype
-C.D4=A.Gk.prototype
+C.LTI=A.Gk.prototype
 C.ls6=X.MJ.prototype
 C.MO0=X.J3.prototype
 C.Xo=U.DK.prototype
 C.p0=N.BS.prototype
-C.Cs=O.Vb.prototype
+C.wc=O.Vb.prototype
 C.Vc=K.Ly.prototype
 C.W3=W.fJ.prototype
 C.bP=E.WS.prototype
-C.GII=E.H8.prototype
+C.tO=E.H8.prototype
 C.Ie=E.mO.prototype
 C.Ig=E.DE.prototype
-C.x4=E.U1.prototype
+C.VLs=E.U1.prototype
 C.lX=E.qM.prototype
-C.Wa=E.av.prototype
+C.OkI=E.av.prototype
 C.bZ=E.uz.prototype
 C.iR=E.Ma.prototype
 C.RVQ=E.wN.prototype
@@ -20417,8 +20819,8 @@
 C.OoF=D.St.prototype
 C.Xe=L.qk.prototype
 C.Nm=J.Q.prototype
-C.YI=J.VA.prototype
-C.jn=J.Xh.prototype
+C.YI=J.VA7.prototype
+C.jn=J.imn.prototype
 C.jN=J.CDU.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
@@ -20426,12 +20828,12 @@
 C.ct=A.UK.prototype
 C.Z3=R.LU.prototype
 C.MG=M.CX.prototype
-C.S2=W.H9.prototype
+C.S2=W.x76.prototype
 C.yp=H.eEV.prototype
 C.kD=A.md.prototype
-C.pl=A.ye.prototype
+C.br=A.ye.prototype
 C.IG=A.Bm.prototype
-C.Nk=A.Ya.prototype
+C.nn=A.Ya.prototype
 C.Mn=A.NK.prototype
 C.L8=A.Zx.prototype
 C.Y6=A.Ww.prototype
@@ -20449,8 +20851,8 @@
 C.HRc=Q.xI.prototype
 C.zb=Q.CY.prototype
 C.dX=K.nm.prototype
-C.wB=X.uw.prototype
-C.lx=A.G1.prototype
+C.uC=X.uw.prototype
+C.OKl=A.G1.prototype
 C.vB=J.kdQ.prototype
 C.aXh=V.D2.prototype
 C.J57=V.Pa.prototype
@@ -20458,13 +20860,13 @@
 C.dm=U.el.prototype
 C.ol=W.K5.prototype
 C.KZ=new H.hJ()
-C.OL=new U.WH()
+C.x4=new U.WH()
 C.MS=new H.FuS()
-C.Eq=new P.qn()
-C.qY=new T.yy()
+C.Eq=new P.k5C()
+C.qY=new T.WM()
 C.ZB=new P.yRf()
 C.pr=new P.mgb()
-C.dV=new L.iNc()
+C.aZ=new L.iNc()
 C.NU=new P.R81()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
@@ -20490,8 +20892,8 @@
 C.UZ=H.IL('qC')
 C.b7=new A.ES(C.Zg,C.BM,!1,C.UZ,!1,C.ucP)
 C.SR=new H.tx("map")
-C.MR1=H.IL('vO')
-C.S9=new A.ES(C.SR,C.BM,!1,C.MR1,!1,C.ucP)
+C.MR=H.IL('vO')
+C.S9=new A.ES(C.SR,C.BM,!1,C.MR,!1,C.ucP)
 C.ld=new H.tx("events")
 C.Gsc=H.IL('wn')
 C.Gw=new A.ES(C.ld,C.BM,!1,C.Gsc,!1,C.ucP)
@@ -20519,6 +20921,9 @@
 C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.esx)
 C.zU=new H.tx("uncheckedText")
 C.uT=new A.ES(C.zU,C.BM,!1,C.Gh,!1,C.ucP)
+C.VI=new H.tx("line")
+C.lhY=H.IL('c2')
+C.w6=new A.ES(C.VI,C.BM,!1,C.lhY,!1,C.ucP)
 C.IT=new H.tx("startPos")
 C.yw=H.IL('KN')
 C.NL=new A.ES(C.IT,C.BM,!1,C.yw,!1,C.ucP)
@@ -20532,6 +20937,8 @@
 C.rB=new H.tx("isolate")
 C.a2p=H.IL('bv')
 C.xY=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.esx)
+C.mJ=new H.tx("color")
+C.Qu=new A.ES(C.mJ,C.BM,!1,C.Gh,!1,C.ucP)
 C.bz=new H.tx("isolateChanged")
 C.Bk=new A.ES(C.bz,C.hU,!1,C.yQP,!1,C.dn)
 C.CG=new H.tx("posChanged")
@@ -20541,10 +20948,15 @@
 C.lJ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.ucP)
 C.Gs=new H.tx("sampleCount")
 C.iO=new A.ES(C.Gs,C.BM,!1,C.Gh,!1,C.esx)
+C.uG=new H.tx("linesReady")
+C.K1=new A.ES(C.uG,C.BM,!1,C.HL,!1,C.esx)
 C.oj=new H.tx("httpServer")
-C.GT=new A.ES(C.oj,C.BM,!1,C.MR1,!1,C.ucP)
+C.GT=new A.ES(C.oj,C.BM,!1,C.MR,!1,C.ucP)
 C.td=new H.tx("object")
 C.Zk=new A.ES(C.td,C.BM,!1,C.SmN,!1,C.ucP)
+C.ft=new H.tx("target")
+C.NBK=H.IL('Z5')
+C.Gz=new A.ES(C.ft,C.BM,!1,C.NBK,!1,C.ucP)
 C.TW=new H.tx("tagSelector")
 C.H0=new A.ES(C.TW,C.BM,!1,C.Gh,!1,C.esx)
 C.He=new H.tx("hideTagsChecked")
@@ -20558,11 +20970,11 @@
 C.mr=new H.tx("expanded")
 C.HE=new A.ES(C.mr,C.BM,!1,C.HL,!1,C.esx)
 C.kw=new H.tx("trace")
-C.oC=new A.ES(C.kw,C.BM,!1,C.MR1,!1,C.ucP)
+C.oC=new A.ES(C.kw,C.BM,!1,C.MR,!1,C.ucP)
 C.qX=new H.tx("fragmentationChanged")
 C.dO=new A.ES(C.qX,C.hU,!1,C.yQP,!1,C.dn)
 C.UX=new H.tx("msg")
-C.Pt=new A.ES(C.UX,C.BM,!1,C.MR1,!1,C.ucP)
+C.Pt=new A.ES(C.UX,C.BM,!1,C.MR,!1,C.ucP)
 C.rP=new H.tx("mapChanged")
 C.Nt=new A.ES(C.rP,C.hU,!1,C.yQP,!1,C.dn)
 C.nf=new H.tx("function")
@@ -20593,20 +21005,17 @@
 C.t6=new H.tx("mapAsString")
 C.hr=new A.ES(C.t6,C.BM,!1,C.Gh,!1,C.esx)
 C.qs=new H.tx("io")
-C.MN=new A.ES(C.qs,C.BM,!1,C.MR1,!1,C.ucP)
+C.MN=new A.ES(C.qs,C.BM,!1,C.MR,!1,C.ucP)
 C.QH=new H.tx("fragmentation")
-C.C4=new A.ES(C.QH,C.BM,!1,C.MR1,!1,C.ucP)
-C.ft=new H.tx("target")
-C.I4j=H.IL('Z5')
-C.u3=new A.ES(C.ft,C.BM,!1,C.I4j,!1,C.ucP)
+C.C4=new A.ES(C.QH,C.BM,!1,C.MR,!1,C.ucP)
 C.VK=new H.tx("devtools")
 C.Od=new A.ES(C.VK,C.BM,!1,C.HL,!1,C.ucP)
 C.uu=new H.tx("internal")
 C.yY=new A.ES(C.uu,C.BM,!1,C.HL,!1,C.ucP)
 C.yL=new H.tx("connection")
-C.j5=new A.ES(C.yL,C.BM,!1,C.MR1,!1,C.ucP)
+C.j5=new A.ES(C.yL,C.BM,!1,C.MR,!1,C.ucP)
 C.Wj=new H.tx("process")
-C.Ah=new A.ES(C.Wj,C.BM,!1,C.MR1,!1,C.ucP)
+C.Ah=new A.ES(C.Wj,C.BM,!1,C.MR,!1,C.ucP)
 C.S4=new H.tx("busy")
 C.FB=new A.ES(C.S4,C.BM,!1,C.HL,!1,C.esx)
 C.eh=new H.tx("lineMode")
@@ -20629,7 +21038,7 @@
 C.ox=new H.tx("countersChanged")
 C.Rh=new A.ES(C.ox,C.hU,!1,C.yQP,!1,C.dn)
 C.XM=new H.tx("path")
-C.Tt=new A.ES(C.XM,C.BM,!1,C.MR1,!1,C.ucP)
+C.Tt=new A.ES(C.XM,C.BM,!1,C.MR,!1,C.ucP)
 C.bJ=new H.tx("counters")
 C.UI=new A.ES(C.bJ,C.BM,!1,C.UZ,!1,C.ucP)
 C.bE=new H.tx("sampleDepth")
@@ -20642,14 +21051,14 @@
 C.wG=H.IL('dynamic')
 C.LC=new A.ES(C.YT,C.BM,!1,C.wG,!1,C.ucP)
 C.yB=new H.tx("instances")
-C.vZ=new A.ES(C.yB,C.BM,!1,C.MR1,!1,C.esx)
+C.vZ=new A.ES(C.yB,C.BM,!1,C.MR,!1,C.esx)
 C.xS=new H.tx("tagSelectorChanged")
 C.bB=new A.ES(C.xS,C.hU,!1,C.yQP,!1,C.dn)
 C.jU=new H.tx("file")
-C.bw=new A.ES(C.jU,C.BM,!1,C.MR1,!1,C.ucP)
+C.bw=new A.ES(C.jU,C.BM,!1,C.MR,!1,C.ucP)
 C.RU=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.ucP)
 C.YE=new H.tx("webSocket")
-C.Wl=new A.ES(C.YE,C.BM,!1,C.MR1,!1,C.ucP)
+C.Wl=new A.ES(C.YE,C.BM,!1,C.MR,!1,C.ucP)
 C.Dj=new H.tx("refreshTime")
 C.Ay=new A.ES(C.Dj,C.BM,!1,C.Gh,!1,C.esx)
 C.Gr=new H.tx("endPos")
@@ -20667,7 +21076,7 @@
 C.Gn=new H.tx("objectChanged")
 C.az=new A.ES(C.Gn,C.hU,!1,C.yQP,!1,C.dn)
 C.vp=new H.tx("list")
-C.o0=new A.ES(C.vp,C.BM,!1,C.MR1,!1,C.ucP)
+C.o0=new A.ES(C.vp,C.BM,!1,C.MR,!1,C.ucP)
 C.i4=new H.tx("code")
 C.pM=H.IL('kx')
 C.aJ=new A.ES(C.i4,C.BM,!1,C.pM,!1,C.ucP)
@@ -20690,13 +21099,13 @@
 C.oE=new H.tx("chromiumAddress")
 C.r2=new A.ES(C.oE,C.BM,!1,C.Gh,!1,C.ucP)
 C.WQ=new H.tx("field")
-C.ah=new A.ES(C.WQ,C.BM,!1,C.MR1,!1,C.ucP)
+C.ah=new A.ES(C.WQ,C.BM,!1,C.MR,!1,C.ucP)
 C.r1=new H.tx("expandChanged")
 C.nP=new A.ES(C.r1,C.hU,!1,C.yQP,!1,C.dn)
 C.Mc=new H.tx("flagList")
-C.f0=new A.ES(C.Mc,C.BM,!1,C.MR1,!1,C.ucP)
+C.f0=new A.ES(C.Mc,C.BM,!1,C.MR,!1,C.ucP)
 C.fn=new H.tx("instance")
-C.fz=new A.ES(C.fn,C.BM,!1,C.MR1,!1,C.ucP)
+C.fz=new A.ES(C.fn,C.BM,!1,C.MR,!1,C.ucP)
 C.rE=new H.tx("frame")
 C.KS=new A.ES(C.rE,C.BM,!1,C.UZ,!1,C.ucP)
 C.cg=new H.tx("anchor")
@@ -20713,7 +21122,7 @@
 C.Ul=new A.ES(C.yh,C.BM,!1,C.oqo,!1,C.ucP)
 C.Qp=new A.ES(C.AV,C.BM,!1,C.wG,!1,C.ucP)
 C.vb=new H.tx("profile")
-C.Mq=new A.ES(C.vb,C.BM,!1,C.MR1,!1,C.ucP)
+C.Mq=new A.ES(C.vb,C.BM,!1,C.MR,!1,C.ucP)
 C.ny=new P.a6(0)
 C.U3=H.VM(new W.FkO("change"),[W.ea])
 C.T1=H.VM(new W.FkO("click"),[W.AjY])
@@ -20884,7 +21293,7 @@
 C.Cd=I.uL([C.pzc])
 C.Fn=I.uL(["==","!=","<=",">=","||","&&"])
 C.jY=I.uL(["as","in","this"])
-C.to=I.uL([0,0,32722,12287,65534,34815,65534,18431])
+C.MM=I.uL([0,0,32722,12287,65534,34815,65534,18431])
 C.QC=I.uL(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
 C.bg=I.uL([43,45,42,47,33,38,37,60,61,62,63,94,124])
 C.B2=I.uL([0,0,24576,1023,65534,34815,65534,18431])
@@ -20896,8 +21305,8 @@
 C.lY=new H.Px(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zao)
 C.Vgv=I.uL(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 C.yt=new H.Px(14,{domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.Vgv)
-C.rWc=I.uL(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
-C.pv=new H.Px(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.rWc)
+C.OA=I.uL(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
+C.pv=new H.Px(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.OA)
 C.kKi=I.uL(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
 C.w0=new H.Px(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.kKi)
 C.CM=new H.Px(0,{},C.dn)
@@ -20917,7 +21326,7 @@
 C.BE=new H.tx("averageCollectionPeriodInMillis")
 C.IH=new H.tx("address")
 C.j2=new H.tx("app")
-C.ke=new H.tx("architecture")
+C.US=new H.tx("architecture")
 C.ET=new H.tx("assertsEnabled")
 C.WC=new H.tx("bpt")
 C.hR=new H.tx("breakpoint")
@@ -21019,7 +21428,6 @@
 C.GI=new H.tx("lastUpdate")
 C.ur=new H.tx("lib")
 C.VN=new H.tx("libraries")
-C.VI=new H.tx("line")
 C.cc=new H.tx("listening")
 C.DY=new H.tx("loading")
 C.Lx=new H.tx("localAddress")
@@ -21045,6 +21453,7 @@
 C.Ic=new H.tx("pause")
 C.yG=new H.tx("pauseEvent")
 C.uI=new H.tx("pid")
+C.Jf=new H.tx("possibleBpt")
 C.AY=new H.tx("protocol")
 C.AO=new H.tx("qualifiedName")
 C.Xd=new H.tx("reachable")
@@ -21071,6 +21480,9 @@
 C.jM=new H.tx("socketOwner")
 C.HO=new H.tx("stacktrace")
 C.W5=new H.tx("standalone")
+C.ks=new H.tx("stepInto")
+C.Om=new H.tx("stepOut")
+C.iC=new H.tx("stepOver")
 C.k5=new H.tx("subClasses")
 C.Nv=new H.tx("subclass")
 C.Cw=new H.tx("superClass")
@@ -21082,6 +21494,7 @@
 C.Ef=new H.tx("tipTime")
 C.QL=new H.tx("toString")
 C.RH=new H.tx("toStringAsFixed")
+C.SP=new H.tx("toggleBreakpoint")
 C.Q1=new H.tx("toggleExpand")
 C.ID=new H.tx("toggleExpanded")
 C.z6=new H.tx("tokenPos")
@@ -21109,7 +21522,7 @@
 C.Mf=H.IL('G1')
 C.q0S=H.IL('Dg')
 C.Dl=H.IL('F1')
-C.Jf=H.IL('Mb')
+C.mK=H.IL('Mb')
 C.UJ=H.IL('oa')
 C.uh=H.IL('aI')
 C.Y3=H.IL('CY')
@@ -21151,7 +21564,6 @@
 C.Yy=H.IL('uE')
 C.Yxm=H.IL('Pg')
 C.il=H.IL('xI')
-C.G0=H.IL('mJ')
 C.lp=H.IL('LU')
 C.oG=H.IL('ds')
 C.EG=H.IL('Oz')
@@ -21171,10 +21583,12 @@
 C.Zj=H.IL('U1')
 C.FG=H.IL('qh')
 C.bC=H.IL('D2')
+C.Nw=H.IL('vr')
 C.a8=H.IL('Zx')
 C.YZ=H.IL('zt')
 C.NR=H.IL('nm')
 C.DD=H.IL('Zn')
+C.Dv=H.IL('Un')
 C.qF=H.IL('mO')
 C.JA3=H.IL('b0B')
 C.Ey=H.IL('wM')
@@ -21215,11 +21629,11 @@
 C.Rt=new P.fM(C.NU,P.wLZ())
 C.Sq=new P.fM(C.NU,P.vRP())
 C.mc=new P.fM(C.NU,P.H2())
-C.uo=new P.fM(C.NU,P.hI())
+C.uo=new P.fM(C.NU,P.uy1())
 C.pj=new P.fM(C.NU,P.W7())
 C.F2=new P.fM(C.NU,P.lw())
 C.Gu=new P.fM(C.NU,P.xd())
-C.Yl=new P.fM(C.NU,P.MM())
+C.Yl=new P.fM(C.NU,P.J6())
 C.Zc=new P.fM(C.NU,P.G2())
 C.Kk=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null)
 $.libraries_to_load = {}
@@ -21231,7 +21645,7 @@
 $.lEO=null
 $.OK=0
 $.bf=null
-$.U9=null
+$.P4=null
 $.lcs=!1
 $.NF=null
 $.TX=null
@@ -21266,7 +21680,7 @@
 $.vU=null
 $.xV=null
 $.rK=!1
-$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.ZFP},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.fv},C.Jf,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Sm},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.TQ},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.fm},C.PT,M.CX,{created:M.SP},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.vn},C.PF,W.yyN,{},C.Th,U.fI,{created:U.UF},C.tU,E.L4,{created:E.p4t},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.vu,X.uw,{created:X.lt2},C.ca,D.Z4,{created:D.Oll},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.AW},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.Jv},C.lp,R.LU,{created:R.V4},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.lL},C.ou,Z.ak,{created:Z.lW},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.hm},C.FG,E.qh,{created:E.va},C.bC,V.D2,{created:V.NI},C.a8,A.Zx,{created:A.Ow},C.NR,K.nm,{created:K.an},C.DD,E.Zn,{created:E.kf},C.qF,E.mO,{created:E.Ch},C.JA3,H.b0B,{"":H.m6},C.Ey,A.wM,{created:A.GO},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.W1},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.tX},C.Jm,Y.q6,{created:Y.Ifw},C.Wz,B.pR,{created:B.lu},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.yU},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.cYO},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.oS},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
+$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.ZFP},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.Lu},C.mK,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Sm},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.TQ},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.fm},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.teo},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.vn},C.PF,W.yyN,{},C.Th,U.fI,{created:U.UF},C.tU,E.L4,{created:E.p4t},C.cK,X.I5,{created:X.yC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.vu,X.uw,{created:X.lt2},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.AW},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.Jv},C.lp,R.LU,{created:R.rA},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.lL},C.ou,Z.ak,{created:Z.zB},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.hm},C.FG,E.qh,{created:E.va},C.bC,V.D2,{created:V.NI},C.Nw,T.vr,{created:T.xA},C.a8,A.Zx,{created:A.yno},C.NR,K.nm,{created:K.an},C.DD,E.Zn,{created:E.kf},C.qF,E.mO,{created:E.Ch},C.JA3,H.b0B,{"":H.m6},C.Ey,A.wM,{created:A.GO},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.W1},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.tX},C.Jm,Y.q6,{created:Y.zE},C.Wz,B.pR,{created:B.lu},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rpj},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.yU},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.cYO},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
 I.$lazy($,"thisScript","SU","Zt",function(){return H.yl()})
 I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.qo(null),[P.KN])})
 I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
@@ -21284,9 +21698,9 @@
 I.$lazy($,"_completer","IQ","Ib",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
 I.$lazy($,"_storage","wZ","Vy",function(){return window.localStorage})
 I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.xg()})
-I.$lazy($,"_rootMap","ln","wb",function(){return P.YM(null,null,null,null,null)})
+I.$lazy($,"_rootMap","ln","OL",function(){return P.YM(null,null,null,null,null)})
 I.$lazy($,"_toStringVisiting","nM","Ex",function(){return[]})
-I.$lazy($,"webkitEvents","fDX","nn",function(){return P.EF(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],null,null)})
+I.$lazy($,"webkitEvents","Ha","Cs",function(){return P.EF(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],null,null)})
 I.$lazy($,"context","Lt","Si",function(){return P.ND(self)})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","kt","Iq",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
@@ -21297,13 +21711,13 @@
 I.$lazy($,"_logger","y7","S5",function(){return N.QM("Observable.dirtyCheck")})
 I.$lazy($,"_instance","qa","Js",function(){return new L.TV([])})
 I.$lazy($,"_pathRegExp","Ub","B8",function(){return new L.DOe().$0()})
-I.$lazy($,"_logger","y7Y","Nd",function(){return N.QM("observe.PathObserver")})
-I.$lazy($,"_pathCache","un","hW",function(){return P.L5(null,null,null,P.qU,L.Tv)})
+I.$lazy($,"_logger","y7Y","YLt",function(){return N.QM("observe.PathObserver")})
+I.$lazy($,"_pathCache","un","hW",function(){return P.L5(null,null,null,P.qU,L.Zl)})
 I.$lazy($,"_polymerSyntax","Kb","Ak",function(){return new A.Li(T.GF(null,C.qY),null)})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
 I.$lazy($,"_declarations","ef","vE",function(){return P.L5(null,null,null,P.qU,A.XP)})
 I.$lazy($,"_hasShadowDomPolyfill","Yx","Ep",function(){return $.Si().Eg("ShadowDOMPolyfill")})
-I.$lazy($,"_ShadowCss","qP","AM",function(){var z=$.Kc()
+I.$lazy($,"_ShadowCss","qP","lx",function(){var z=$.Kc()
 return z!=null?J.UQ(z,"ShadowCSS"):null})
 I.$lazy($,"_sheetLog","dz","QJ",function(){return N.QM("polymer.stylesheet")})
 I.$lazy($,"_changedMethodQueryOptions","SC","Sz",function(){return new A.Wq(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
@@ -21314,35 +21728,35 @@
 I.$lazy($,"_observeLog","DZ","mj",function(){return N.QM("polymer.observe")})
 I.$lazy($,"_eventsLog","fo","ay",function(){return N.QM("polymer.events")})
 I.$lazy($,"_unbindLog","eu","iX",function(){return N.QM("polymer.unbind")})
-I.$lazy($,"_bindLog","f2","zB",function(){return N.QM("polymer.bind")})
+I.$lazy($,"_bindLog","xz","fv",function(){return N.QM("polymer.bind")})
 I.$lazy($,"_PolymerGestures","XK","Po",function(){return J.UQ($.Si(),"PolymerGestures")})
 I.$lazy($,"_polymerElementProto","LW","XX",function(){return new A.Md().$0()})
 I.$lazy($,"_typeHandlers","lq","Rf",function(){return P.EF([C.Gh,new Z.lP(),C.GX,new Z.Ra(),C.Yc,new Z.wJY(),C.HL,new Z.zOQ(),C.yw,new Z.W6o(),C.pa,new Z.MdQ()],null,null)})
-I.$lazy($,"_BINARY_OPERATORS","HfW","YP",function(){return P.EF(["+",new K.w12(),"-",new K.w13(),"*",new K.w14(),"/",new K.w15(),"%",new K.w16(),"==",new K.w17(),"!=",new K.w18(),"===",new K.w19(),"!==",new K.w20(),">",new K.w21(),">=",new K.w22(),"<",new K.w23(),"<=",new K.w24(),"||",new K.w25(),"&&",new K.w26(),"|",new K.w27()],null,null)})
+I.$lazy($,"_BINARY_OPERATORS","HfW","Xa",function(){return P.EF(["+",new K.w12(),"-",new K.w13(),"*",new K.w14(),"/",new K.w15(),"%",new K.w16(),"==",new K.w17(),"!=",new K.w18(),"===",new K.w19(),"!==",new K.w20(),">",new K.w21(),">=",new K.w22(),"<",new K.w23(),"<=",new K.w24(),"||",new K.w25(),"&&",new K.w26(),"|",new K.w27()],null,null)})
 I.$lazy($,"_UNARY_OPERATORS","oQ","EU",function(){return P.EF(["+",new K.w5(),"-",new K.w10(),"!",new K.w11()],null,null)})
-I.$lazy($,"_instance","b3","At",function(){return new K.me()})
+I.$lazy($,"_instance","jCU","bq",function(){return new K.me()})
 I.$lazy($,"_currentIsolateMatcher","vf","fA",function(){return new H.VR("isolates/\\d+",H.v4("isolates/\\d+",!1,!0,!1),null,null)})
 I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"kRegularFunction","Ij","is",function(){return new D.Hk("function")})
-I.$lazy($,"kClosureFunction","jX","xq",function(){return new D.Hk("closure function")})
-I.$lazy($,"kGetterFunction","F0","GG",function(){return new D.Hk("getter function")})
-I.$lazy($,"kSetterFunction","Bs","Kw",function(){return new D.Hk("setter function")})
-I.$lazy($,"kConstructor","G8","kj",function(){return new D.Hk("constructor")})
-I.$lazy($,"kImplicitGetterFunction","xs","d9",function(){return new D.Hk("implicit getter function")})
-I.$lazy($,"kImplicitSetterFunction","ab","nE",function(){return new D.Hk("implicit setter function")})
-I.$lazy($,"kStaticInitializer","Sp","y5",function(){return new D.Hk("static initializer")})
-I.$lazy($,"kMethodExtractor","Et","Ot",function(){return new D.Hk("method extractor")})
-I.$lazy($,"kNoSuchMethodDispatcher","Ll","E7",function(){return new D.Hk("noSuchMethod dispatcher")})
-I.$lazy($,"kInvokeFieldDispatcher","HU","f6",function(){return new D.Hk("invoke field dispatcher")})
-I.$lazy($,"kCollected","bt","b1",function(){return new D.Hk("Collected")})
-I.$lazy($,"kNative","wp","l3",function(){return new D.Hk("Native")})
-I.$lazy($,"kTag","z3","zx",function(){return new D.Hk("Tag")})
-I.$lazy($,"kReused","Yb","MQ",function(){return new D.Hk("Reused")})
-I.$lazy($,"kUNKNOWN","ve","lC",function(){return new D.Hk("UNKNOWN")})
+I.$lazy($,"kRegularFunction","Ij","is",function(){return new D.ma("function")})
+I.$lazy($,"kClosureFunction","jX","xq",function(){return new D.ma("closure function")})
+I.$lazy($,"kGetterFunction","F0","GG",function(){return new D.ma("getter function")})
+I.$lazy($,"kSetterFunction","Bs","Kw",function(){return new D.ma("setter function")})
+I.$lazy($,"kConstructor","G8","kj",function(){return new D.ma("constructor")})
+I.$lazy($,"kImplicitGetterFunction","xs","d9",function(){return new D.ma("implicit getter function")})
+I.$lazy($,"kImplicitSetterFunction","ab","nE",function(){return new D.ma("implicit setter function")})
+I.$lazy($,"kStaticInitializer","Sp","y5",function(){return new D.ma("static initializer")})
+I.$lazy($,"kMethodExtractor","Et","Ot",function(){return new D.ma("method extractor")})
+I.$lazy($,"kNoSuchMethodDispatcher","Ll","E7",function(){return new D.ma("noSuchMethod dispatcher")})
+I.$lazy($,"kInvokeFieldDispatcher","HU","f6",function(){return new D.ma("invoke field dispatcher")})
+I.$lazy($,"kCollected","bt","b1",function(){return new D.ma("Collected")})
+I.$lazy($,"kNative","wp","l3",function(){return new D.ma("Native")})
+I.$lazy($,"kTag","z3","zx",function(){return new D.ma("Tag")})
+I.$lazy($,"kReused","Yb","MQ",function(){return new D.ma("Reused")})
+I.$lazy($,"kUNKNOWN","ve","lC",function(){return new D.ma("UNKNOWN")})
 I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
 I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
 I.$lazy($,"symbolConverter","qe","Mg",function(){return D.kP()})
-I.$lazy($,"_DEFAULT","ac","HT",function(){return new M.VE(null)})
+I.$lazy($,"_DEFAULT","ac","Bu",function(){return new M.VE(null)})
 I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.Raa().$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.qo(null),[null])})
 I.$lazy($,"_ownerStagingDocument","v2","we",function(){return H.VM(new P.qo(null),[null])})
@@ -21353,8 +21767,8 @@
 I.$lazy($,"_isStagingDocument","Fg","Ks",function(){return H.VM(new P.qo(null),[null])})
 I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.qo("template_binding"),[null])})
 
-init.functionAliases={Sa:226}
-init.metadata=["object","sender","e",{func:"pd",args:[P.qU]},{func:"bg",ret:P.FK},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"a0",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"pA",void:true,args:[P.dl,P.e4y,P.dl,null,P.BpP]},"self","parent","zone",{func:"QN",args:[P.dl,P.e4y,P.dl,{func:"NT"}]},"f",{func:"aE",args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"Ls",args:[null,null]},null,null]},{func:"rl",ret:{func:"NT"},args:[P.dl,P.e4y,P.dl,{func:"NT"}]},{func:"XRR",ret:{func:"l4",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]}]},{func:"Gt",ret:{func:"Ls",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"Ls",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"NT"}]},{func:"zo",ret:P.Xa,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"vl",ret:P.Xa,args:[P.dl,P.e4y,P.dl,P.a6,{func:"JX",void:true,args:[P.Xa]}]},{func:"Xg",void:true,args:[P.dl,P.e4y,P.dl,P.qU]},"line",{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.n7,P.Z0]},"specification","zoneValues",{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},{func:"xh",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.IN]},"symbol","v","x",{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Hc",ret:P.KN,args:[D.af,D.af]},{func:"Br",ret:P.qU},"invocation","fractionDigits",{func:"NT"},{func:"rz",args:[P.EH]},"code","key","val",{func:"Ls",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.a2,args:[null]},"oldEvent",{func:"f4",void:true,args:[W.f5]},"obj","i","responseText",{func:"uC",args:[U.Z5,U.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"PK",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"KDY",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"lQ",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.BpP]},"theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"jt",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"lk",ret:P.KN,args:[null,null]},"byteString","xhr",{func:"QO",void:true,args:[W.AjY]},"result",{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"event","response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Oj",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"kd",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"uW2",ret:P.QV,args:[P.qU]}]},"s",{func:"W7",void:true,args:[P.a2,null]},"expand","m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"XO",args:[N.HV]},{func:"d4C",void:true,args:[W.AjY,null,W.h4]},{func:"Ij",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"h6",ret:P.a2,args:[P.qU]},"type",{func:"Aa",args:[P.e4y,P.dl]},{func:"h2",args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]}]},{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Tv,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"rd",void:true,args:[P.qU,P.qU]},{func:"Da",void:true,args:[P.WO,P.Z0,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},{func:"QY",void:true,args:[[P.QV,A.OC]]},"changes","jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.a2]},{func:"Hb",args:[null],named:{skipChanges:P.a2}},!1,"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.Ip,U.Ip]},{func:"Aq",args:[U.Ip]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"JC",args:[V.qC]},{func:"rt",ret:P.b8},"scriptCoverage","owningIsolate",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"lB",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer",{func:"H6",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"JQ",void:true,args:[W.BI]},"Event",{func:"WEz",void:true,args:[W.Hy]},{func:"T2",void:true,args:[P.qU,U.U2]},{func:"js",args:[P.qU,U.U2]},"msg","details","ref",{func:"K7",void:true,args:[[P.WO,G.DA]]},"splices",{func:"k2G",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values","targets",{func:"w9",ret:P.b8,args:[P.qU]},];$=null
+init.functionAliases={Sa:230}
+init.metadata=["object","sender","e",{func:"pd",args:[P.qU]},{func:"bg",ret:P.FK},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"a0",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"pA",void:true,args:[P.dl,P.AN,P.dl,null,P.BpP]},"self","parent","zone",{func:"QN",args:[P.dl,P.AN,P.dl,{func:"NT"}]},"f",{func:"aE",args:[P.dl,P.AN,P.dl,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.AN,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"rl",ret:{func:"NT"},args:[P.dl,P.AN,P.dl,{func:"NT"}]},{func:"XRR",ret:{func:"l4",args:[null]},args:[P.dl,P.AN,P.dl,{func:"l4",args:[null]}]},{func:"Gt",ret:{func:"bh",args:[null,null]},args:[P.dl,P.AN,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.AN,P.dl,{func:"NT"}]},{func:"zo",ret:P.kWp,args:[P.dl,P.AN,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"vl",ret:P.kWp,args:[P.dl,P.AN,P.dl,P.a6,{func:"pe",void:true,args:[P.kWp]}]},{func:"Xg",void:true,args:[P.dl,P.AN,P.dl,P.qU]},"line",{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.AN,P.dl,P.n7,P.Z0]},"specification","zoneValues",{func:"Glb",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},{func:"xh",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"b3",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.IN]},"symbol","v","x",{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Tx",ret:P.KN,args:[D.af,D.af]},{func:"Br",ret:P.qU},"invocation","fractionDigits",{func:"NT"},{func:"rz",args:[P.EH]},"code","key","val",{func:"bh",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c",{func:"Ab",void:true,args:[D.Mk]},"event",{func:"If",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.a2,args:[null]},"oldEvent",{func:"f4",void:true,args:[W.f5]},"obj","i","responseText",{func:"mI",args:[L.Z5,L.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"PK",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"KDY",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"lQ",args:[D.kx]},{func:"pG",args:[{func:"kl",void:true}]},"data",{func:"uu",void:true,args:[P.a],opt:[P.BpP]},"theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"xA",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"lk",ret:P.KN,args:[null,null]},"byteString",{func:"lu",void:true,args:[P.qU],opt:[null]},"xhr",{func:"uG",void:true,args:[W.AjY]},"result",{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Oj",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"kd",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"uW",ret:P.QV,args:[P.qU]}]},"s",{func:"W7",void:true,args:[P.a2,null]},"expand","m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"Fe",void:true,args:[W.AjY,null,W.h4]},{func:"Ij",ret:P.qU,args:[P.qU]},"url",{func:"le",ret:P.qU,args:[P.CP]},"time",{func:"BN",ret:P.a2,args:[P.qU]},"type",{func:"B4",args:[P.AN,P.dl]},{func:"h2",args:[P.dl,P.AN,P.dl,{func:"l4",args:[null]}]},{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Zl,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"Rb",void:true,args:[P.qU,P.qU]},{func:"Da",void:true,args:[P.WO,P.Z0,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},{func:"QY",void:true,args:[[P.QV,A.OC]]},"changes","jsElem","extendee",{func:"PF",args:[null,P.qU,P.qU]},{func:"EW",args:[null,W.KV,P.a2]},{func:"Hb",args:[null],named:{skipChanges:P.a2}},!1,"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"ppm",ret:U.zX,args:[U.Ip,U.Ip]},{func:"Aq",args:[U.Ip]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"JC",args:[V.qC]},{func:"rt",ret:P.b8},"scriptCoverage","owningIsolate",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"lB",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer","newBpts",{func:"H6",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"T2",void:true,args:[P.qU,L.U2]},{func:"js",args:[P.qU,L.U2]},"CloseEvent","Event",{func:"cOy",args:[W.Hy]},"msg","details","ref",{func:"K7",void:true,args:[[P.WO,G.DA]]},"splices",{func:"H3",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values","targets",{func:"WrM",ret:P.b8,args:[P.qU]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
@@ -21385,22 +21799,6 @@
 X = convertToFastObject(X)
 Y = convertToFastObject(Y)
 Z = convertToFastObject(Z)
-!function(){function intern(a){var u={}
-u[a]=1
-return Object.keys(convertToFastObject(u))[0]}init.getIsolateTag=function(a){return intern("___dart_"+a+init.isolateTag)}
-var z="___dart_isolate_tags_"
-var y=Object[z]||(Object[z]=Object.create(null))
-var x="_ZxYxX"
-for(var w=0;;w++){var v=intern(x+"_"+w+"_")
-if(!(v in y)){y[v]=1
-init.isolateTag=v
-break}}}()
-init.dispatchPropertyName=init.getIsolateTag("dispatch_record")
-;(function(a){if(typeof document==="undefined"){a(null)
-return}if(document.currentScript){a(document.currentScript)
-return}var z=document.scripts
-function onLoad(b){for(var x=0;x<z.length;++x){z[x].removeEventListener("load",onLoad,false)}a(b.target)}for(var y=0;y<z.length;++y){z[y].addEventListener("load",onLoad,false)}})(function(a){init.currentScript=a
-if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.Ke(E.jk(),b)},[])}else{(function(b){H.Ke(E.jk(),b)})([])}})
 function init(){I.p={}
 function generateAccessor(a,b,c){var y=a.split("-")
 var x=y[0]
@@ -21516,4 +21914,20 @@
 Isolate.$finishClasses=a.$finishClasses
 Isolate.uL=a.uL
 return Isolate}}
+!function(){function intern(a){var u={}
+u[a]=1
+return Object.keys(convertToFastObject(u))[0]}init.getIsolateTag=function(a){return intern("___dart_"+a+init.isolateTag)}
+var z="___dart_isolate_tags_"
+var y=Object[z]||(Object[z]=Object.create(null))
+var x="_ZxYxX"
+for(var w=0;;w++){var v=intern(x+"_"+w+"_")
+if(!(v in y)){y[v]=1
+init.isolateTag=v
+break}}}()
+init.dispatchPropertyName=init.getIsolateTag("dispatch_record")
+;(function(a){if(typeof document==="undefined"){a(null)
+return}if(document.currentScript){a(document.currentScript)
+return}var z=document.scripts
+function onLoad(b){for(var x=0;x<z.length;++x){z[x].removeEventListener("load",onLoad,false)}a(b.target)}for(var y=0;y<z.length;++y){z[y].addEventListener("load",onLoad,false)}})(function(a){init.currentScript=a
+if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.Ke(E.jk(),b)},[])}else{(function(b){H.Ke(E.jk(),b)})([])}})
 })()
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html
index ba58478..b02e7d6 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html
@@ -7,10 +7,15 @@
       .idle {
         color: #0489c3;
         cursor: pointer;
+        text-decoration: none;
+      }
+      .idle:hover {
+        text-decoration: underline;
       }
       .busy {
         color: #aaa;
         cursor: wait;
+        text-decoration: none;
       }
     </style>
 
@@ -18,7 +23,12 @@
       <span class="busy">[{{ label }}]</span>
     </template>
     <template if="{{ !busy }}">
-      <span class="idle"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
+      <template if="{{ color == null }}">
+        <span class="idle"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
+      </template>
+      <template if="{{ color != null }}">
+        <span class="idle" style="color:{{ color }}"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
+      </template>
     </template>
   </template>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
index f7a7c94..cd907e0 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
@@ -15,10 +15,10 @@
       <div class="flex-item-10-percent">
         <isolate-ref ref="{{ isolate }}"></isolate-ref>
       </div>
-      <div class="flex-item-20-percent">
+      <div class="flex-item-30-percent">
         <isolate-run-state isolate="{{ isolate }}"></isolate-run-state>
       </div>
-      <div class="flex-item-50-percent">
+      <div class="flex-item-40-percent">
         <isolate-location isolate="{{ isolate }}"></isolate-location>
       </div>
       <div class="flex-item-10-percent">
@@ -43,6 +43,10 @@
     <template if="{{ isolate.pauseEvent != null }}">
       <strong>paused</strong>
       <action-link callback="{{ resume }}" label="resume"></action-link>
+
+      <action-link callback="{{ stepInto }}" label="step"></action-link>
+      <action-link callback="{{ stepOver }}" label="step&nbsp;over"></action-link>
+      <action-link callback="{{ stepOut }}" label="step&nbsp;out"></action-link>
     </template>
 
     <template if="{{ isolate.running }}">
@@ -67,30 +71,26 @@
       <template if="{{ isolate.pauseEvent.eventType == 'IsolateCreated' }}">
         at isolate start
       </template>
+
       <template if="{{ isolate.pauseEvent.eventType == 'IsolateShutdown' }}">
         at isolate exit
       </template>
-      <template if="{{ isolate.pauseEvent.eventType == 'IsolateInterrupted' }}">
+
+      <template if="{{ isolate.pauseEvent.eventType == 'IsolateInterrupted' ||
+                       isolate.pauseEvent.eventType == 'BreakpointReached' ||
+                       isolate.pauseEvent.eventType == 'ExceptionThrown' }}">
+        <template if="{{ isolate.pauseEvent.breakpoint != null }}">
+          by breakpoint
+        </template>
+        <template if="{{ isolate.pauseEvent.eventType == 'ExceptionThrown' }}">
+          by exception
+        </template>
         at
         <function-ref ref="{{ isolate.topFrame['function'] }}">
         </function-ref>
         (<script-ref ref="{{ isolate.topFrame['script'] }}"
                      pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
       </template>
-      <template if="{{ isolate.pauseEvent.eventType == 'BreakpointReached' }}">
-        at breakpoint {{ isolate.pauseEvent.breakpoint['id'] }}
-        <function-ref ref="{{ isolate.topFrame['function'] }}">
-        </function-ref>
-        (<script-ref ref="{{ isolate.topFrame['script'] }}"
-                     pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
-      </template>
-      <template if="{{ isolate.pauseEvent.eventType == 'ExceptionThrown' }}">
-        at exception
-        <function-ref ref="{{ isolate.topFrame['function'] }}">
-        </function-ref>
-        (<script-ref ref="{{ isolate.topFrame['script'] }}"
-                     pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
-      </template>
     </template>
 
     <template if="{{ isolate.running }}">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
index dc9ec30..eab48d8 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
@@ -40,10 +40,10 @@
     <div class="flex-row">
       <div class="flex-item-10-percent">
       </div>
-      <div class="flex-item-20-percent">
+      <div class="flex-item-30-percent">
         <isolate-run-state isolate="{{ isolate }}"></isolate-run-state>
       </div>
-      <div class="flex-item-60-percent">
+      <div class="flex-item-50-percent">
         <isolate-location isolate="{{ isolate }}"></isolate-location>
       </div>
       <div class="flex-item-10-percent">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
index b1411d9..a690cf2 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
@@ -1,4 +1,5 @@
 <link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="action_link.html">
 <link rel="import" href="observatory_element.html">
 
 <polymer-element name="nav-bar" extends="observatory-element">
@@ -315,27 +316,30 @@
         background: rgba(255,255,255,0.5);
       }
     </style>
-    <template if="{{ event.eventType == 'IsolateInterrupted' }}">
+    <template if="{{ event.eventType == 'IsolateInterrupted' ||
+                     event.eventType == 'BreakpointReached' ||
+                     event.eventType == 'ExceptionThrown' }}">
       <div class="item">
         Isolate
-        <a class="link" on-click="{{ goto }}" href="{{ event.isolate.link }}">{{ event.isolate.name }}</a>
+        <a class="link" on-click="{{ goto }}"
+           href="{{ event.isolate.link }}">{{ event.isolate.name }}</a>
         is paused
-        <a class="boxclose" on-click="{{ closeItem }}">&times;</a>
-      </div>
-    </template>
-    <template if="{{ event.eventType == 'BreakpointReached' }}">
-      <div class="item">
-        Isolate
-        <a class="link" on-click="{{ goto }}" href="{{ event.isolate.link }}">{{ event.isolate.name }}</a>
-        is paused at breakpoint {{ event.breakpoint['id'] }}
-        <a class="boxclose" on-click="{{ closeItem }}">&times;</a>
-      </div>
-    </template>
-    <template if="{{ event.eventType == 'ExceptionThrown' }}">
-      <div class="item">
-        Isolate
-        <a class="link" on-click="{{ goto }}" href="{{ event.isolate.link }}">{{ event.isolate.name }}</a>
-        is paused at exception
+        <template if="{{ event.breakpoint != null }}">
+          at breakpoint
+        </template>
+        <template if="{{ event.eventType == 'ExceptionThrown' }}">
+          at exception
+        </template>
+
+        <br><br>
+        <action-link callback="{{ resume }}" label="resume" color="white">
+        </action-link>
+        <action-link callback="{{ stepInto }}" label="step" color="white">
+        </action-link>
+        <action-link callback="{{ stepOver }}" label="step&nbsp;over"
+                     color="white"></action-link>
+        <action-link callback="{{ stepOut }}" label="step&nbsp;out"
+                     color="white"></action-link>
         <a class="boxclose" on-click="{{ closeItem }}">&times;</a>
       </div>
     </template>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html
index 52460df..24c4bfe 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html
@@ -46,24 +46,39 @@
       <content></content>
       <div class="sourceBox" style="height:{{height}}">
         <div class="sourceTable">
-          <template repeat="{{ line in lines }}">
-            <div class="sourceRow" id="{{ makeLineId(line.line) }}">
-              <template if="{{ line.hits == null }}">
-                <div class="hitsNone">{{ line.line }}</div>
-              </template>
-              <template if="{{ line.hits == 0 }}">
-                <div class="hitsNotExecuted">{{ line.line }}</div>
-              </template>
-              <template if="{{ line.hits > 0 }}">
-                <div class="hitsExecuted">{{ line.line }}</div>
-              </template>
-              <div class="sourceItem">&nbsp;</div>
-              <template if="{{ line.line == currentLine }}">
-                <div id="currentLine" class="sourceItemCurrent">{{line.text}}</div>
-              </template>
-              <template if="{{ line.line != currentLine }}">
-                <div class="sourceItem">{{line.text}}</div>
-              </template>
+          <template if="{{ linesReady }}">
+            <template repeat="{{ line in lines }}">
+              <div class="sourceRow" id="{{ makeLineId(line.line) }}">
+                <breakpoint-toggle line="{{ line }}"></breakpoint-toggle>
+
+                <div class="sourceItem">&nbsp;</div>
+
+                <template if="{{ line.hits == null ||
+                              line.hits < 0 }}">
+                  <div class="hitsNone">{{ line.line }}</div>
+                </template>
+                <template if="{{ line.hits == 0 }}">
+                  <div class="hitsNotExecuted">{{ line.line }}</div>
+                </template>
+                <template if="{{ line.hits > 0 }}">
+                  <div class="hitsExecuted">{{ line.line }}</div>
+                </template>
+
+                <div class="sourceItem">&nbsp;</div>
+
+                <template if="{{ line.line == currentLine }}">
+                  <div class="sourceItemCurrent">{{line.text}}</div>
+                </template>
+                <template if="{{ line.line != currentLine }}">
+                  <div class="sourceItem">{{line.text}}</div>
+                </template>
+              </div>
+            </template>
+          </template>
+
+          <template if="{{ !linesReady }}">
+            <div class="sourceRow">
+              <div class="sourceItem">loading...</div>
             </div>
           </template>
         </div>
@@ -72,4 +87,66 @@
   </template>
 </polymer-element>
 
+<polymer-element name="breakpoint-toggle" extends="observatory-element">
+  <template>
+    <style>
+      .emptyBreakpoint, .possibleBreakpoint, .busyBreakpoint, .unresolvedBreakpoint, .resolvedBreakpoint  {
+        display: table-cell;
+        vertical-align: top;
+        font: 400 14px consolas, courier, monospace;
+        min-width: 1em;
+        text-align: center;
+        cursor: pointer;
+      }
+      .possibleBreakpoint {
+        color: #e0e0e0;
+      }
+      .possibleBreakpoint:hover {
+        color: white;
+        background-color: #777;
+      }
+      .busyBreakpoint {
+        color: white;
+        background-color: black;
+        cursor: wait;
+      }
+      .unresolvedBreakpoint {
+        color: white;
+        background-color: #cac;
+      }
+      .resolvedBreakpoint {
+        color: white;
+        background-color: #e66;
+      }
+    </style>
+
+    <template if="{{ line.possibleBpt && busy}}">
+      <div class="busyBreakpoint">B</div>
+    </template>
+
+    <template if="{{ line.bpt == null && !line.possibleBpt }}">
+      <div class="emptyBreakpoint">&nbsp;</div>
+    </template>
+
+    <template if="{{ line.bpt == null && line.possibleBpt && !busy}}">
+      <div class="possibleBreakpoint">
+        <a on-click="{{ toggleBreakpoint }}">B</a>
+      </div>
+    </template>
+
+    <template if="{{ line.bpt != null && !line.bpt['resolved'] && !busy}}">
+      <div class="unresolvedBreakpoint">
+        <a on-click="{{ toggleBreakpoint }}">B</a>
+      </div>
+    </template>
+
+    <template if="{{ line.bpt != null && line.bpt['resolved'] && !busy}}">
+      <div class="resolvedBreakpoint">
+        <a on-click="{{ toggleBreakpoint }}">B</a>
+      </div>
+    </template>
+
+  </template>
+</polymer-element>
+
 <script type="application/dart" src="script_inset.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/service_common.dart b/runtime/bin/vmservice/client/lib/service_common.dart
new file mode 100644
index 0000000..d38366ee
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/service_common.dart
@@ -0,0 +1,266 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library service_common;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:logging/logging.dart';
+import 'package:observatory/service.dart';
+
+// Export the service library.
+export 'package:observatory/service.dart';
+
+/// Description of a VM target.
+class WebSocketVMTarget {
+  // Last time this VM has been connected to.
+  int lastConnectionTime = 0;
+  bool get hasEverConnected => lastConnectionTime > 0;
+
+  // Chrome VM or standalone;
+  bool chrome = false;
+  bool get standalone => !chrome;
+
+  // User defined name.
+  String name;
+  // Network address of VM.
+  String networkAddress;
+
+  WebSocketVMTarget(this.networkAddress) {
+    name = networkAddress;
+  }
+
+  WebSocketVMTarget.fromMap(Map json) {
+    lastConnectionTime = json['lastConnectionTime'];
+    chrome = json['chrome'];
+    name = json['name'];
+    networkAddress = json['networkAddress'];
+    if (name == null) {
+      name = networkAddress;
+    }
+  }
+
+  Map toJson() {
+    return {
+      'lastConnectionTime': lastConnectionTime,
+      'chrome': chrome,
+      'name': name,
+      'networkAddress': networkAddress,
+    };
+  }
+}
+
+class _WebSocketRequest {
+  final String id;
+  final Completer<String> completer;
+  _WebSocketRequest(this.id)
+      : completer = new Completer<String>();
+}
+
+/// Minimal common interface for 'WebSocket' in [dart:io] and [dart:html].
+abstract class CommonWebSocket {
+  void connect(String address,
+               void onOpen(),
+               void onMessage(dynamic data),
+               void onError(),
+               void onClose());
+  bool get isOpen;
+  void send(dynamic data);
+  void close();
+}
+
+/// A [CommonWebSocketVM] communicates with a Dart VM over a CommonWebSocket.
+/// The Dart VM can be embedded in Chromium or standalone. In the case of
+/// Chromium, we make the service requests via the Chrome Remote Debugging
+/// Protocol.
+abstract class CommonWebSocketVM extends VM {
+  final Completer _connected = new Completer();
+  final Completer _disconnected = new Completer();
+  final WebSocketVMTarget target;
+  final Map<String, _WebSocketRequest> _delayedRequests =
+        new Map<String, _WebSocketRequest>();
+  final Map<String, _WebSocketRequest> _pendingRequests =
+      new Map<String, _WebSocketRequest>();
+  int _requestSerial = 0;
+  bool _hasInitiatedConnect = false;
+
+  CommonWebSocket _webSocket;
+
+  CommonWebSocketVM(this.target, this._webSocket) {
+    assert(target != null);
+  }
+
+  void _notifyConnect() {
+    if (!_connected.isCompleted) {
+      Logger.root.info('WebSocketVM connection opened: ${target.networkAddress}');
+      _connected.complete(this);
+    }
+  }
+  Future get onConnect => _connected.future;
+  void _notifyDisconnect() {
+    if (!_disconnected.isCompleted) {
+      Logger.root.info('WebSocketVM connection error: ${target.networkAddress}');
+      _disconnected.complete(this);
+    }
+  }
+  Future get onDisconnect => _disconnected.future;
+
+  void disconnect() {
+    if (_hasInitiatedConnect) {
+      _webSocket.close();
+    }
+    _cancelAllRequests();
+    _notifyDisconnect();
+  }
+
+  Future<String> getString(String id) {
+    if (!_hasInitiatedConnect) {
+      _hasInitiatedConnect = true;
+      _webSocket.connect(
+          target.networkAddress, _onOpen, _onMessage, _onError, _onClose);
+    }
+    return _makeRequest(id);
+  }
+
+  /// Add a request for [id] to pending requests.
+  Future<String> _makeRequest(String id) {
+    assert(_hasInitiatedConnect);
+    // Create request.
+    String serial = (_requestSerial++).toString();
+    var request = new _WebSocketRequest(id);
+    if (_webSocket.isOpen) {
+      // Already connected, send request immediately.
+      _sendRequest(serial, request);
+    } else {
+      // Not connected yet, add to delayed requests.
+      _delayedRequests[serial] = request;
+    }
+    return request.completer.future;
+  }
+
+  void _onClose() {
+    _cancelAllRequests();
+    _notifyDisconnect();
+  }
+
+  // WebSocket error event handler.
+  void _onError() {
+    _cancelAllRequests();
+    _notifyDisconnect();
+  }
+
+  // WebSocket open event handler.
+  void _onOpen() {
+    target.lastConnectionTime = new DateTime.now().millisecondsSinceEpoch;
+    _sendAllDelayedRequests();
+    _notifyConnect();
+  }
+
+  // WebSocket message event handler.
+  void _onMessage(dynamic data) {
+    assert(data is String);  // We don't handle binary data, yet.
+    var map = JSON.decode(data);
+    if (map == null) {
+      Logger.root.severe('WebSocketVM got empty message');
+      return;
+    }
+    // Extract serial and response.
+    var serial;
+    var response;
+    if (target.chrome) {
+      if (map['method'] != 'Dart.observatoryData') {
+        // ignore devtools protocol spam.
+        return;
+      }
+      serial = map['params']['id'].toString();
+      response = map['params']['data'];
+    } else {
+      serial = map['seq'];
+      response = map['response'];
+    }
+    if (serial == null) {
+      // Messages without sequence numbers are asynchronous events
+      // from the vm.
+      postEventMessage(response);
+      return;
+    }
+    // Complete request.
+    var request = _pendingRequests.remove(serial);
+    if (request == null) {
+      Logger.root.severe('Received unexpected message: ${map}');
+      return;
+    }
+    request.completer.complete(response);
+  }
+
+  String _generateNetworkError(String userMessage) {
+    return JSON.encode({
+      'type': 'ServiceException',
+      'id': '',
+      'kind': 'NetworkException',
+      'message': userMessage
+    });
+  }
+
+  void _cancelRequests(Map<String, _WebSocketRequest> requests) {
+    requests.forEach((String serial, _WebSocketRequest request) {
+      request.completer.complete(
+          _generateNetworkError('WebSocket disconnected'));
+    });
+    requests.clear();
+  }
+
+  /// Cancel all pending and delayed requests by completing them with an error.
+  void _cancelAllRequests() {
+    if (_pendingRequests.length > 0) {
+      Logger.root.info('Cancelling all pending requests.');
+      _cancelRequests(_pendingRequests);
+    }
+    if (_delayedRequests.length > 0) {
+      Logger.root.info('Cancelling all delayed requests.');
+      _cancelRequests(_delayedRequests);
+    }
+  }
+
+  /// Send all delayed requests.
+  void _sendAllDelayedRequests() {
+    assert(_webSocket.isOpen);
+    if (_delayedRequests.length == 0) {
+      return;
+    }
+    Logger.root.info('Sending all delayed requests.');
+    // Send all delayed requests.
+    _delayedRequests.forEach(_sendRequest);
+    // Clear all delayed requests.
+    _delayedRequests.clear();
+  }
+
+  /// Send the request over WebSocket.
+  void _sendRequest(String serial, _WebSocketRequest request) {
+    assert (_webSocket.isOpen);
+    if (!request.id.endsWith('/profile/tag')) {
+      Logger.root.info('GET ${request.id} from ${target.networkAddress}');
+    }
+    // Mark request as pending.
+    assert(_pendingRequests.containsKey(serial) == false);
+    _pendingRequests[serial] = request;
+    var message;
+    // Encode message.
+    if (target.chrome) {
+      message = JSON.encode({
+        'id': int.parse(serial),
+        'method': 'Dart.observatoryQuery',
+        'params': {
+          'id': serial,
+          'query': request.id
+        }
+      });
+    } else {
+      message = JSON.encode({'seq': serial, 'request': request.id});
+    }
+    // Send message.
+    _webSocket.send(message);
+  }
+}
diff --git a/runtime/bin/vmservice/client/lib/service_html.dart b/runtime/bin/vmservice/client/lib/service_html.dart
index e64dec5..cb3d9bb 100644
--- a/runtime/bin/vmservice/client/lib/service_html.dart
+++ b/runtime/bin/vmservice/client/lib/service_html.dart
@@ -8,249 +8,42 @@
 import 'dart:convert';
 import 'dart:html';
 
-import 'package:logging/logging.dart';
-import 'package:observatory/service.dart';
+import 'package:observatory/service_common.dart';
 
 // Export the service library.
-export 'package:observatory/service.dart';
+export 'package:observatory/service_common.dart';
 
-/// Description of a VM target.
-class WebSocketVMTarget {
-  // Last time this VM has been connected to.
-  int lastConnectionTime = 0;
-  bool get hasEverConnected => lastConnectionTime > 0;
+class _HtmlWebSocket implements CommonWebSocket {
+  WebSocket _webSocket;
 
-  // Chrome VM or standalone;
-  bool chrome = false;
-  bool get standalone => !chrome;
-
-  // User defined name.
-  String name;
-  // Network address of VM.
-  String networkAddress;
-
-  WebSocketVMTarget(this.networkAddress) {
-    name = networkAddress;
+  void connect(String address,
+               void onOpen(),
+               void onMessage(dynamic data),
+               void onError(),
+               void onClose()) {
+    _webSocket = new WebSocket(address);
+    _webSocket.onClose.listen((CloseEvent) => onClose());
+    _webSocket.onError.listen((Event) => onError());
+    _webSocket.onOpen.listen((Event) => onOpen());
+    _webSocket.onMessage.listen((MessageEvent event) => onMessage(event.data));
   }
-
-  WebSocketVMTarget.fromMap(Map json) {
-    lastConnectionTime = json['lastConnectionTime'];
-    chrome = json['chrome'];
-    name = json['name'];
-    networkAddress = json['networkAddress'];
-    if (name == null) {
-      name = networkAddress;
-    }
+  
+  bool get isOpen => _webSocket.readyState == WebSocket.OPEN;
+  
+  void send(dynamic data) {
+    _webSocket.send(data);
   }
-
-  Map toJson() {
-    return {
-      'lastConnectionTime': lastConnectionTime,
-      'chrome': chrome,
-      'name': name,
-      'networkAddress': networkAddress,
-    };
+  
+  void close() {
+    _webSocket.close();
   }
 }
 
-class _WebSocketRequest {
-  final String id;
-  final Completer<String> completer;
-  _WebSocketRequest(this.id)
-      : completer = new Completer<String>();
-}
-
 /// The [WebSocketVM] communicates with a Dart VM over WebSocket. The Dart VM
 /// can be embedded in Chromium or standalone. In the case of Chromium, we
 /// make the service requests via the Chrome Remote Debugging Protocol.
-class WebSocketVM extends VM {
-  final Completer _connected = new Completer();
-  final Completer _disconnected = new Completer();
-  final WebSocketVMTarget target;
-  final Map<String, _WebSocketRequest> _delayedRequests =
-        new Map<String, _WebSocketRequest>();
-  final Map<String, _WebSocketRequest> _pendingRequests =
-      new Map<String, _WebSocketRequest>();
-  int _requestSerial = 0;
-  WebSocket _webSocket;
-
-  WebSocketVM(this.target) {
-    assert(target != null);
-  }
-
-  void _notifyConnect() {
-    if (!_connected.isCompleted) {
-      Logger.root.info('WebSocketVM connection opened: ${target.networkAddress}');
-      _connected.complete(this);
-    }
-  }
-  Future get onConnect => _connected.future;
-  void _notifyDisconnect() {
-    if (!_disconnected.isCompleted) {
-      Logger.root.info('WebSocketVM connection error: ${target.networkAddress}');
-      _disconnected.complete(this);
-    }
-  }
-  Future get onDisconnect => _disconnected.future;
-
-  void disconnect() {
-    if (_webSocket != null) {
-      _webSocket.close();
-    }
-    _cancelAllRequests();
-    _notifyDisconnect();
-  }
-
-  Future<String> getString(String id) {
-    if (_webSocket == null) {
-      // Create a WebSocket.
-      _webSocket = new WebSocket(target.networkAddress);
-      _webSocket.onClose.listen(_onClose);
-      _webSocket.onError.listen(_onError);
-      _webSocket.onOpen.listen(_onOpen);
-      _webSocket.onMessage.listen(_onMessage);
-    }
-    return _makeRequest(id);
-  }
-
-  /// Add a request for [id] to pending requests.
-  Future<String> _makeRequest(String id) {
-    assert(_webSocket != null);
-    // Create request.
-    String serial = (_requestSerial++).toString();
-    var request = new _WebSocketRequest(id);
-    if (_webSocket.readyState == WebSocket.OPEN) {
-      // Already connected, send request immediately.
-      _sendRequest(serial, request);
-    } else {
-      // Not connected yet, add to delayed requests.
-      _delayedRequests[serial] = request;
-    }
-    return request.completer.future;
-  }
-
-  void _onClose(CloseEvent event) {
-    _cancelAllRequests();
-    _notifyDisconnect();
-  }
-
-  // WebSocket error event handler.
-  void _onError(Event) {
-    _cancelAllRequests();
-    _notifyDisconnect();
-  }
-
-  // WebSocket open event handler.
-  void _onOpen(Event) {
-    target.lastConnectionTime = new DateTime.now().millisecondsSinceEpoch;
-    _sendAllDelayedRequests();
-    _notifyConnect();
-  }
-
-  // WebSocket message event handler.
-  void _onMessage(MessageEvent event) {
-    var map = JSON.decode(event.data);
-    if (map == null) {
-      Logger.root.severe('WebSocketVM got empty message');
-      return;
-    }
-    // Extract serial and response.
-    var serial;
-    var response;
-    if (target.chrome) {
-      if (map['method'] != 'Dart.observatoryData') {
-        // ignore devtools protocol spam.
-        return;
-      }
-      serial = map['params']['id'].toString();
-      response = map['params']['data'];
-    } else {
-      serial = map['seq'];
-      response = map['response'];
-    }
-    if (serial == null) {
-      // Messages without sequence numbers are asynchronous events
-      // from the vm.
-      postEventMessage(response);
-      return;
-    }
-    // Complete request.
-    var request = _pendingRequests.remove(serial);
-    if (request == null) {
-      Logger.root.severe('Received unexpected message: ${map}');
-      return;
-    }
-    request.completer.complete(response);
-  }
-
-  String _generateNetworkError(String userMessage) {
-    return JSON.encode({
-      'type': 'ServiceException',
-      'id': '',
-      'kind': 'NetworkException',
-      'message': userMessage
-    });
-  }
-
-  void _cancelRequests(Map<String, _WebSocketRequest> requests) {
-    requests.forEach((String serial, _WebSocketRequest request) {
-      request.completer.complete(
-          _generateNetworkError('WebSocket disconnected'));
-    });
-    requests.clear();
-  }
-
-  /// Cancel all pending and delayed requests by completing them with an error.
-  void _cancelAllRequests() {
-    if (_pendingRequests.length > 0) {
-      Logger.root.info('Cancelling all pending requests.');
-      _cancelRequests(_pendingRequests);
-    }
-    if (_delayedRequests.length > 0) {
-      Logger.root.info('Cancelling all delayed requests.');
-      _cancelRequests(_delayedRequests);
-    }
-  }
-
-  /// Send all delayed requests.
-  void _sendAllDelayedRequests() {
-    assert(_webSocket != null);
-    if (_delayedRequests.length == 0) {
-      return;
-    }
-    Logger.root.info('Sending all delayed requests.');
-    // Send all delayed requests.
-    _delayedRequests.forEach(_sendRequest);
-    // Clear all delayed requests.
-    _delayedRequests.clear();
-  }
-
-  /// Send the request over WebSocket.
-  void _sendRequest(String serial, _WebSocketRequest request) {
-    assert (_webSocket.readyState == WebSocket.OPEN);
-    if (!request.id.endsWith('/profile/tag')) {
-      Logger.root.info('GET ${request.id} from ${target.networkAddress}');
-    }
-    // Mark request as pending.
-    assert(_pendingRequests.containsKey(serial) == false);
-    _pendingRequests[serial] = request;
-    var message;
-    // Encode message.
-    if (target.chrome) {
-      message = JSON.encode({
-        'id': int.parse(serial),
-        'method': 'Dart.observatoryQuery',
-        'params': {
-          'id': serial,
-          'query': request.id
-        }
-      });
-    } else {
-      message = JSON.encode({'seq': serial, 'request': request.id});
-    }
-    // Send message.
-    _webSocket.send(message);
-  }
+class WebSocketVM extends CommonWebSocketVM {
+  WebSocketVM(WebSocketVMTarget target) : super(target, new _HtmlWebSocket());
 }
 
 // A VM that communicates with the service via posting messages from DevTools.
diff --git a/runtime/bin/vmservice/client/lib/service_io.dart b/runtime/bin/vmservice/client/lib/service_io.dart
new file mode 100644
index 0000000..aa65400
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/service_io.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library service_io;
+
+import 'dart:io';
+
+import 'package:observatory/service_common.dart';
+
+// Export the service library.
+export 'package:observatory/service_common.dart';
+
+class _IOWebSocket implements CommonWebSocket {
+  WebSocket _webSocket;
+  
+  void connect(String address,
+               void onOpen(),
+               void onMessage(dynamic data),
+               void onError(),
+               void onClose()) {
+    WebSocket.connect(address).then((WebSocket socket) {
+      _webSocket = socket;
+      _webSocket.listen(
+          onMessage,
+          onError: (dynamic) => onError(),
+          onDone: onClose,
+          cancelOnError: true);
+      onOpen();
+    });
+  }
+  
+  bool get isOpen =>
+      (_webSocket != null) && (_webSocket.readyState == WebSocket.OPEN);
+  
+  void send(dynamic data) {
+    _webSocket.add(data);
+  }
+  
+  void close() {
+    _webSocket.close();
+  }
+}
+
+/// The [WebSocketVM] communicates with a Dart VM over WebSocket. The Dart VM
+/// can be embedded in Chromium or standalone. In the case of Chromium, we
+/// make the service requests via the Chrome Remote Debugging Protocol.
+class WebSocketVM extends CommonWebSocketVM {
+  WebSocketVM(WebSocketVMTarget target) : super(target, new _IOWebSocket());
+}
diff --git a/runtime/bin/vmservice/client/lib/src/app/application.dart b/runtime/bin/vmservice/client/lib/src/app/application.dart
index 620d82c..567422c 100644
--- a/runtime/bin/vmservice/client/lib/src/app/application.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/application.dart
@@ -20,6 +20,7 @@
     }
     if (_vm != null) {
       // Disconnect from current VM.
+      notifications.clear();
       _vm.disconnect();
     }
     if (vm != null) {
@@ -27,6 +28,7 @@
       vm.onConnect.then(_vmConnected);
       vm.onDisconnect.then(_vmDisconnected);
       vm.errors.stream.listen(_onError);
+      vm.events.stream.listen(_onEvent);
       vm.exceptions.stream.listen(_onException);
     }
     _vm = vm;
@@ -59,7 +61,7 @@
       });
   }
 
-  void _handleEvent(ServiceEvent event) {
+  void _onEvent(ServiceEvent event) {
     switch(event.eventType) {
       case 'IsolateCreated':
         // vm.reload();
@@ -74,7 +76,7 @@
         break;
         
       case 'BreakpointResolved':
-        // Do nothing.
+        event.isolate.reloadBreakpoints();
         break;
 
       case 'BreakpointReached':
diff --git a/runtime/bin/vmservice/client/lib/src/elements/action_link.dart b/runtime/bin/vmservice/client/lib/src/elements/action_link.dart
index 5d64b1e..74cc490 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/action_link.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/action_link.dart
@@ -13,6 +13,7 @@
   @observable bool busy = false;
   @published var callback = null;
   @published String label = 'action';
+  @published String color = null;
 
   void doAction(var a, var b, var c) {
     if (busy) {
diff --git a/runtime/bin/vmservice/client/lib/src/elements/action_link.html b/runtime/bin/vmservice/client/lib/src/elements/action_link.html
index ba58478..b02e7d6 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/action_link.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/action_link.html
@@ -7,10 +7,15 @@
       .idle {
         color: #0489c3;
         cursor: pointer;
+        text-decoration: none;
+      }
+      .idle:hover {
+        text-decoration: underline;
       }
       .busy {
         color: #aaa;
         cursor: wait;
+        text-decoration: none;
       }
     </style>
 
@@ -18,7 +23,12 @@
       <span class="busy">[{{ label }}]</span>
     </template>
     <template if="{{ !busy }}">
-      <span class="idle"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
+      <template if="{{ color == null }}">
+        <span class="idle"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
+      </template>
+      <template if="{{ color != null }}">
+        <span class="idle" style="color:{{ color }}"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
+      </template>
     </template>
   </template>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
index 28a8f1d..07d647a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
@@ -24,22 +24,23 @@
   @published Isolate isolate;
 
   Future pause(_) {
-    return isolate.get("debug/pause").then((result) {
-        // TODO(turnidge): Instead of asserting here, handle errors
-        // properly.
-        assert(result.serviceType == 'Success');
-        return isolate.reload();
-      });
+    return isolate.pause();
   }
-
   Future resume(_) {
-    return isolate.get("debug/resume").then((result) {
-        // TODO(turnidge): Instead of asserting here, handle errors
-        // properly.
-        assert(result.serviceType == 'Success');
-        app.removePauseEvents(isolate);
-        return isolate.reload();
-      });
+    app.removePauseEvents(isolate);
+    return isolate.resume();
+  }
+  Future stepInto(_) {
+    app.removePauseEvents(isolate);
+    return isolate.stepInto();
+  }
+  Future stepOver(_) {
+    app.removePauseEvents(isolate);
+    return isolate.stepOver();
+  }
+  Future stepOut(_) {
+    app.removePauseEvents(isolate);
+    return isolate.stepOut();
   }
 }
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
index f7a7c94..cd907e0 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
@@ -15,10 +15,10 @@
       <div class="flex-item-10-percent">
         <isolate-ref ref="{{ isolate }}"></isolate-ref>
       </div>
-      <div class="flex-item-20-percent">
+      <div class="flex-item-30-percent">
         <isolate-run-state isolate="{{ isolate }}"></isolate-run-state>
       </div>
-      <div class="flex-item-50-percent">
+      <div class="flex-item-40-percent">
         <isolate-location isolate="{{ isolate }}"></isolate-location>
       </div>
       <div class="flex-item-10-percent">
@@ -43,6 +43,10 @@
     <template if="{{ isolate.pauseEvent != null }}">
       <strong>paused</strong>
       <action-link callback="{{ resume }}" label="resume"></action-link>
+
+      <action-link callback="{{ stepInto }}" label="step"></action-link>
+      <action-link callback="{{ stepOver }}" label="step&nbsp;over"></action-link>
+      <action-link callback="{{ stepOut }}" label="step&nbsp;out"></action-link>
     </template>
 
     <template if="{{ isolate.running }}">
@@ -67,30 +71,26 @@
       <template if="{{ isolate.pauseEvent.eventType == 'IsolateCreated' }}">
         at isolate start
       </template>
+
       <template if="{{ isolate.pauseEvent.eventType == 'IsolateShutdown' }}">
         at isolate exit
       </template>
-      <template if="{{ isolate.pauseEvent.eventType == 'IsolateInterrupted' }}">
+
+      <template if="{{ isolate.pauseEvent.eventType == 'IsolateInterrupted' ||
+                       isolate.pauseEvent.eventType == 'BreakpointReached' ||
+                       isolate.pauseEvent.eventType == 'ExceptionThrown' }}">
+        <template if="{{ isolate.pauseEvent.breakpoint != null }}">
+          by breakpoint
+        </template>
+        <template if="{{ isolate.pauseEvent.eventType == 'ExceptionThrown' }}">
+          by exception
+        </template>
         at
         <function-ref ref="{{ isolate.topFrame['function'] }}">
         </function-ref>
         (<script-ref ref="{{ isolate.topFrame['script'] }}"
                      pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
       </template>
-      <template if="{{ isolate.pauseEvent.eventType == 'BreakpointReached' }}">
-        at breakpoint {{ isolate.pauseEvent.breakpoint['id'] }}
-        <function-ref ref="{{ isolate.topFrame['function'] }}">
-        </function-ref>
-        (<script-ref ref="{{ isolate.topFrame['script'] }}"
-                     pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
-      </template>
-      <template if="{{ isolate.pauseEvent.eventType == 'ExceptionThrown' }}">
-        at exception
-        <function-ref ref="{{ isolate.topFrame['function'] }}">
-        </function-ref>
-        (<script-ref ref="{{ isolate.topFrame['script'] }}"
-                     pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
-      </template>
     </template>
 
     <template if="{{ isolate.running }}">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
index dc9ec30..eab48d8 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
@@ -40,10 +40,10 @@
     <div class="flex-row">
       <div class="flex-item-10-percent">
       </div>
-      <div class="flex-item-20-percent">
+      <div class="flex-item-30-percent">
         <isolate-run-state isolate="{{ isolate }}"></isolate-run-state>
       </div>
-      <div class="flex-item-60-percent">
+      <div class="flex-item-50-percent">
         <isolate-location isolate="{{ isolate }}"></isolate-location>
       </div>
       <div class="flex-item-10-percent">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
index 704a99e..9f5b0ed 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
@@ -4,6 +4,7 @@
 
 library nav_bar_element;
 
+import 'dart:async';
 import 'dart:html';
 import 'observatory_element.dart';
 import 'package:observatory/service.dart';
@@ -128,6 +129,23 @@
   @published ObservableList<ServiceEvent> events;
   @published ServiceEvent event;
   
+  Future resume(_) {
+    app.removePauseEvents(event.isolate);
+    return event.isolate.resume();
+  }
+  Future stepInto(_) {
+    app.removePauseEvents(event.isolate);
+    return event.isolate.stepInto();
+  }
+  Future stepOver(_) {
+    app.removePauseEvents(event.isolate);
+    return event.isolate.stepOver();
+  }
+  Future stepOut(_) {
+    app.removePauseEvents(event.isolate);
+    return event.isolate.stepOut();
+  }
+
   void closeItem(MouseEvent e, var detail, Element target) {
     events.remove(event);
   }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
index b1411d9..a690cf2 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
@@ -1,4 +1,5 @@
 <link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="action_link.html">
 <link rel="import" href="observatory_element.html">
 
 <polymer-element name="nav-bar" extends="observatory-element">
@@ -315,27 +316,30 @@
         background: rgba(255,255,255,0.5);
       }
     </style>
-    <template if="{{ event.eventType == 'IsolateInterrupted' }}">
+    <template if="{{ event.eventType == 'IsolateInterrupted' ||
+                     event.eventType == 'BreakpointReached' ||
+                     event.eventType == 'ExceptionThrown' }}">
       <div class="item">
         Isolate
-        <a class="link" on-click="{{ goto }}" href="{{ event.isolate.link }}">{{ event.isolate.name }}</a>
+        <a class="link" on-click="{{ goto }}"
+           href="{{ event.isolate.link }}">{{ event.isolate.name }}</a>
         is paused
-        <a class="boxclose" on-click="{{ closeItem }}">&times;</a>
-      </div>
-    </template>
-    <template if="{{ event.eventType == 'BreakpointReached' }}">
-      <div class="item">
-        Isolate
-        <a class="link" on-click="{{ goto }}" href="{{ event.isolate.link }}">{{ event.isolate.name }}</a>
-        is paused at breakpoint {{ event.breakpoint['id'] }}
-        <a class="boxclose" on-click="{{ closeItem }}">&times;</a>
-      </div>
-    </template>
-    <template if="{{ event.eventType == 'ExceptionThrown' }}">
-      <div class="item">
-        Isolate
-        <a class="link" on-click="{{ goto }}" href="{{ event.isolate.link }}">{{ event.isolate.name }}</a>
-        is paused at exception
+        <template if="{{ event.breakpoint != null }}">
+          at breakpoint
+        </template>
+        <template if="{{ event.eventType == 'ExceptionThrown' }}">
+          at exception
+        </template>
+
+        <br><br>
+        <action-link callback="{{ resume }}" label="resume" color="white">
+        </action-link>
+        <action-link callback="{{ stepInto }}" label="step" color="white">
+        </action-link>
+        <action-link callback="{{ stepOver }}" label="step&nbsp;over"
+                     color="white"></action-link>
+        <action-link callback="{{ stepOut }}" label="step&nbsp;out"
+                     color="white"></action-link>
         <a class="boxclose" on-click="{{ closeItem }}">&times;</a>
       </div>
     </template>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart b/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart
index d697983..814c45f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart
@@ -25,6 +25,7 @@
   @observable int currentLine;
   @observable int startLine;
   @observable int endLine;
+  @observable bool linesReady = false;
 
   @observable List<ScriptLine> lines = toObservable([]);
 
@@ -34,11 +35,15 @@
 
   MutationObserver _observer;
 
-  void _onMutation(mutations, observer) {
+  void _scrollToCurrentPos() {
     var line = shadowRoot.querySelector('#line-$currentLine');
     if (line != null) {
       line.scrollIntoView();
     }
+  }
+
+  void _onMutation(mutations, observer) {
+    _scrollToCurrentPos();
   } 
 
   void attached() {
@@ -60,6 +65,7 @@
 
   void currentPosChanged(oldValue) {
     _updateLines();
+    _scrollToCurrentPos();
   }
 
   void startPosChanged(oldValue) {
@@ -77,6 +83,7 @@
   var _updateFuture;
 
   void _updateLines() {
+    linesReady = false;
     if (_updateFuture != null) {
       // Already scheduled.
       return;
@@ -103,11 +110,39 @@
     endLine = (endPos != null
                ? script.tokenToLine(endPos)
                : script.lines.length);
+
     lines.clear();
     for (int i = (startLine - 1); i <= (endLine - 1); i++) {
       lines.add(script.lines[i]);
     }
+    linesReady = true;
   }
 
   ScriptInsetElement.created() : super.created();
 }
+
+@CustomTag('breakpoint-toggle')
+class BreakpointToggleElement extends ObservatoryElement {
+  @published ScriptLine line;
+  @observable bool busy = false;
+
+  void toggleBreakpoint(var a, var b, var c) {
+    if (busy) {
+      return;
+    }
+    busy = true;
+    if (line.bpt == null) {
+      // No breakpoint.  Set it.
+      line.script.isolate.setBreakpoint(line.script, line.line).then((_) {
+          busy = false;
+      });
+    } else {
+      // Existing breakpoint.  Remove it.
+      line.script.isolate.clearBreakpoint(line.bpt).then((_) {
+          busy = false;
+      });
+    }
+  }
+
+  BreakpointToggleElement.created() : super.created();
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_inset.html b/runtime/bin/vmservice/client/lib/src/elements/script_inset.html
index 52460df..24c4bfe 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_inset.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_inset.html
@@ -46,24 +46,39 @@
       <content></content>
       <div class="sourceBox" style="height:{{height}}">
         <div class="sourceTable">
-          <template repeat="{{ line in lines }}">
-            <div class="sourceRow" id="{{ makeLineId(line.line) }}">
-              <template if="{{ line.hits == null }}">
-                <div class="hitsNone">{{ line.line }}</div>
-              </template>
-              <template if="{{ line.hits == 0 }}">
-                <div class="hitsNotExecuted">{{ line.line }}</div>
-              </template>
-              <template if="{{ line.hits > 0 }}">
-                <div class="hitsExecuted">{{ line.line }}</div>
-              </template>
-              <div class="sourceItem">&nbsp;</div>
-              <template if="{{ line.line == currentLine }}">
-                <div id="currentLine" class="sourceItemCurrent">{{line.text}}</div>
-              </template>
-              <template if="{{ line.line != currentLine }}">
-                <div class="sourceItem">{{line.text}}</div>
-              </template>
+          <template if="{{ linesReady }}">
+            <template repeat="{{ line in lines }}">
+              <div class="sourceRow" id="{{ makeLineId(line.line) }}">
+                <breakpoint-toggle line="{{ line }}"></breakpoint-toggle>
+
+                <div class="sourceItem">&nbsp;</div>
+
+                <template if="{{ line.hits == null ||
+                              line.hits < 0 }}">
+                  <div class="hitsNone">{{ line.line }}</div>
+                </template>
+                <template if="{{ line.hits == 0 }}">
+                  <div class="hitsNotExecuted">{{ line.line }}</div>
+                </template>
+                <template if="{{ line.hits > 0 }}">
+                  <div class="hitsExecuted">{{ line.line }}</div>
+                </template>
+
+                <div class="sourceItem">&nbsp;</div>
+
+                <template if="{{ line.line == currentLine }}">
+                  <div class="sourceItemCurrent">{{line.text}}</div>
+                </template>
+                <template if="{{ line.line != currentLine }}">
+                  <div class="sourceItem">{{line.text}}</div>
+                </template>
+              </div>
+            </template>
+          </template>
+
+          <template if="{{ !linesReady }}">
+            <div class="sourceRow">
+              <div class="sourceItem">loading...</div>
             </div>
           </template>
         </div>
@@ -72,4 +87,66 @@
   </template>
 </polymer-element>
 
+<polymer-element name="breakpoint-toggle" extends="observatory-element">
+  <template>
+    <style>
+      .emptyBreakpoint, .possibleBreakpoint, .busyBreakpoint, .unresolvedBreakpoint, .resolvedBreakpoint  {
+        display: table-cell;
+        vertical-align: top;
+        font: 400 14px consolas, courier, monospace;
+        min-width: 1em;
+        text-align: center;
+        cursor: pointer;
+      }
+      .possibleBreakpoint {
+        color: #e0e0e0;
+      }
+      .possibleBreakpoint:hover {
+        color: white;
+        background-color: #777;
+      }
+      .busyBreakpoint {
+        color: white;
+        background-color: black;
+        cursor: wait;
+      }
+      .unresolvedBreakpoint {
+        color: white;
+        background-color: #cac;
+      }
+      .resolvedBreakpoint {
+        color: white;
+        background-color: #e66;
+      }
+    </style>
+
+    <template if="{{ line.possibleBpt && busy}}">
+      <div class="busyBreakpoint">B</div>
+    </template>
+
+    <template if="{{ line.bpt == null && !line.possibleBpt }}">
+      <div class="emptyBreakpoint">&nbsp;</div>
+    </template>
+
+    <template if="{{ line.bpt == null && line.possibleBpt && !busy}}">
+      <div class="possibleBreakpoint">
+        <a on-click="{{ toggleBreakpoint }}">B</a>
+      </div>
+    </template>
+
+    <template if="{{ line.bpt != null && !line.bpt['resolved'] && !busy}}">
+      <div class="unresolvedBreakpoint">
+        <a on-click="{{ toggleBreakpoint }}">B</a>
+      </div>
+    </template>
+
+    <template if="{{ line.bpt != null && line.bpt['resolved'] && !busy}}">
+      <div class="resolvedBreakpoint">
+        <a on-click="{{ toggleBreakpoint }}">B</a>
+      </div>
+    </template>
+
+  </template>
+</polymer-element>
+
 <script type="application/dart" src="script_inset.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index e9d4adb..01ebe5f 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -88,8 +88,6 @@
       case 'Library':
         obj = new Library._empty(owner);
         break;
-      case 'Null':
-        return null;
       case 'ServiceError':
         obj = new ServiceError._empty(owner);
         break;
@@ -268,6 +266,7 @@
             "Expected 'ServiceEvent' but found '${map['type']}'");
         return;
       }
+
       // Extract the owning isolate from the event itself.
       String owningIsolateId = map['isolate']['id'];
       _getIsolate(owningIsolateId).then((owningIsolate) {
@@ -754,6 +753,8 @@
     _loaded = true;
     loading = false;
 
+    reloadBreakpoints();
+
     // Remap DebuggerEvent to ServiceEvent so that the observatory can
     // work against 1.5 vms in the short term.
     //
@@ -890,6 +891,144 @@
     }
     return node;
   }
+
+  ServiceMap breakpoints;
+
+  void _removeBreakpoint(ServiceMap bpt) {
+    var script = bpt['location']['script'];
+    var tokenPos = bpt['location']['tokenPos'];
+    assert(tokenPos != null);
+    if (script.loaded) {
+      var line = script.tokenToLine(tokenPos);
+      assert(line != null);
+      assert(script.lines[line - 1].bpt == bpt);
+      script.lines[line - 1].bpt = null;
+    }
+  }
+
+  void _addBreakpoint(ServiceMap bpt) {
+    var script = bpt['location']['script'];
+    var tokenPos = bpt['location']['tokenPos'];
+    assert(tokenPos != null);
+    if (script.loaded) {
+      var line = script.tokenToLine(tokenPos);
+      assert(line != null);
+      assert(script.lines[line - 1].bpt == null);
+      script.lines[line - 1].bpt = bpt;
+    } else {
+      // Load the script and then plop in the breakpoint.
+      script.load().then((_) {
+          _addBreakpoint(bpt);
+      });
+    }
+  }
+
+  void _updateBreakpoints(ServiceMap newBreakpoints) {
+    // Remove all of the old breakpoints from the Script lines.
+    if (breakpoints != null) {
+      for (var bpt in breakpoints['breakpoints']) {
+        _removeBreakpoint(bpt);
+      }
+    }
+    // Add all of the new breakpoints to the Script lines.
+    for (var bpt in newBreakpoints['breakpoints']) {
+      _addBreakpoint(bpt);
+    }
+    breakpoints = newBreakpoints;
+  }
+
+  Future<ServiceObject> _inProgressReloadBpts;
+
+  Future reloadBreakpoints() {
+    // TODO(turnidge): Can reusing the Future here ever cause us to
+    // get stale breakpoints?
+    if (_inProgressReloadBpts == null) {
+      _inProgressReloadBpts =
+          get('debug/breakpoints').then((newBpts) {
+              _updateBreakpoints(newBpts);
+          }).whenComplete(() {
+              _inProgressReloadBpts = null;
+          });
+    }
+    return _inProgressReloadBpts;
+  }
+
+  Future<ServiceObject> setBreakpoint(Script script, int line) {
+    return get(script.id + "/setBreakpoint?line=${line}").then((result) {
+        if (result is DartError) {
+          // Unable to set a breakpoint at desired line.
+          script.lines[line - 1].possibleBpt = false;
+        }
+        return reloadBreakpoints();
+      });
+  }
+
+  Future clearBreakpoint(ServiceMap bpt) {
+    return get('${bpt.id}/clear').then((result) {
+        if (result is DartError) {
+          // TODO(turnidge): Handle this more gracefully.
+          Logger.root.severe(result.message);
+        }
+        if (pauseEvent != null &&
+            pauseEvent.breakpoint != null &&
+            (pauseEvent.breakpoint['id'] == bpt['id'])) {
+          return isolate.reload();
+        } else {
+          return reloadBreakpoints();
+        }
+      });
+  }
+
+  Future pause() {
+    return get("debug/pause").then((result) {
+        if (result is DartError) {
+          // TODO(turnidge): Handle this more gracefully.
+          Logger.root.severe(result.message);
+        }
+        return isolate.reload();
+      });
+  }
+
+  Future resume() {
+    return get("debug/resume").then((result) {
+        if (result is DartError) {
+          // TODO(turnidge): Handle this more gracefully.
+          Logger.root.severe(result.message);
+        }
+        return isolate.reload();
+      });
+  }
+
+  Future stepInto() {
+    print('isolate.stepInto');
+    return get("debug/resume?step=into").then((result) {
+        if (result is DartError) {
+          // TODO(turnidge): Handle this more gracefully.
+          Logger.root.severe(result.message);
+        }
+        return isolate.reload();
+      });
+  }
+
+  Future stepOver() {
+    return get("debug/resume?step=over").then((result) {
+        if (result is DartError) {
+          // TODO(turnidge): Handle this more gracefully.
+          Logger.root.severe(result.message);
+        }
+        return isolate.reload();
+      });
+  }
+
+  Future stepOut() {
+    return get("debug/resume?step=out").then((result) {
+        if (result is DartError) {
+          // TODO(turnidge): Handle this more gracefully.
+          Logger.root.severe(result.message);
+        }
+        return isolate.reload();
+      });
+  }
 }
 
 /// A [ServiceObject] which implements [ObservableMap].
@@ -1307,8 +1446,8 @@
     script = map['script'];
     tokenPos = map['tokenPos'];
     endTokenPos = map['endTokenPos'];
-    code = map['code'];
-    unoptimizedCode = map['unoptimized_code'];
+    code = _convertNull(map['code']);
+    unoptimizedCode = _convertNull(map['unoptimized_code']);
     isOptimizable = map['is_optimizable'];
     isInlinable = map['is_inlinable'];
     deoptimizations = map['deoptimizations'];
@@ -1326,10 +1465,58 @@
 }
 
 class ScriptLine extends Observable {
+  final Script script;
   final int line;
   final String text;
   @observable int hits;
-  ScriptLine(this.line, this.text);
+  @observable ServiceMap bpt;
+  @observable bool possibleBpt = true;
+
+  static bool _isTrivialToken(String token) {
+    if (token == 'else') {
+      return true;
+    }
+    for (var c in token.split('')) {
+      switch (c) {
+        case '{':
+        case '}':
+        case '(':
+        case ')':
+        case ';':
+          break;
+        default:
+          return false;
+      }
+    }
+    return true;
+  }
+
+  static bool _isTrivialLine(String text) {
+    var wsTokens = text.split(new RegExp(r"(\s)+"));
+    for (var wsToken in wsTokens) {
+      var tokens = wsToken.split(new RegExp(r"(\b)"));
+      for (var token in tokens) {
+        if (!_isTrivialToken(token)) {
+          return false;
+        }
+      }
+    }
+    return true;
+  }
+
+  ScriptLine(this.script, this.line, this.text) {
+    possibleBpt = !_isTrivialLine(text);
+    
+    // TODO(turnidge): This is not so efficient.  Consider improving.
+    for (var bpt in this.script.isolate.breakpoints['breakpoints']) {
+      var bptScript = bpt['location']['script'];
+      var bptTokenPos = bpt['location']['tokenPos'];
+      if (bptScript == this.script &&
+          bptScript.tokenToLine(bptTokenPos) == line) {
+        this.bpt = bpt;
+      }
+    }
+  }
 }
 
 class Script extends ServiceObject with Coverage {
@@ -1383,9 +1570,12 @@
     _tokenToCol.clear();
     firstTokenPos = null;
     lastTokenPos = null;
+    var lineSet = new Set();
+
     for (var line in table) {
       // Each entry begins with a line number...
       var lineNumber = line[0];
+      lineSet.add(lineNumber);
       for (var pos = 1; pos < line.length; pos += 2) {
         // ...and is followed by (token offset, col number) pairs.
         var tokenOffset = line[pos];
@@ -1405,6 +1595,13 @@
         _tokenToCol[tokenOffset] = colNumber;
       }
     }
+
+    for (var line in lines) {
+      // Remove possible breakpoints on lines with no tokens.
+      if (!lineSet.contains(line.line)) {
+        line.possibleBpt = false;
+      }
+    }
   }
 
   void _processHits(List scriptHits) {
@@ -1437,15 +1634,12 @@
     lines.clear();
     Logger.root.info('Adding ${sourceLines.length} source lines for ${_url}');
     for (var i = 0; i < sourceLines.length; i++) {
-      lines.add(new ScriptLine(i + 1, sourceLines[i]));
+      lines.add(new ScriptLine(this, i + 1, sourceLines[i]));
     }
     _applyHitsToLines();
   }
 
   void _applyHitsToLines() {
-    if (lines.length == 0) {
-      return;
-    }
     for (var line in lines) {
       var hits = _hits[line.line];
       line.hits = hits;
@@ -1990,6 +2184,15 @@
   }
 }
 
+// Convert any ServiceMaps representing a null instance into an actual null.
+_convertNull(obj) {
+  if (obj is ServiceMap &&
+      obj.serviceType == 'Null') {
+    return null;
+  }
+  return obj;
+}
+
 // Returns true if [map] is a service map. i.e. it has the following keys:
 // 'id' and a 'type'.
 bool _isServiceMap(ObservableMap m) {
diff --git a/runtime/bin/vmservice_impl.cc b/runtime/bin/vmservice_impl.cc
index ff95402..139d0e7 100644
--- a/runtime/bin/vmservice_impl.cc
+++ b/runtime/bin/vmservice_impl.cc
@@ -194,7 +194,7 @@
 Dart_Handle VmService::LoadSource(Dart_Handle library, const char* name) {
   Dart_Handle url = Dart_NewStringFromCString(name);
   Dart_Handle source = GetSource(name);
-  return Dart_LoadSource(library, url, source);
+  return Dart_LoadSource(library, url, source, 0, 0);
 }
 
 
@@ -287,7 +287,7 @@
   if (Dart_IsError(source)) {
     return source;
   }
-  return Dart_LoadSource(library, url, source);
+  return Dart_LoadSource(library, url, source, 0, 0);
 }
 
 
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 471d2cd..d56241d 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -2624,8 +2624,25 @@
 /* TODO(turnidge): Consider returning Dart_Null() when the library is
  * not found to distinguish that from a true error case. */
 
+
+/**
+ * Report an loading error for the library.
+ *
+ * \param library The library that failed to load.
+ * \param error The Dart error instance containing the load error.
+ *
+ * \return If the VM handles the error, the return value is
+ * a null handle. If it doesn't handle the error, the error
+ * object is returned.
+ */
+DART_EXPORT Dart_Handle Dart_LibraryHandleError(Dart_Handle library,
+                                                Dart_Handle error);
+
+
 DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url,
-                                         Dart_Handle source);
+                                         Dart_Handle source,
+                                         intptr_t line_offset,
+                                         intptr_t column_offset);
 
 /**
  * Imports a library into another library, optionally with a prefix.
@@ -2653,7 +2670,9 @@
  */
 DART_EXPORT Dart_Handle Dart_LoadSource(Dart_Handle library,
                                         Dart_Handle url,
-                                        Dart_Handle source);
+                                        Dart_Handle source,
+                                        intptr_t line_offset,
+                                        intptr_t column_offset);
 /* TODO(turnidge): Rename to Dart_LibraryLoadSource? */
 
 
diff --git a/runtime/lib/lib_prefix.dart b/runtime/lib/lib_prefix.dart
index 536cc5c..f74dcb1 100644
--- a/runtime/lib/lib_prefix.dart
+++ b/runtime/lib/lib_prefix.dart
@@ -9,6 +9,7 @@
 class _LibraryPrefix {
 
   bool _load() native "LibraryPrefix_load";
+  Error _loadError() native "LibraryPrefix_loadError";
 
   bool _invalidateDependentCode()
       native "LibraryPrefix_invalidateDependentCode";
@@ -43,10 +44,14 @@
 // Called from the VM when all outstanding load requests have
 // finished.
 _completeDeferredLoads() {
-  var lenghth = _outstandingLoadRequests;
   _outstandingLoadRequests.forEach((prefix, completer) {
-    prefix._invalidateDependentCode();
-    completer.complete(true);
+    var error = prefix._loadError();
+    if (error != null) {
+      completer.completeError(error);
+    } else {
+      prefix._invalidateDependentCode();
+      completer.complete(true);
+    }
   });
   _outstandingLoadRequests.clear();
 }
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index c58c394..8c52a24 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -290,4 +290,17 @@
   return Bool::Get(hasCompleted).raw();
 }
 
+
+DEFINE_NATIVE_ENTRY(LibraryPrefix_loadError, 1) {
+  const LibraryPrefix& prefix =
+      LibraryPrefix::CheckedHandle(arguments->NativeArgAt(0));
+  // Currently all errors are Dart instances, e.g. I/O errors
+  // created by deferred loading code. LanguageErrors from
+  // failed loading or finalization attempts are propagated and result
+  // in the isolate's death.
+  const Instance& error = Instance::Handle(prefix.LoadError());
+  return error.raw();
+}
+
+
 }  // namespace dart
diff --git a/runtime/lib/profiler.dart b/runtime/lib/profiler.dart
index 2c60141..94d11ef 100644
--- a/runtime/lib/profiler.dart
+++ b/runtime/lib/profiler.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:_internal";
+import 'dart:_internal';
 
 patch class UserTag {
   /* patch */ factory UserTag(String label) {
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index ba8027b..cbbc285 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -477,6 +477,15 @@
 }
 
 
+// Similar to bit_copy and bit_cast, but does take the type from the argument.
+template <typename T>
+static inline T ReadUnaligned(const T* ptr) {
+  T value;
+  memcpy(&value, ptr, sizeof(value));
+  return value;
+}
+
+
 // On Windows the reentrent version of strtok is called
 // strtok_s. Unify on the posix name strtok_r.
 #if defined(TARGET_OS_WINDOWS)
diff --git a/runtime/vm/ast.h b/runtime/vm/ast.h
index aceb0b0..03d65a0 100644
--- a/runtime/vm/ast.h
+++ b/runtime/vm/ast.h
@@ -165,6 +165,7 @@
   void Add(AstNode* node) { nodes_.Add(node); }
   intptr_t length() const { return nodes_.length(); }
   AstNode* NodeAt(intptr_t index) const { return nodes_[index]; }
+  void ReplaceNodeAt(intptr_t index, AstNode* value) { nodes_[index] = value; }
 
   DECLARE_COMMON_NODE_FUNCTIONS(SequenceNode);
 
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index 20cce5c..b6ffb8c 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -150,7 +150,9 @@
     if (error.IsNull()) {
       library.SetLoaded();
     } else {
-      library.SetLoadError();
+      // Compilation errors are not Dart instances, so just mark the library
+      // as having failed to load without providing an error instance.
+      library.SetLoadError(Instance::Handle());
     }
   }
   return error.raw();
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 1577700..5452449 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -363,6 +363,7 @@
   V(Uri_isWindowsPlatform, 0)                                                  \
   V(LibraryPrefix_load, 1)                                                     \
   V(LibraryPrefix_invalidateDependentCode, 1)                                  \
+  V(LibraryPrefix_loadError, 1)                                                \
   V(UserTag_new, 2)                                                            \
   V(UserTag_label, 1)                                                          \
   V(UserTag_defaultTag, 0)                                                     \
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 0c7b007..c6022b5 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -4793,7 +4793,9 @@
     *result = Api::NewHandle(isolate, lib.raw());
   } else {
     *result = Api::NewHandle(isolate, error.raw());
-    lib.SetLoadError();
+    // Compilation errors are not Dart instances, so just mark the library
+    // as having failed to load without providing an error instance.
+    lib.SetLoadError(Instance::Handle());
   }
 }
 
@@ -4801,7 +4803,7 @@
 DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url,
                                         Dart_Handle source,
                                         intptr_t line_offset,
-                                        intptr_t col_offset) {
+                                        intptr_t column_offset) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
   TIMERSCOPE(isolate, time_script_loading);
@@ -4824,8 +4826,8 @@
     return Api::NewError("%s: argument 'line_offset' must be positive number",
                          CURRENT_FUNC);
   }
-  if (col_offset < 0) {
-    return Api::NewError("%s: argument 'col_offset' must be positive number",
+  if (column_offset < 0) {
+    return Api::NewError("%s: argument 'column_offset' must be positive number",
                          CURRENT_FUNC);
   }
   CHECK_CALLBACK_STATE(isolate);
@@ -4839,7 +4841,7 @@
 
   const Script& script = Script::Handle(
       isolate, Script::New(url_str, source_str, RawScript::kScriptTag));
-  script.SetLocationOffset(line_offset, col_offset);
+  script.SetLocationOffset(line_offset, column_offset);
   Dart_Handle result;
   CompileSource(isolate, library, script, &result);
   return result;
@@ -5028,8 +5030,38 @@
 }
 
 
+DART_EXPORT Dart_Handle Dart_LibraryHandleError(Dart_Handle library_in,
+                                                Dart_Handle error_in) {
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+
+  const Library& lib = Api::UnwrapLibraryHandle(isolate, library_in);
+  if (lib.IsNull()) {
+    RETURN_TYPE_ERROR(isolate, library_in, Library);
+  }
+  const Instance& err = Api::UnwrapInstanceHandle(isolate, error_in);
+  if (err.IsNull()) {
+    RETURN_TYPE_ERROR(isolate, error_in, Instance);
+  }
+  CHECK_CALLBACK_STATE(isolate);
+
+  const GrowableObjectArray& pending_deferred_loads =
+      GrowableObjectArray::Handle(
+          isolate->object_store()->pending_deferred_loads());
+  for (intptr_t i = 0; i < pending_deferred_loads.Length(); i++) {
+    if (pending_deferred_loads.At(i) == lib.raw()) {
+      lib.SetLoadError(err);
+      return Api::Null();
+    }
+  }
+  return error_in;
+}
+
+
 DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url,
-                                         Dart_Handle source) {
+                                         Dart_Handle source,
+                                         intptr_t line_offset,
+                                         intptr_t column_offset) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
   TIMERSCOPE(isolate, time_script_loading);
@@ -5041,6 +5073,14 @@
   if (source_str.IsNull()) {
     RETURN_TYPE_ERROR(isolate, source, String);
   }
+  if (line_offset < 0) {
+    return Api::NewError("%s: argument 'line_offset' must be positive number",
+                         CURRENT_FUNC);
+  }
+  if (column_offset < 0) {
+    return Api::NewError("%s: argument 'column_offset' must be positive number",
+                         CURRENT_FUNC);
+  }
   CHECK_CALLBACK_STATE(isolate);
 
   NoHeapGrowthControlScope no_growth_control;
@@ -5051,7 +5091,7 @@
     library.Register();
   } else if (library.LoadInProgress() ||
       library.Loaded() ||
-      library.LoadError()) {
+      library.LoadFailed()) {
     // The source for this library has either been loaded or is in the
     // process of loading.  Return an error.
     return Api::NewError("%s: library '%s' has already been loaded.",
@@ -5059,6 +5099,7 @@
   }
   const Script& script = Script::Handle(
       isolate, Script::New(url_str, source_str, RawScript::kLibraryTag));
+  script.SetLocationOffset(line_offset, column_offset);
   Dart_Handle result;
   CompileSource(isolate, library, script, &result);
   // Propagate the error out right now.
@@ -5124,7 +5165,9 @@
 
 DART_EXPORT Dart_Handle Dart_LoadSource(Dart_Handle library,
                                         Dart_Handle url,
-                                        Dart_Handle source) {
+                                        Dart_Handle source,
+                                        intptr_t line_offset,
+                                        intptr_t column_offset) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
   TIMERSCOPE(isolate, time_script_loading);
@@ -5140,12 +5183,21 @@
   if (source_str.IsNull()) {
     RETURN_TYPE_ERROR(isolate, source, String);
   }
+  if (line_offset < 0) {
+    return Api::NewError("%s: argument 'line_offset' must be positive number",
+                         CURRENT_FUNC);
+  }
+  if (column_offset < 0) {
+    return Api::NewError("%s: argument 'column_offset' must be positive number",
+                         CURRENT_FUNC);
+  }
   CHECK_CALLBACK_STATE(isolate);
 
   NoHeapGrowthControlScope no_growth_control;
 
   const Script& script = Script::Handle(
       isolate, Script::New(url_str, source_str, RawScript::kSourceTag));
+  script.SetLocationOffset(line_offset, column_offset);
   Dart_Handle result;
   CompileSource(isolate, lib, script, &result);
   return result;
@@ -5212,6 +5264,7 @@
 
     const Object& res =
         Object::Handle(isolate, DartEntry::InvokeFunction(function, args));
+    isolate->object_store()->clear_pending_deferred_loads();
     if (res.IsError() || res.IsUnhandledException()) {
       return Api::NewHandle(isolate, res.raw());
     }
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 6032692..15687371 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -3870,7 +3870,7 @@
   // Load imported lib.
   Dart_Handle url = NewString("library_url");
   Dart_Handle source = NewString(kImportedScriptChars);
-  Dart_Handle imported_lib = Dart_LoadLibrary(url, source);
+  Dart_Handle imported_lib = Dart_LoadLibrary(url, source, 0, 0);
   Dart_Handle prefix = NewString("");
   EXPECT_VALID(imported_lib);
   Dart_Handle result = Dart_LibraryImportLibrary(lib, imported_lib, prefix);
@@ -5227,13 +5227,13 @@
   // Load lib1
   Dart_Handle url = NewString("library1_url");
   Dart_Handle source = NewString(kLibrary1Chars);
-  Dart_Handle lib1 = Dart_LoadLibrary(url, source);
+  Dart_Handle lib1 = Dart_LoadLibrary(url, source, 0, 0);
   EXPECT_VALID(lib1);
 
   // Load lib2
   url = NewString("library2_url");
   source = NewString(kLibrary2Chars);
-  Dart_Handle lib2 = Dart_LoadLibrary(url, source);
+  Dart_Handle lib2 = Dart_LoadLibrary(url, source, 0, 0);
   EXPECT_VALID(lib2);
 
   // Import lib2 from lib1
@@ -5903,7 +5903,7 @@
 
   url = NewString("library1_dart");
   source = NewString(kLibrary1Chars);
-  result = Dart_LoadLibrary(url, source);
+  result = Dart_LoadLibrary(url, source, 0, 0);
   EXPECT_VALID(result);
 
   result = Dart_LookupLibrary(url);
@@ -5937,7 +5937,7 @@
       "library library1_name;";
   Dart_Handle url = NewString("library1_url");
   Dart_Handle source = NewString(kLibrary1Chars);
-  Dart_Handle lib = Dart_LoadLibrary(url, source);
+  Dart_Handle lib = Dart_LoadLibrary(url, source, 0, 0);
   Dart_Handle error = Dart_NewApiError("incoming error");
   EXPECT_VALID(lib);
 
@@ -5969,7 +5969,7 @@
       "library library1_name;";
   Dart_Handle url = NewString("library1_url");
   Dart_Handle source = NewString(kLibrary1Chars);
-  Dart_Handle lib = Dart_LoadLibrary(url, source);
+  Dart_Handle lib = Dart_LoadLibrary(url, source, 0, 0);
   Dart_Handle error = Dart_NewApiError("incoming error");
   EXPECT_VALID(lib);
   intptr_t libraryId = -1;
@@ -6006,7 +6006,7 @@
       "library library1_name;";
   Dart_Handle url = NewString("library1_url");
   Dart_Handle source = NewString(kLibrary1Chars);
-  Dart_Handle lib = Dart_LoadLibrary(url, source);
+  Dart_Handle lib = Dart_LoadLibrary(url, source, 0, 0);
   Dart_Handle error = Dart_NewApiError("incoming error");
   EXPECT_VALID(lib);
 
@@ -6050,7 +6050,7 @@
 
   Dart_Handle url = NewString("library_url");
   Dart_Handle source = NewString(kLibraryChars);
-  Dart_Handle lib = Dart_LoadLibrary(url, source);
+  Dart_Handle lib = Dart_LoadLibrary(url, source, 0, 0);
   EXPECT_VALID(lib);
   Dart_Handle result = Dart_FinalizeLoading(false);
   EXPECT_VALID(result);
@@ -6103,7 +6103,7 @@
   // Get the functions from a library.
   Dart_Handle url = NewString("library_url");
   Dart_Handle source = NewString(kLibraryChars);
-  Dart_Handle lib = Dart_LoadLibrary(url, source);
+  Dart_Handle lib = Dart_LoadLibrary(url, source, 0, 0);
   EXPECT_VALID(lib);
   Dart_Handle result = Dart_FinalizeLoading(false);
   EXPECT_VALID(result);
@@ -6155,12 +6155,12 @@
 
   Dart_Handle url = NewString("library1_url");
   Dart_Handle source = NewString(kLibrary1Chars);
-  Dart_Handle lib1 = Dart_LoadLibrary(url, source);
+  Dart_Handle lib1 = Dart_LoadLibrary(url, source, 0, 0);
   EXPECT_VALID(lib1);
 
   url = NewString("library2_url");
   source = NewString(kLibrary2Chars);
-  Dart_Handle lib2 = Dart_LoadLibrary(url, source);
+  Dart_Handle lib2 = Dart_LoadLibrary(url, source, 0, 0);
   EXPECT_VALID(lib2);
 
   result = Dart_LibraryImportLibrary(Dart_Null(), lib2, Dart_Null());
@@ -6206,7 +6206,7 @@
       "int bar() => 42;";
   Dart_Handle url1 = NewString("library1_url");
   Dart_Handle source1 = NewString(kLibrary1Chars);
-  Dart_Handle lib1 = Dart_LoadLibrary(url1, source1);
+  Dart_Handle lib1 = Dart_LoadLibrary(url1, source1, 0, 0);
   EXPECT_VALID(lib1);
   EXPECT(Dart_IsLibrary(lib1));
 
@@ -6215,7 +6215,7 @@
       "int foobar() => foo.bar();";
   Dart_Handle url2 = NewString("library2_url");
   Dart_Handle source2 = NewString(kLibrary2Chars);
-  Dart_Handle lib2 = Dart_LoadLibrary(url2, source2);
+  Dart_Handle lib2 = Dart_LoadLibrary(url2, source2, 0, 0);
   EXPECT_VALID(lib2);
   EXPECT(Dart_IsLibrary(lib2));
 
@@ -6252,42 +6252,42 @@
   Dart_Handle url = NewString("library1_url");
   Dart_Handle source = NewString(kLibrary1Chars);
 
-  result = Dart_LoadLibrary(Dart_Null(), source);
+  result = Dart_LoadLibrary(Dart_Null(), source, 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ("Dart_LoadLibrary expects argument 'url' to be non-null.",
                Dart_GetError(result));
 
-  result = Dart_LoadLibrary(Dart_True(), source);
+  result = Dart_LoadLibrary(Dart_True(), source, 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ("Dart_LoadLibrary expects argument 'url' to be of type String.",
                Dart_GetError(result));
 
-  result = Dart_LoadLibrary(error, source);
+  result = Dart_LoadLibrary(error, source, 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ("incoming error", Dart_GetError(result));
 
-  result = Dart_LoadLibrary(url, Dart_Null());
+  result = Dart_LoadLibrary(url, Dart_Null(), 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ("Dart_LoadLibrary expects argument 'source' to be non-null.",
                Dart_GetError(result));
 
-  result = Dart_LoadLibrary(url, Dart_True());
+  result = Dart_LoadLibrary(url, Dart_True(), 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ(
       "Dart_LoadLibrary expects argument 'source' to be of type String.",
       Dart_GetError(result));
 
-  result = Dart_LoadLibrary(url, error);
+  result = Dart_LoadLibrary(url, error, 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ("incoming error", Dart_GetError(result));
 
   // Success.
-  result = Dart_LoadLibrary(url, source);
+  result = Dart_LoadLibrary(url, source, 0, 0);
   EXPECT_VALID(result);
   EXPECT(Dart_IsLibrary(result));
 
   // Duplicate library load fails.
-  result = Dart_LoadLibrary(url, source);
+  result = Dart_LoadLibrary(url, source, 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ(
       "Dart_LoadLibrary: library 'library1_url' has already been loaded.",
@@ -6301,7 +6301,7 @@
       ")";
   Dart_Handle url = NewString("library1_url");
   Dart_Handle source = NewString(kLibrary1Chars);
-  Dart_Handle result = Dart_LoadLibrary(url, source);
+  Dart_Handle result = Dart_LoadLibrary(url, source, 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT(strstr(Dart_GetError(result), "unexpected token ')'"));
 }
@@ -6320,72 +6320,72 @@
   // Load up a library.
   Dart_Handle url = NewString("library1_url");
   Dart_Handle source = NewString(kLibrary1Chars);
-  Dart_Handle lib = Dart_LoadLibrary(url, source);
+  Dart_Handle lib = Dart_LoadLibrary(url, source, 0, 0);
   EXPECT_VALID(lib);
   EXPECT(Dart_IsLibrary(lib));
 
   url = NewString("source_url");
   source = NewString(kSourceChars);
 
-  result = Dart_LoadSource(Dart_Null(), url, source);
+  result = Dart_LoadSource(Dart_Null(), url, source, 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ("Dart_LoadSource expects argument 'library' to be non-null.",
                Dart_GetError(result));
 
-  result = Dart_LoadSource(Dart_True(), url, source);
+  result = Dart_LoadSource(Dart_True(), url, source, 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ(
       "Dart_LoadSource expects argument 'library' to be of type Library.",
       Dart_GetError(result));
 
-  result = Dart_LoadSource(error, url, source);
+  result = Dart_LoadSource(error, url, source, 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ("incoming error", Dart_GetError(result));
 
-  result = Dart_LoadSource(lib, Dart_Null(), source);
+  result = Dart_LoadSource(lib, Dart_Null(), source, 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ("Dart_LoadSource expects argument 'url' to be non-null.",
                Dart_GetError(result));
 
-  result = Dart_LoadSource(lib, Dart_True(), source);
+  result = Dart_LoadSource(lib, Dart_True(), source, 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ("Dart_LoadSource expects argument 'url' to be of type String.",
                Dart_GetError(result));
 
-  result = Dart_LoadSource(lib, error, source);
+  result = Dart_LoadSource(lib, error, source, 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ("incoming error", Dart_GetError(result));
 
-  result = Dart_LoadSource(lib, url, Dart_Null());
+  result = Dart_LoadSource(lib, url, Dart_Null(), 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ("Dart_LoadSource expects argument 'source' to be non-null.",
                Dart_GetError(result));
 
-  result = Dart_LoadSource(lib, url, Dart_True());
+  result = Dart_LoadSource(lib, url, Dart_True(), 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ(
       "Dart_LoadSource expects argument 'source' to be of type String.",
       Dart_GetError(result));
 
-  result = Dart_LoadSource(lib, error, source);
+  result = Dart_LoadSource(lib, error, source, 0, 0);
   EXPECT(Dart_IsError(result));
   EXPECT_STREQ("incoming error", Dart_GetError(result));
 
   // Success.
-  result = Dart_LoadSource(lib, url, source);
+  result = Dart_LoadSource(lib, url, source, 0, 0);
   EXPECT_VALID(result);
   EXPECT(Dart_IsLibrary(result));
   EXPECT(Dart_IdentityEquals(lib, result));
 
   // Duplicate calls are okay.
-  result = Dart_LoadSource(lib, url, source);
+  result = Dart_LoadSource(lib, url, source, 0, 0);
   EXPECT_VALID(result);
   EXPECT(Dart_IsLibrary(result));
   EXPECT(Dart_IdentityEquals(lib, result));
 
   // Language errors are detected.
   source = NewString(kBadSourceChars);
-  result = Dart_LoadSource(lib, url, source);
+  result = Dart_LoadSource(lib, url, source, 0, 0);
   EXPECT(Dart_IsError(result));
 }
 
@@ -6403,7 +6403,7 @@
       "}\n";
   Dart_Handle url = NewString("library1_url");
   Dart_Handle source = NewString(kLibrary1Chars);
-  Dart_Handle lib = Dart_LoadLibrary(url, source);
+  Dart_Handle lib = Dart_LoadLibrary(url, source, 0, 0);
   EXPECT_VALID(lib);
   EXPECT(Dart_IsLibrary(lib));
   Dart_Handle result = Dart_FinalizeLoading(false);
@@ -6423,7 +6423,7 @@
   // Load a source file late.
   url = NewString("source_url");
   source = NewString(kSourceChars);
-  EXPECT_VALID(Dart_LoadSource(lib, url, source));
+  EXPECT_VALID(Dart_LoadSource(lib, url, source, 0, 0));
   result = Dart_FinalizeLoading(false);
   EXPECT_VALID(result);
 
@@ -6452,14 +6452,14 @@
   // Load up a library.
   Dart_Handle url = NewString("library1_url");
   Dart_Handle source = NewString(kLibrary1Chars);
-  Dart_Handle lib = Dart_LoadLibrary(url, source);
+  Dart_Handle lib = Dart_LoadLibrary(url, source, 0, 0);
   EXPECT_VALID(lib);
   EXPECT(Dart_IsLibrary(lib));
 
   url = NewString("source_url");
   source = NewString(kSourceChars);
 
-  Dart_Handle result = Dart_LoadSource(lib, url, source);
+  Dart_Handle result = Dart_LoadSource(lib, url, source, 0, 0);
   EXPECT_VALID(result);
 
   url = NewString("patch_url");
@@ -6584,7 +6584,7 @@
 
   Dart_Handle url = NewString("theLibrary");
   Dart_Handle source = NewString(kLibraryChars);
-  result = Dart_LoadLibrary(url, source);
+  result = Dart_LoadLibrary(url, source, 0, 0);
   EXPECT_VALID(result);
 
   const char* patchNames[] = { "main library patch",
@@ -6808,11 +6808,11 @@
 
   url = NewString("library1_dart");
   source = NewString(kLibrary1Chars);
-  Dart_LoadLibrary(url, source);
+  Dart_LoadLibrary(url, source, 0, 0);
 
   url = NewString("library2_dart");
   source = NewString(kLibrary2Chars);
-  Dart_LoadLibrary(url, source);
+  Dart_LoadLibrary(url, source, 0, 0);
 
   Dart_FinalizeLoading(false);
 
@@ -6847,11 +6847,11 @@
 
   url = NewString("library2_dart");
   source = NewString(kLibrary2Chars);
-  Dart_LoadLibrary(url, source);
+  Dart_LoadLibrary(url, source, 0, 0);
 
   url = NewString("library1_dart");
   source = NewString(kLibrary1Chars);
-  Dart_LoadLibrary(url, source);
+  Dart_LoadLibrary(url, source, 0, 0);
   result = Dart_FinalizeLoading(false);
   EXPECT_VALID(result);
 
@@ -6886,11 +6886,11 @@
 
   url = NewString("library2_dart");
   source = NewString(kLibrary2Chars);
-  Dart_LoadLibrary(url, source);
+  Dart_LoadLibrary(url, source, 0, 0);
 
   url = NewString("library1_dart");
   source = NewString(kLibrary1Chars);
-  Dart_LoadLibrary(url, source);
+  Dart_LoadLibrary(url, source, 0, 0);
   Dart_FinalizeLoading(false);
 
   result = Dart_Invoke(result, NewString("main"), 0, NULL);
@@ -6921,7 +6921,7 @@
 
   url = NewString("lib.dart");
   source = NewString(kLibraryChars);
-  Dart_LoadLibrary(url, source);
+  Dart_LoadLibrary(url, source, 0, 0);
   Dart_FinalizeLoading(false);
 
   result = Dart_Invoke(result, NewString("main"), 0, NULL);
@@ -8400,7 +8400,7 @@
 
   Dart_Handle source = NewString(kLoadSecond);
   Dart_Handle url = NewString(TestCase::url());
-  Dart_LoadSource(TestCase::lib(), url, source);
+  Dart_LoadSource(TestCase::lib(), url, source, 0, 0);
   result = Dart_FinalizeLoading(false);
   EXPECT_VALID(result);
 
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index c1391a5..1ed3383 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -28,7 +28,6 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, enable_debugger, true, "Enables debugger step checks");
 DEFINE_FLAG(bool, show_invisible_frames, false,
             "Show invisible frames in debugger stack traces");
 DEFINE_FLAG(bool, trace_debugger_stacktrace, false,
@@ -144,7 +143,8 @@
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", "Breakpoint");
 
-  jsobj.AddProperty("id", id());
+  jsobj.AddPropertyF("id", "debug/breakpoints/%" Pd "", id());
+  jsobj.AddProperty("breakpointNumber", id());
   jsobj.AddProperty("enabled", IsEnabled());
   jsobj.AddProperty("resolved", IsResolved());
 
@@ -155,9 +155,7 @@
   {
     JSONObject location(&jsobj, "location");
     location.AddProperty("type", "Location");
-
-    const String& url = String::Handle(script.url());
-    location.AddProperty("script", url.ToCString());
+    location.AddProperty("script", script);
     location.AddProperty("tokenPos", token_pos);
   }
 }
@@ -529,7 +527,8 @@
   jsobj.AddProperty("id", "");
   jsobj.AddProperty("eventType", EventTypeToCString(type()));
   jsobj.AddProperty("isolate", isolate());
-  if (type() == kBreakpointResolved || type() == kBreakpointReached) {
+  if ((type() == kBreakpointResolved || type() == kBreakpointReached) &&
+      breakpoint() != NULL) {
     jsobj.AddProperty("breakpoint", breakpoint());
   }
   if (type() == kExceptionThrown) {
@@ -2133,7 +2132,7 @@
     prefix_name = prefix.name();
     ASSERT(!prefix_name.IsNull());
     prefix_name = String::Concat(prefix_name, Symbols::Dot());
-    for (intptr_t i = 0; i < prefix.num_imports(); i++) {
+    for (int32_t i = 0; i < prefix.num_imports(); i++) {
       imported = prefix.GetLibrary(i);
       CollectLibraryFields(field_list, imported, prefix_name, false);
     }
@@ -2205,6 +2204,9 @@
   if (!IsDebuggableFunctionKind(func)) {
     return false;
   }
+  if (Service::IsRunning()) {
+    return true;
+  }
   const Class& cls = Class::Handle(func.Owner());
   const Library& lib = Library::Handle(cls.library());
   return lib.IsDebuggable();
@@ -2481,10 +2483,18 @@
       } else {
         prev_bpt->set_next(curr_bpt->next());
       }
+
       // Remove references from code breakpoints to this source breakpoint,
       // and disable the code breakpoints.
       UnlinkCodeBreakpoints(curr_bpt);
       delete curr_bpt;
+
+      // Remove references from the current debugger pause event.
+      if (pause_event_ != NULL &&
+          pause_event_->type() == DebuggerEvent::kBreakpointReached &&
+          pause_event_->breakpoint() == curr_bpt) {
+        pause_event_->set_breakpoint(NULL);
+      }
       return;
     }
     prev_bpt = curr_bpt;
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index 51b1ddb..90dd1c0 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -350,6 +350,8 @@
 
   // Set breakpoint at closest location to function entry.
   SourceBreakpoint* SetBreakpointAtEntry(const Function& target_function);
+
+  // TODO(turnidge): script_url may no longer be specific enough.
   SourceBreakpoint* SetBreakpointAtLine(const String& script_url,
                                         intptr_t line_number);
   void OneTimeBreakAtEntry(const Function& target_function);
diff --git a/runtime/vm/debugger_api_impl.cc b/runtime/vm/debugger_api_impl.cc
index bba0434..1822de7 100644
--- a/runtime/vm/debugger_api_impl.cc
+++ b/runtime/vm/debugger_api_impl.cc
@@ -916,7 +916,7 @@
     prefix_name = prefix.name();
     ASSERT(!prefix_name.IsNull());
     prefix_name = String::Concat(prefix_name, Symbols::Dot());
-    for (int i = 0; i < prefix.num_imports(); i++) {
+    for (int32_t i = 0; i < prefix.num_imports(); i++) {
       imported = prefix.GetLibrary(i);
       import_list.Add(prefix_name);
       import_list.Add(Smi::Handle(Smi::New(imported.index())));
diff --git a/runtime/vm/debugger_test.cc b/runtime/vm/debugger_test.cc
index d9c508b..e53f291 100644
--- a/runtime/vm/debugger_test.cc
+++ b/runtime/vm/debugger_test.cc
@@ -2,11 +2,34 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#include "vm/dart_api_impl.h"
 #include "vm/debugger.h"
 #include "vm/unit_test.h"
 
 namespace dart {
 
+// Search for the formatted string in buffer.
+//
+// TODO(turnidge): This function obscures the line number of failing
+// EXPECTs.  Rework this.
+static void ExpectSubstringF(const char* buff, const char* fmt, ...) {
+  Isolate* isolate = Isolate::Current();
+
+  va_list args;
+  va_start(args, fmt);
+  intptr_t len = OS::VSNPrint(NULL, 0, fmt, args);
+  va_end(args);
+
+  char* buffer = isolate->current_zone()->Alloc<char>(len + 1);
+  va_list args2;
+  va_start(args2, fmt);
+  OS::VSNPrint(buffer, (len + 1), fmt, args2);
+  va_end(args2);
+
+  EXPECT_SUBSTRING(buffer, buff);
+}
+
+
 TEST_CASE(Debugger_PrintBreakpointsToJSONArray) {
   const char* kScriptChars =
       "main() {\n"
@@ -17,6 +40,9 @@
       "}\n";
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   EXPECT_VALID(lib);
+  Library& vmlib = Library::Handle();
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
 
   Isolate* isolate = Isolate::Current();
   Debugger* debugger = isolate->debugger();
@@ -41,16 +67,23 @@
       JSONArray jsarr(&js);
       debugger->PrintBreakpointsToJSONArray(&jsarr);
     }
-    EXPECT_STREQ(
-       "[{\"type\":\"Breakpoint\",\"id\":2,"
-         "\"enabled\":true,\"resolved\":false,"
-         "\"location\":{\"type\":\"Location\","
-                       "\"script\":\"test-lib\",\"tokenPos\":14}},"
-        "{\"type\":\"Breakpoint\",\"id\":1,"
-         "\"enabled\":true,\"resolved\":false,"
-         "\"location\":{\"type\":\"Location\","
-                       "\"script\":\"test-lib\",\"tokenPos\":5}}]",
-       js.ToCString());
+    ExpectSubstringF(
+        js.ToCString(),
+        "[{\"type\":\"Breakpoint\",\"id\":\"debug\\/breakpoints\\/2\","
+        "\"breakpointNumber\":2,\"enabled\":true,\"resolved\":false,"
+        "\"location\":{\"type\":\"Location\","
+        "\"script\":{\"type\":\"@Script\","
+        "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
+        "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+        "\"kind\":\"script\"},\"tokenPos\":14}},"
+        "{\"type\":\"Breakpoint\",\"id\":\"debug\\/breakpoints\\/1\","
+        "\"breakpointNumber\":1,\"enabled\":true,\"resolved\":false,"
+        "\"location\":{\"type\":\"Location\","
+        "\"script\":{\"type\":\"@Script\","
+        "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
+        "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+        "\"kind\":\"script\"},\"tokenPos\":5}}]",
+        vmlib.index(), vmlib.index());
   }
 }
 
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index b5dba4e..cacb2fb 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -38,7 +38,6 @@
 DEFINE_FLAG(bool, trace_type_check_elimination, false,
             "Trace type check elimination at compile time.");
 
-DECLARE_FLAG(bool, enable_debugger);
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, warn_on_javascript_compatibility);
@@ -1013,8 +1012,7 @@
   // No debugger check is done in native functions or for return
   // statements for which there is no associated source position.
   const Function& function = owner()->parsed_function()->function();
-  if ((node->token_pos() != Scanner::kNoSourcePos) &&
-      !function.is_native() && FLAG_enable_debugger) {
+  if ((node->token_pos() != Scanner::kNoSourcePos) && !function.is_native()) {
     AddInstruction(new(I) DebugStepCheckInstr(node->token_pos(),
                                               RawPcDescriptors::kRuntimeCall));
   }
@@ -3118,10 +3116,8 @@
   // call.
   if (node->value()->IsLiteralNode() ||
       node->value()->IsLoadLocalNode()) {
-    if (FLAG_enable_debugger) {
-      AddInstruction(new(I) DebugStepCheckInstr(
-          node->token_pos(), RawPcDescriptors::kRuntimeCall));
-    }
+    AddInstruction(new(I) DebugStepCheckInstr(
+        node->token_pos(), RawPcDescriptors::kRuntimeCall));
   }
 
   ValueGraphVisitor for_value(owner());
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index de1786b..fa4d6e5 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -833,7 +833,6 @@
     intptr_t deopt_id,
     intptr_t token_pos,
     intptr_t argument_count,
-    const Array& argument_names,
     LocationSummary* locs,
     const ICData& ic_data) {
   ASSERT(!ic_data.IsNull());
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index efb8804..5ce839c 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -335,7 +335,6 @@
   void GenerateInstanceCall(intptr_t deopt_id,
                             intptr_t token_pos,
                             intptr_t argument_count,
-                            const Array& argument_names,
                             LocationSummary* locs,
                             const ICData& ic_data);
 
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 929485f..56539af 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -1609,14 +1609,25 @@
       __ LoadObject(destination.reg(), constant);
     } else if (destination.IsFpuRegister()) {
       const DRegister dst = EvenDRegisterOf(destination.fpu_reg());
-      __ LoadObject(TMP, constant);
-      __ AddImmediate(TMP, TMP, Double::value_offset() - kHeapObjectTag);
-      __ vldrd(dst, Address(TMP, 0));
+      if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0) &&
+          TargetCPUFeatures::neon_supported()) {
+        QRegister qdst = destination.fpu_reg();
+        __ veorq(qdst, qdst, qdst);
+      } else {
+        __ LoadObject(TMP, constant);
+        __ AddImmediate(TMP, TMP, Double::value_offset() - kHeapObjectTag);
+        __ vldrd(dst, Address(TMP, 0));
+      }
     } else if (destination.IsDoubleStackSlot()) {
+      if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0) &&
+          TargetCPUFeatures::neon_supported()) {
+        __ veorq(QTMP, QTMP, QTMP);
+      } else {
+        __ LoadObject(TMP, constant);
+        __ AddImmediate(TMP, TMP, Double::value_offset() - kHeapObjectTag);
+        __ vldrd(DTMP, Address(TMP, 0));
+      }
       const intptr_t dest_offset = destination.ToStackSlotOffset();
-      __ LoadObject(TMP, constant);
-      __ AddImmediate(TMP, TMP, Double::value_offset() - kHeapObjectTag);
-      __ vldrd(DTMP, Address(TMP, 0));
       __ StoreDToOffset(DTMP, FP, dest_offset);
     } else {
       ASSERT(destination.IsStackSlot());
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index 72c14bd..90fbd1c 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -1585,12 +1585,20 @@
       __ LoadObject(destination.reg(), constant, PP);
     } else if (destination.IsFpuRegister()) {
       const VRegister dst = destination.fpu_reg();
-      __ LoadObject(TMP, constant, PP);
-      __ LoadDFieldFromOffset(dst, TMP, Double::value_offset(), PP);
+      if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0)) {
+        __ veor(dst, dst, dst);
+      } else {
+        __ LoadObject(TMP, constant, PP);
+        __ LoadDFieldFromOffset(dst, TMP, Double::value_offset(), PP);
+      }
     } else if (destination.IsDoubleStackSlot()) {
+      if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0)) {
+        __ veor(VTMP, VTMP, VTMP);
+      } else {
+        __ LoadObject(TMP, constant, PP);
+        __ LoadDFieldFromOffset(VTMP, TMP, Double::value_offset(), PP);
+      }
       const intptr_t dest_offset = destination.ToStackSlotOffset();
-      __ LoadObject(TMP, constant, PP);
-      __ LoadDFieldFromOffset(VTMP, TMP, Double::value_offset(), PP);
       __ StoreDToOffset(VTMP, FP, dest_offset, PP);
     } else {
       ASSERT(destination.IsStackSlot());
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 419f293..29b006a 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -1594,6 +1594,8 @@
         __ movsd(destination.fpu_reg(),
             FieldAddress(EAX, Double::value_offset()));
         __ popl(EAX);
+      } else if (Utils::DoublesBitEqual(constant.value(), 0.0)) {
+        __ xorps(destination.fpu_reg(), destination.fpu_reg());
       } else {
         __ movsd(destination.fpu_reg(), Address::Absolute(addr));
       }
@@ -1605,6 +1607,8 @@
         __ LoadObject(EAX, constant);
         __ movsd(XMM0, FieldAddress(EAX, Double::value_offset()));
         __ popl(EAX);
+      } else if (Utils::DoublesBitEqual(constant.value(), 0.0)) {
+        __ xorps(XMM0, XMM0);
       } else {
         __ movsd(XMM0, Address::Absolute(addr));
       }
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 37e6aab..d11ec6a 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -1579,12 +1579,20 @@
         __ LoadObject(destination.reg(), constant, PP);
       }
     } else if (destination.IsFpuRegister()) {
-      __ LoadObject(TMP, constant, PP);
-      __ movsd(destination.fpu_reg(),
-          FieldAddress(TMP, Double::value_offset()));
+      if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0)) {
+        __ xorps(destination.fpu_reg(), destination.fpu_reg());
+      } else {
+        __ LoadObject(TMP, constant, PP);
+        __ movsd(destination.fpu_reg(),
+            FieldAddress(TMP, Double::value_offset()));
+      }
     } else if (destination.IsDoubleStackSlot()) {
-      __ LoadObject(TMP, constant, PP);
-      __ movsd(XMM0, FieldAddress(TMP, Double::value_offset()));
+      if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0)) {
+        __ xorps(XMM0, XMM0);
+      } else {
+        __ LoadObject(TMP, constant, PP);
+        __ movsd(XMM0, FieldAddress(TMP, Double::value_offset()));
+      }
       __ movsd(destination.ToStackSlotAddress(), XMM0);
     } else {
       ASSERT(destination.IsStackSlot());
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 10bbbad..cf16ff9 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -1659,9 +1659,8 @@
   intptr_t deopt_id = Isolate::kNoDeoptId;
   if ((array_cid == kTypedDataInt32ArrayCid) ||
       (array_cid == kTypedDataUint32ArrayCid)) {
-    // Prevent excessive deoptimization, assume full 32 bits used, and therefore
-    // generate Mint on 32-bit architectures.
-    deopt_id = (kSmiBits < 32) ? Isolate::kNoDeoptId : call->deopt_id();
+    // Deoptimization may be needed if result does not always fit in a Smi.
+    deopt_id = (kSmiBits >= 32) ? Isolate::kNoDeoptId : call->deopt_id();
   }
 
   // Array load and return.
@@ -3555,9 +3554,8 @@
   intptr_t deopt_id = Isolate::kNoDeoptId;
   if ((array_cid == kTypedDataInt32ArrayCid) ||
       (array_cid == kTypedDataUint32ArrayCid)) {
-    // Prevent excessive deoptimization, assume full 32 bits used, and therefore
-    // generate Mint on 32-bit architectures.
-    deopt_id = (kSmiBits < 32) ? Isolate::kNoDeoptId : call->deopt_id();
+    // Deoptimization may be needed if result does not always fit in a Smi.
+    deopt_id = (kSmiBits >= 32) ? Isolate::kNoDeoptId : call->deopt_id();
   }
 
   *last = new(I) LoadIndexedInstr(new(I) Value(array),
diff --git a/runtime/vm/globals.h b/runtime/vm/globals.h
index 4310a7c..f9a5d27 100644
--- a/runtime/vm/globals.h
+++ b/runtime/vm/globals.h
@@ -51,8 +51,8 @@
   (reinterpret_cast<intptr_t>(&(reinterpret_cast<type*>(kOffsetOfPtr)->field)) \
       - kOffsetOfPtr)
 
-#define OFFSET_OF_RETURNED_VALUE(type, accessor)                            \
-  (reinterpret_cast<intptr_t>(                                              \
+#define OFFSET_OF_RETURNED_VALUE(type, accessor)                               \
+  (reinterpret_cast<intptr_t>(                                                 \
       (reinterpret_cast<type*>(kOffsetOfPtr)->accessor())) - kOffsetOfPtr)
 
 
diff --git a/runtime/vm/hash_table.h b/runtime/vm/hash_table.h
index 903ea29..8e6369f9d 100644
--- a/runtime/vm/hash_table.h
+++ b/runtime/vm/hash_table.h
@@ -43,16 +43,21 @@
 //
 // The classes all wrap an Array handle, and metods like HashSet::Insert can
 // trigger growth into a new RawArray, updating the handle. Debug mode asserts
-// that 'Release' was called to get the final RawArray before destruction.
+// that 'Release' was called once to access the final array before destruction.
 //
 // Example use:
-//  typedef UnorderedHashMap<FooTraits> ResolvedNamesMap;
+//  typedef UnorderedHashMap<FooTraits> FooMap;
 //  ...
-//  ResolvedNamesMap cache(Array::Handle(resolved_names()));
+//  FooMap cache(get_foo_cache());
 //  cache.UpdateOrInsert(name0, obj0);
 //  cache.UpdateOrInsert(name1, obj1);
 //  ...
-//  StorePointer(&raw_ptr()->resolved_names_, cache.Release());
+//  set_foo_cache(cache.Release());
+//
+// If you *know* that no mutating operations were called, you can optimize:
+//  ...
+//  obj ^= cache.GetOrNull(name);
+//  ASSERT(cache.Release().raw() == get_foo_cache());
 //
 // TODO(koda): When exposing these to Dart code, document and assert that
 // KeyTraits methods must not run Dart code (since the C++ code doesn't check
@@ -78,17 +83,26 @@
 template<typename KeyTraits, intptr_t kPayloadSize, intptr_t kMetaDataSize>
 class HashTable : public ValueObject {
  public:
-  explicit HashTable(Array& data) : data_(data) {}
+  typedef KeyTraits Traits;
+  // Uses 'isolate' for handle allocation. 'Release' must be called at the end
+  // to obtain the final table after potential growth/shrinkage.
+  HashTable(Isolate* isolate, RawArray* data)
+      : isolate_(isolate), data_(&Array::Handle(isolate_, data)) {}
+  // Like above, except uses current isolate.
+  explicit HashTable(RawArray* data)
+      : isolate_(Isolate::Current()), data_(&Array::Handle(isolate_, data)) {}
 
-  RawArray* Release() {
-    ASSERT(!data_.IsNull());
-    RawArray* array = data_.raw();
-    data_ = Array::null();
-    return array;
+  Array& Release() {
+    ASSERT(data_ != NULL);
+    Array* result = data_;
+    // Ensure that no methods are called after 'Release'.
+    data_ = NULL;
+    return *result;
   }
 
   ~HashTable() {
-    ASSERT(data_.IsNull());
+    // Ensure that 'Release' was called.
+    ASSERT(data_ == NULL);
   }
 
   // Returns a backing storage size such that 'num_occupied' distinct keys can
@@ -102,12 +116,12 @@
 
   // Initializes an empty table.
   void Initialize() const {
-    ASSERT(data_.Length() >= ArrayLengthForNumOccupied(0));
-    Smi& zero = Smi::Handle(Smi::New(0));
-    data_.SetAt(kOccupiedEntriesIndex, zero);
-    data_.SetAt(kDeletedEntriesIndex, zero);
-    for (intptr_t i = kHeaderSize; i < data_.Length(); ++i) {
-      data_.SetAt(i, Object::sentinel());
+    ASSERT(data_->Length() >= ArrayLengthForNumOccupied(0));
+    Smi& zero = Smi::Handle(isolate(), Smi::New(0));
+    data_->SetAt(kOccupiedEntriesIndex, zero);
+    data_->SetAt(kDeletedEntriesIndex, zero);
+    for (intptr_t i = kHeaderSize; i < data_->Length(); ++i) {
+      data_->SetAt(i, Object::sentinel());
     }
   }
 
@@ -123,7 +137,7 @@
     ASSERT(NumOccupied() < NumEntries());
     // TODO(koda): Add salt.
     intptr_t probe = static_cast<uword>(KeyTraits::Hash(key)) % NumEntries();
-    Object& obj = Object::Handle();
+    Object& obj = Object::Handle(isolate());
     // TODO(koda): Consider quadratic probing.
     for (; ; probe = (probe + 1) % NumEntries()) {
       if (IsUnused(probe)) {
@@ -150,7 +164,7 @@
     ASSERT(entry != NULL);
     ASSERT(NumOccupied() < NumEntries());
     intptr_t probe = static_cast<uword>(KeyTraits::Hash(key)) % NumEntries();
-    Object& obj = Object::Handle();
+    Object& obj = Object::Handle(isolate());
     intptr_t deleted = -1;
     // TODO(koda): Consider quadratic probing.
     for (; ; probe = (probe + 1) % NumEntries()) {
@@ -204,14 +218,14 @@
   }
   RawObject* GetPayload(intptr_t entry, intptr_t component) const {
     ASSERT(IsOccupied(entry));
-    return data_.At(PayloadIndex(entry, component));
+    return data_->At(PayloadIndex(entry, component));
   }
   void UpdatePayload(intptr_t entry,
                      intptr_t component,
                      const Object& value) const {
     ASSERT(IsOccupied(entry));
     ASSERT(0 <= component && component < kPayloadSize);
-    data_.SetAt(PayloadIndex(entry, component), value);
+    data_->SetAt(PayloadIndex(entry, component), value);
   }
   // Deletes both the key and payload of the specified entry.
   void DeleteEntry(intptr_t entry) const {
@@ -224,7 +238,7 @@
     AdjustSmiValueAt(kDeletedEntriesIndex, 1);
   }
   intptr_t NumEntries() const {
-    return (data_.Length() - kFirstKeyIndex) / kEntrySize;
+    return (data_->Length() - kFirstKeyIndex) / kEntrySize;
   }
   intptr_t NumUnused() const {
     return NumEntries() - NumOccupied() - NumDeleted();
@@ -255,28 +269,33 @@
   }
 
   RawObject* InternalGetKey(intptr_t entry) const {
-    return data_.At(KeyIndex(entry));
+    return data_->At(KeyIndex(entry));
   }
 
   void InternalSetKey(intptr_t entry, const Object& key) const {
-    data_.SetAt(KeyIndex(entry), key);
+    data_->SetAt(KeyIndex(entry), key);
   }
 
   intptr_t GetSmiValueAt(intptr_t index) const {
-    ASSERT(Object::Handle(data_.At(index)).IsSmi());
-    return Smi::Value(Smi::RawCast(data_.At(index)));
+    ASSERT(Object::Handle(isolate(), data_->At(index)).IsSmi());
+    return Smi::Value(Smi::RawCast(data_->At(index)));
   }
 
   void SetSmiValueAt(intptr_t index, intptr_t value) const {
-    const Smi& smi = Smi::Handle(Smi::New(value));
-    data_.SetAt(index, smi);
+    const Smi& smi = Smi::Handle(isolate(), Smi::New(value));
+    data_->SetAt(index, smi);
   }
 
   void AdjustSmiValueAt(intptr_t index, intptr_t delta) const {
     SetSmiValueAt(index, (GetSmiValueAt(index) + delta));
   }
 
-  Array& data_;
+  Isolate* isolate() const { return isolate_; }
+
+  Isolate* isolate_;
+  // This is a pointer rather than a reference, to enable Release nulling it,
+  // preventing post-Release modification.
+  Array* data_;
 
   friend class HashTables;
 };
@@ -288,7 +307,9 @@
  public:
   typedef HashTable<KeyTraits, kUserPayloadSize, 0> BaseTable;
   static const intptr_t kPayloadSize = kUserPayloadSize;
-  explicit UnorderedHashTable(Array& data) : BaseTable(data) {}
+  explicit UnorderedHashTable(RawArray* data) : BaseTable(data) {}
+  UnorderedHashTable(Isolate* isolate, RawArray* data)
+      : BaseTable(isolate, data) {}
   // Note: Does not check for concurrent modification.
   class Iterator {
    public:
@@ -325,7 +346,9 @@
   typedef HashTable<KeyTraits, kUserPayloadSize + 1, 1> BaseTable;
   static const intptr_t kPayloadSize = kUserPayloadSize;
   static const intptr_t kNextEnumIndex = BaseTable::kMetaDataIndex;
-  explicit EnumIndexHashTable(Array& data) : BaseTable(data) {}
+  EnumIndexHashTable(Isolate* isolate, RawArray* data)
+      : BaseTable(isolate, data) {}
+  explicit EnumIndexHashTable(RawArray* data) : BaseTable(data) {}
   // Note: Does not check for concurrent modification.
   class Iterator {
    public:
@@ -368,8 +391,8 @@
 
   void InsertKey(intptr_t entry, const Object& key) const {
     BaseTable::InsertKey(entry, key);
-    const Smi& next_enum_index =
-        Smi::Handle(Smi::New(BaseTable::GetSmiValueAt(kNextEnumIndex)));
+    const Smi& next_enum_index = Smi::Handle(BaseTable::isolate(),
+        Smi::New(BaseTable::GetSmiValueAt(kNextEnumIndex)));
     BaseTable::UpdatePayload(entry, kPayloadSize, next_enum_index);
     // TODO(koda): Handle possible Smi overflow from repeated insert/delete.
     BaseTable::AdjustSmiValueAt(kNextEnumIndex, 1);
@@ -385,10 +408,10 @@
   template<typename Table>
   static RawArray* New(intptr_t initial_capacity,
                        Heap::Space space = Heap::kNew) {
-    Table table(Array::Handle(Array::New(
-        Table::ArrayLengthForNumOccupied(initial_capacity), space)));
+    Table table(Array::New(
+        Table::ArrayLengthForNumOccupied(initial_capacity), space));
     table.Initialize();
-    return table.Release();
+    return table.Release().raw();
   }
 
   // Clears 'to' and inserts all elements from 'from', in iteration order.
@@ -424,9 +447,11 @@
     }
     double target = (low + high) / 2.0;
     intptr_t new_capacity = (1 + table.NumOccupied()) / target;
-    Table new_table(Array::Handle(New<Table>(new_capacity)));
+    Table new_table(New<Table>(
+        new_capacity,
+        table.data_->IsOld() ? Heap::kOld : Heap::kNew));
     Copy(table, new_table);
-    table.data_ = new_table.Release();
+    *table.data_ = new_table.Release().raw();
   }
 
   // Serializes a table by concatenating its entries as an array.
@@ -456,7 +481,8 @@
 template<typename BaseIterTable>
 class HashMap : public BaseIterTable {
  public:
-  explicit HashMap(Array& data) : BaseIterTable(data) {}
+  explicit HashMap(RawArray* data) : BaseIterTable(data) {}
+  HashMap(Isolate* isolate, RawArray* data) : BaseIterTable(isolate, data) {}
   template<typename Key>
   RawObject* GetOrNull(const Key& key, bool* present = NULL) const {
     intptr_t entry = BaseIterTable::FindKey(key);
@@ -466,7 +492,7 @@
     return (entry == -1) ? Object::null() : BaseIterTable::GetPayload(entry, 0);
   }
   bool UpdateOrInsert(const Object& key, const Object& value) const {
-    HashTables::EnsureLoadFactor(0.0, 0.75, *this);
+    EnsureCapacity();
     intptr_t entry = -1;
     bool present = BaseIterTable::FindKeyOrDeletedOrUnused(key, &entry);
     if (!present) {
@@ -482,6 +508,36 @@
     ASSERT(entry != -1);
     BaseIterTable::UpdatePayload(entry, 0, value);
   }
+  // If 'key' is not present, maps it to 'value_if_absent'. Returns the final
+  // value in the map.
+  RawObject* InsertOrGetValue(const Object& key,
+                              const Object& value_if_absent) const {
+    EnsureCapacity();
+    intptr_t entry = -1;
+    if (!BaseIterTable::FindKeyOrDeletedOrUnused(key, &entry)) {
+      BaseIterTable::InsertKey(entry, key);
+      BaseIterTable::UpdatePayload(entry, 0, value_if_absent);
+      return value_if_absent.raw();
+    } else {
+      return BaseIterTable::GetPayload(entry, 0);
+    }
+  }
+  // Like InsertOrGetValue, but calls NewKey to allocate a key object if needed.
+  template<typename Key>
+  RawObject* InsertNewOrGetValue(const Key& key,
+                                 const Object& value_if_absent) const {
+    EnsureCapacity();
+    intptr_t entry = -1;
+    if (!BaseIterTable::FindKeyOrDeletedOrUnused(key, &entry)) {
+      Object& new_key = Object::Handle(BaseIterTable::isolate(),
+          BaseIterTable::BaseTable::Traits::NewKey(key));
+      BaseIterTable::InsertKey(entry, new_key);
+      BaseIterTable::UpdatePayload(entry, 0, value_if_absent);
+      return value_if_absent.raw();
+    } else {
+      return BaseIterTable::GetPayload(entry, 0);
+    }
+  }
 
   template<typename Key>
   bool Remove(const Key& key) const {
@@ -493,6 +549,12 @@
       return true;
     }
   }
+
+ protected:
+  void EnsureCapacity() const {
+    static const double kMaxLoadFactor = 0.75;
+    HashTables::EnsureLoadFactor(0.0, kMaxLoadFactor, *this);
+  }
 };
 
 
@@ -500,7 +562,8 @@
 class UnorderedHashMap : public HashMap<UnorderedHashTable<KeyTraits, 1> > {
  public:
   typedef HashMap<UnorderedHashTable<KeyTraits, 1> > BaseMap;
-  explicit UnorderedHashMap(Array& data) : BaseMap(data) {}
+  explicit UnorderedHashMap(RawArray* data) : BaseMap(data) {}
+  UnorderedHashMap(Isolate* isolate, RawArray* data) : BaseMap(isolate, data) {}
 };
 
 
@@ -508,16 +571,18 @@
 class EnumIndexHashMap : public HashMap<EnumIndexHashTable<KeyTraits, 1> > {
  public:
   typedef HashMap<EnumIndexHashTable<KeyTraits, 1> > BaseMap;
-  explicit EnumIndexHashMap(Array& data) : BaseMap(data) {}
+  explicit EnumIndexHashMap(RawArray* data) : BaseMap(data) {}
+  EnumIndexHashMap(Isolate* isolate, RawArray* data) : BaseMap(isolate, data) {}
 };
 
 
 template<typename BaseIterTable>
 class HashSet : public BaseIterTable {
  public:
-  explicit HashSet(Array& data) : BaseIterTable(data) {}
+  explicit HashSet(RawArray* data) : BaseIterTable(data) {}
+  HashSet(Isolate* isolate, RawArray* data) : BaseIterTable(isolate, data) {}
   bool Insert(const Object& key) {
-    HashTables::EnsureLoadFactor(0.0, 0.75, *this);
+    EnsureCapacity();
     intptr_t entry = -1;
     bool present = BaseIterTable::FindKeyOrDeletedOrUnused(key, &entry);
     if (!present) {
@@ -525,6 +590,44 @@
     }
     return present;
   }
+
+  // If 'key' is not present, insert and return it. Else, return the existing
+  // key in the set (useful for canonicalization).
+  RawObject* InsertOrGet(const Object& key) const {
+    EnsureCapacity();
+    intptr_t entry = -1;
+    if (!BaseIterTable::FindKeyOrDeletedOrUnused(key, &entry)) {
+      BaseIterTable::InsertKey(entry, key);
+      return key.raw();
+    } else {
+      return BaseIterTable::GetPayload(entry, 0);
+    }
+  }
+
+  // Like InsertOrGet, but calls NewKey to allocate a key object if needed.
+  template<typename Key>
+  RawObject* InsertNewOrGet(const Key& key) const {
+    EnsureCapacity();
+    intptr_t entry = -1;
+    if (!BaseIterTable::FindKeyOrDeletedOrUnused(key, &entry)) {
+      Object& new_key = Object::Handle(BaseIterTable::isolate(),
+          BaseIterTable::BaseTable::Traits::NewKey(key));
+      BaseIterTable::InsertKey(entry, new_key);
+      return new_key.raw();
+    } else {
+      return BaseIterTable::GetKey(entry);
+    }
+  }
+
+  template<typename Key>
+  RawObject* GetOrNull(const Key& key, bool* present = NULL) const {
+    intptr_t entry = BaseIterTable::FindKey(key);
+    if (present != NULL) {
+      *present = (entry != -1);
+    }
+    return (entry == -1) ? Object::null() : BaseIterTable::GetKey(entry);
+  }
+
   template<typename Key>
   bool Remove(const Key& key) const {
     intptr_t entry = BaseIterTable::FindKey(key);
@@ -535,6 +638,12 @@
       return true;
     }
   }
+
+ protected:
+  void EnsureCapacity() const {
+    static const double kMaxLoadFactor = 0.75;
+    HashTables::EnsureLoadFactor(0.0, kMaxLoadFactor, *this);
+  }
 };
 
 
@@ -542,7 +651,8 @@
 class UnorderedHashSet : public HashSet<UnorderedHashTable<KeyTraits, 0> > {
  public:
   typedef HashSet<UnorderedHashTable<KeyTraits, 0> > BaseSet;
-  explicit UnorderedHashSet(Array& data) : BaseSet(data) {}
+  explicit UnorderedHashSet(RawArray* data) : BaseSet(data) {}
+  UnorderedHashSet(Isolate* isolate, RawArray* data) : BaseSet(isolate, data) {}
 };
 
 
@@ -550,7 +660,8 @@
 class EnumIndexHashSet : public HashSet<EnumIndexHashTable<KeyTraits, 0> > {
  public:
   typedef HashSet<EnumIndexHashTable<KeyTraits, 0> > BaseSet;
-  explicit EnumIndexHashSet(Array& data) : BaseSet(data) {}
+  explicit EnumIndexHashSet(RawArray* data) : BaseSet(data) {}
+  EnumIndexHashSet(Isolate* isolate, RawArray* data) : BaseSet(isolate, data) {}
 };
 
 }  // namespace dart
diff --git a/runtime/vm/hash_table_test.cc b/runtime/vm/hash_table_test.cc
index 0bed949..ad6eaac 100644
--- a/runtime/vm/hash_table_test.cc
+++ b/runtime/vm/hash_table_test.cc
@@ -33,6 +33,9 @@
   static uword Hash(const Object& obj) {
     return String::Cast(obj).Length();
   }
+  static RawObject* NewKey(const char* key) {
+    return String::New(key);
+  }
 };
 
 
@@ -57,7 +60,7 @@
 
 TEST_CASE(HashTable) {
   typedef HashTable<TestTraits, 2, 1> Table;
-  Table table(Array::Handle(HashTables::New<Table>(5)));
+  Table table(HashTables::New<Table>(5));
   // Ensure that we did get at least 5 entries.
   EXPECT_LE(5, table.NumEntries());
   EXPECT_EQ(0, table.NumOccupied());
@@ -118,7 +121,7 @@
 
 TEST_CASE(EnumIndexHashMap) {
   typedef EnumIndexHashMap<TestTraits> Table;
-  Table table(Array::Handle(HashTables::New<Table>(5)));
+  Table table(HashTables::New<Table>(5));
   table.UpdateOrInsert(String::Handle(String::New("a")),
                        String::Handle(String::New("A")));
   EXPECT(table.ContainsKey("a"));
@@ -128,6 +131,18 @@
   EXPECT(a_value.Equals("AAA"));
   Object& null_value = Object::Handle(table.GetOrNull("0"));
   EXPECT(null_value.IsNull());
+
+  // Test on-demand allocation of a new key object using NewKey in traits.
+  String& b_value = String::Handle();
+  b_value ^=
+      table.InsertNewOrGetValue("b", String::Handle(String::New("BBB")));
+  EXPECT(b_value.Equals("BBB"));
+  {
+    // When the key is already present, there should be no allocation.
+    NoGCScope no_gc;
+    b_value ^= table.InsertNewOrGetValue("b", a_value);
+    EXPECT(b_value.Equals("BBB"));
+  }
   table.Release();
 }
 
@@ -213,7 +228,7 @@
 template<typename Set>
 void TestSet(intptr_t initial_capacity, bool ordered) {
   std::set<std::string> expected;
-  Set actual(Array::Handle(HashTables::New<Set>(initial_capacity)));
+  Set actual(HashTables::New<Set>(initial_capacity));
   // Insert the following strings twice:
   // aaa...aaa (length 26)
   // bbb..bbb
@@ -238,7 +253,7 @@
 template<typename Map>
 void TestMap(intptr_t initial_capacity, bool ordered) {
   std::map<std::string, int> expected;
-  Map actual(Array::Handle(HashTables::New<Map>(initial_capacity)));
+  Map actual(HashTables::New<Map>(initial_capacity));
   // Insert the following (strings, int) mapping:
   // aaa...aaa -> 26
   // bbb..bbb -> 25
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 4d9092c..c564930 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -2410,7 +2410,6 @@
       compiler->GenerateInstanceCall(deopt_id(),
                                      token_pos(),
                                      ArgumentCount(),
-                                     argument_names(),
                                      locs(),
                                      unary_ic_data);
     } else {
@@ -2418,7 +2417,6 @@
       compiler->GenerateInstanceCall(deopt_id(),
                                      token_pos(),
                                      ArgumentCount(),
-                                     argument_names(),
                                      locs(),
                                      *call_ic_data);
     }
@@ -2431,7 +2429,6 @@
     compiler->GenerateInstanceCall(deopt_id(),
                                    token_pos(),
                                    ArgumentCount(),
-                                   argument_names(),
                                    locs(),
                                    *call_ic_data);
   }
@@ -3120,7 +3117,7 @@
                          RangeBoundary::FromConstant(65535));
       break;
     case kTypedDataInt32ArrayCid:
-      if (CanDeoptimize()) {
+      if (Typed32BitIsSmi()) {
         range_ = Range::UnknownSmi();
       } else {
         range_ = new Range(RangeBoundary::FromConstant(kMinInt32),
@@ -3128,7 +3125,7 @@
       }
       break;
     case kTypedDataUint32ArrayCid:
-      if (CanDeoptimize()) {
+      if (Typed32BitIsSmi()) {
         range_ = Range::UnknownSmi();
       } else {
         range_ = new Range(RangeBoundary::FromConstant(0),
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 8886c1c..55bc22d 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -4252,6 +4252,9 @@
     return deopt_id_ != Isolate::kNoDeoptId;
   }
 
+  bool Typed32BitIsSmi() const {
+    return kSmiBits >= 32;
+  }
 
   virtual Representation representation() const;
   virtual void InferRange();
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index c619a17..a514a3b 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -1092,11 +1092,8 @@
 
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      // Result can be Smi or Mint when boxed.
-      // Instruction can deoptimize if we optimistically assumed that the result
-      // fits into Smi.
-      return CanDeoptimize() ? CompileType::FromCid(kSmiCid)
-                             : CompileType::Int();
+      return Typed32BitIsSmi() ? CompileType::FromCid(kSmiCid)
+                                : CompileType::FromCid(kMintCid);
 
     default:
       UNREACHABLE();
@@ -1121,9 +1118,7 @@
       return kTagged;
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      // Instruction can deoptimize if we optimistically assumed that the result
-      // fits into Smi.
-      return CanDeoptimize() ? kTagged : kUnboxedMint;
+      return Typed32BitIsSmi() ? kTagged : kUnboxedMint;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index 33b9dec..9c06aeb 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -296,8 +296,13 @@
 
 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   if (!locs()->out(0).IsInvalid()) {
-    const VRegister dst = locs()->out(0).fpu_reg();
-    __ LoadDImmediate(dst, Double::Cast(value()).value(), PP);
+    if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
+      const VRegister dst = locs()->out(0).fpu_reg();
+      __ veor(dst, dst, dst);
+    } else {
+      const VRegister dst = locs()->out(0).fpu_reg();
+      __ LoadDImmediate(dst, Double::Cast(value()).value(), PP);
+    }
   }
 }
 
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 7b276af..766cfee 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -990,11 +990,8 @@
 
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      // Result can be Smi or Mint when boxed.
-      // Instruction can deoptimize if we optimistically assumed that the result
-      // fits into Smi.
-      return CanDeoptimize() ? CompileType::FromCid(kSmiCid)
-                             : CompileType::Int();
+      return Typed32BitIsSmi() ? CompileType::FromCid(kSmiCid)
+                               : CompileType::FromCid(kMintCid);
 
     default:
       UNIMPLEMENTED();
@@ -1019,9 +1016,7 @@
       return kTagged;
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      // Instruction can deoptimize if we optimistically assumed that the result
-      // fits into Smi.
-      return CanDeoptimize() ? kTagged : kUnboxedMint;
+      return Typed32BitIsSmi() ? kTagged : kUnboxedMint;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index a5d77da..ac60f82 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -1056,11 +1056,8 @@
 
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      // Result can be Smi or Mint when boxed.
-      // Instruction can deoptimize if we optimistically assumed that the result
-      // fits into Smi.
-      return CanDeoptimize() ? CompileType::FromCid(kSmiCid)
-                             : CompileType::Int();
+      return Typed32BitIsSmi() ? CompileType::FromCid(kSmiCid)
+                                 : CompileType::FromCid(kMintCid);
 
     default:
       UNIMPLEMENTED();
@@ -1085,9 +1082,7 @@
       return kTagged;
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      // Instruction can deoptimize if we optimistically assumed that the result
-      // fits into Smi.
-      return CanDeoptimize() ? kTagged : kUnboxedMint;
+      return Typed32BitIsSmi() ? kTagged : kUnboxedMint;
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid:
       return kUnboxedDouble;
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index 2726c8a..d72ff5b 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -307,6 +307,12 @@
 }
 
 
+void JSONStream::PrintProperty(const char* name, SourceBreakpoint* bpt) {
+  PrintPropertyName(name);
+  PrintValue(bpt);
+}
+
+
 void JSONStream::PrintProperty(const char* name, Isolate* isolate) {
   PrintPropertyName(name);
   PrintValue(isolate);
diff --git a/runtime/vm/json_stream.h b/runtime/vm/json_stream.h
index 08371e1..3fc4961 100644
--- a/runtime/vm/json_stream.h
+++ b/runtime/vm/json_stream.h
@@ -101,6 +101,7 @@
   void PrintProperty(const char* name, const Object& o, bool ref = true);
 
   void PrintProperty(const char* name, const DebuggerEvent* event);
+  void PrintProperty(const char* name, SourceBreakpoint* bpt);
   void PrintProperty(const char* name, Isolate* isolate);
   void PrintPropertyName(const char* name);
   void PrintCommaIfNeeded();
@@ -164,6 +165,9 @@
   void AddProperty(const char* name, const DebuggerEvent* event) const {
     stream_->PrintProperty(name, event);
   }
+  void AddProperty(const char* name, SourceBreakpoint* bpt) const {
+    stream_->PrintProperty(name, bpt);
+  }
   void AddProperty(const char* name, Isolate* isolate) const {
     stream_->PrintProperty(name, isolate);
   }
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index aa88d36..08adf59 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -5425,6 +5425,11 @@
 }
 
 
+void Function::set_modifier(RawFunction::AsyncModifier value) const {
+  set_kind_tag(ModifierBits::update(value, raw_ptr()->kind_tag_));
+}
+
+
 void Function::set_is_intrinsic(bool value) const {
   set_kind_tag(IntrinsicBit::update(value, raw_ptr()->kind_tag_));
 }
@@ -5455,6 +5460,11 @@
 }
 
 
+void Function::set_is_async_closure(bool value) const {
+  set_kind_tag(AsyncClosureBit::update(value, raw_ptr()->kind_tag_));
+}
+
+
 void Function::set_token_pos(intptr_t value) const {
   ASSERT(value >= 0);
   raw_ptr()->token_pos_ = value;
@@ -5462,7 +5472,7 @@
 
 
 void Function::set_kind_tag(intptr_t value) const {
-  raw_ptr()->kind_tag_ = static_cast<uint16_t>(value);
+  raw_ptr()->kind_tag_ = static_cast<uint32_t>(value);
 }
 
 
@@ -6052,6 +6062,7 @@
   result.set_parameter_names(Object::empty_array());
   result.set_name(name);
   result.set_kind(kind);
+  result.set_modifier(RawFunction::kNoModifier);
   result.set_is_static(is_static);
   result.set_is_const(is_const);
   result.set_is_abstract(is_abstract);
@@ -6061,6 +6072,7 @@
   result.set_is_intrinsic(false);
   result.set_is_recognized(false);
   result.set_is_redirecting(false);
+  result.set_is_async_closure(false);
   result.set_owner(owner);
   result.set_token_pos(token_pos);
   result.set_end_token_pos(token_pos);
@@ -6845,6 +6857,8 @@
 
 RawString* Field::GetterName(const String& field_name) {
   CompilerStats::make_accessor_name++;
+  // TODO(koda): Avoid most of these allocations by adding prefix-based lookup
+  // to Symbols.
   return String::Concat(Symbols::GetterPrefix(), field_name);
 }
 
@@ -6857,6 +6871,8 @@
 
 RawString* Field::SetterName(const String& field_name) {
   CompilerStats::make_accessor_name++;
+  // TODO(koda): Avoid most of these allocations by adding prefix-based lookup
+  // to Symbols.
   return String::Concat(Symbols::SetterPrefix(), field_name);
 }
 
@@ -7693,6 +7709,10 @@
       return String::Cast(key).Hash();
     }
   }
+
+  static RawObject* NewKey(const Scanner::TokenDescriptor& descriptor) {
+    return LiteralToken::New(descriptor.kind, *descriptor.literal);
+  }
 };
 typedef UnorderedHashMap<CompressedTokenTraits> CompressedTokenMap;
 
@@ -7704,8 +7724,7 @@
   CompressedTokenStreamData() :
       buffer_(NULL),
       stream_(&buffer_, Reallocate, kInitialBufferSize),
-      tokens_(Array::Handle(
-          HashTables::New<CompressedTokenMap>(kInitialTableSize))) {
+      tokens_(HashTables::New<CompressedTokenMap>(kInitialTableSize)) {
   }
   ~CompressedTokenStreamData() {
     // Safe to discard the hash table now.
@@ -7715,32 +7734,20 @@
   // Add an IDENT token into the stream and the token hash map.
   void AddIdentToken(const String* ident) {
     ASSERT(ident->IsSymbol());
-    intptr_t index = tokens_.NumOccupied();
-    intptr_t entry;
-    if (!tokens_.FindKeyOrDeletedOrUnused(*ident, &entry)) {
-      tokens_.InsertKey(entry, *ident);
-      tokens_.UpdatePayload(entry, 0, Smi::Handle(Smi::New(index)));
-      HashTables::EnsureLoadFactor(0.0, kMaxLoadFactor, tokens_);
-    } else {
-      index = Smi::Value(Smi::RawCast(tokens_.GetPayload(entry, 0)));
-    }
+    const intptr_t fresh_index = tokens_.NumOccupied();
+    intptr_t index = Smi::Value(Smi::RawCast(
+        tokens_.InsertOrGetValue(*ident,
+                                 Smi::Handle(Smi::New(fresh_index)))));
     WriteIndex(index);
   }
 
   // Add a LITERAL token into the stream and the token hash map.
   void AddLiteralToken(const Scanner::TokenDescriptor& descriptor) {
     ASSERT(descriptor.literal->IsSymbol());
-    intptr_t index = tokens_.NumOccupied();
-    intptr_t entry;
-    if (!tokens_.FindKeyOrDeletedOrUnused(descriptor, &entry)) {
-      LiteralToken& new_literal = LiteralToken::Handle(
-          LiteralToken::New(descriptor.kind, *descriptor.literal));
-      tokens_.InsertKey(entry, new_literal);
-      tokens_.UpdatePayload(entry, 0, Smi::Handle(Smi::New(index)));
-      HashTables::EnsureLoadFactor(0.0, kMaxLoadFactor, tokens_);
-    } else {
-      index = Smi::Value(Smi::RawCast(tokens_.GetPayload(entry, 0)));
-    }
+    const intptr_t fresh_index = tokens_.NumOccupied();
+    intptr_t index = Smi::Value(Smi::RawCast(
+        tokens_.InsertNewOrGetValue(descriptor,
+                                    Smi::Handle(Smi::New(fresh_index)))));
     WriteIndex(index);
   }
 
@@ -7782,7 +7789,6 @@
   }
 
   static const intptr_t kInitialTableSize = 32;
-  static const double kMaxLoadFactor;
 
   uint8_t* buffer_;
   WriteStream stream_;
@@ -7792,9 +7798,6 @@
 };
 
 
-const double CompressedTokenStreamData::kMaxLoadFactor = 0.75;
-
-
 RawTokenStream* TokenStream::New(const Scanner::GrowableTokenStream& tokens,
                                  const String& private_key) {
   // Copy the relevant data out of the scanner into a compressed stream of
@@ -8545,10 +8548,32 @@
 }
 
 
-void Library::SetLoadError() const {
+void Library::SetLoadError(const Instance& error) const {
   // Should not be already successfully loaded or just allocated.
-  ASSERT(LoadInProgress() || LoadRequested() || LoadError());
+  ASSERT(LoadInProgress() || LoadRequested() || LoadFailed());
   raw_ptr()->load_state_ = RawLibrary::kLoadError;
+  StorePointer(&raw_ptr()->load_error_, error.raw());
+}
+
+
+RawInstance* Library::TransitiveLoadError() const {
+  if (LoadError() != Instance::null()) {
+    return LoadError();
+  }
+  intptr_t num_imp = num_imports();
+  Library& lib = Library::Handle();
+  Instance& error = Instance::Handle();
+  for (intptr_t i = 0; i < num_imp; i++) {
+    lib = ImportLibraryAt(i);
+    // Break potential import cycles while recursing through imports.
+    set_num_imports(0);
+    error = lib.TransitiveLoadError();
+    set_num_imports(num_imp);
+    if (!error.IsNull()) {
+      break;
+    }
+  }
+  return error.raw();
 }
 
 
@@ -8746,11 +8771,10 @@
 // name does not resolve to anything in this library.
 bool Library::LookupResolvedNamesCache(const String& name,
                                        Object* obj) const {
-  ResolvedNamesMap cache(Array::Handle(resolved_names()));
+  ResolvedNamesMap cache(resolved_names());
   bool present = false;
   *obj = cache.GetOrNull(name, &present);
-  RawArray* array = cache.Release();
-  ASSERT(array == resolved_names());
+  ASSERT(cache.Release().raw() == resolved_names());
   return present;
 }
 
@@ -8763,9 +8787,9 @@
   if (!FLAG_use_lib_cache) {
     return;
   }
-  ResolvedNamesMap cache(Array::Handle(resolved_names()));
+  ResolvedNamesMap cache(resolved_names());
   cache.UpdateOrInsert(name, obj);
-  StorePointer(&raw_ptr()->resolved_names_, cache.Release());
+  StorePointer(&raw_ptr()->resolved_names_, cache.Release().raw());
 }
 
 
@@ -9351,6 +9375,7 @@
   result.raw_ptr()->imports_ = Object::empty_array().raw();
   result.raw_ptr()->exports_ = Object::empty_array().raw();
   result.raw_ptr()->loaded_scripts_ = Array::null();
+  result.raw_ptr()->load_error_ = Instance::null();
   result.set_native_entry_resolver(NULL);
   result.set_native_entry_symbol_resolver(NULL);
   result.raw_ptr()->corelib_imported_ = true;
@@ -9727,13 +9752,28 @@
 }
 
 
+RawInstance* LibraryPrefix::LoadError() const {
+  Library& lib = Library::Handle();
+  Instance& error = Instance::Handle();
+  for (int32_t i = 0; i < num_imports(); i++) {
+    lib = GetLibrary(i);
+    ASSERT(!lib.IsNull());
+    error = lib.TransitiveLoadError();
+    if (!error.IsNull()) {
+      return error.raw();
+    }
+  }
+  return Instance::null();
+}
+
+
 bool LibraryPrefix::ContainsLibrary(const Library& library) const {
-  intptr_t num_current_imports = num_imports();
+  int32_t num_current_imports = num_imports();
   if (num_current_imports > 0) {
     Library& lib = Library::Handle();
     const String& url = String::Handle(library.url());
     String& lib_url = String::Handle();
-    for (intptr_t i = 0; i < num_current_imports; i++) {
+    for (int32_t i = 0; i < num_current_imports; i++) {
       lib = GetLibrary(i);
       ASSERT(!lib.IsNull());
       lib_url = lib.url();
@@ -9844,6 +9884,10 @@
     Isolate* isolate = Isolate::Current();
     Api::Scope api_scope(isolate);
     deferred_lib.SetLoadRequested();
+    const GrowableObjectArray& pending_deferred_loads =
+        GrowableObjectArray::Handle(
+            isolate->object_store()->pending_deferred_loads());
+    pending_deferred_loads.Add(deferred_lib);
     const String& lib_url = String::Handle(isolate, deferred_lib.url());
     Dart_LibraryTagHandler handler = isolate->library_tag_handler();
     handler(Dart_kImportTag,
@@ -12133,18 +12177,6 @@
 }
 
 
-bool Code::ObjectExistsInArea(intptr_t start_offset,
-                              intptr_t end_offset) const {
-  for (intptr_t i = 0; i < this->pointer_offsets_length(); i++) {
-    const intptr_t offset = this->GetPointerOffsetAt(i);
-    if ((start_offset <= offset) && (offset < end_offset)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-
 RawStackmap* Code::GetStackmap(uword pc, Array* maps, Stackmap* map) const {
   // This code is used during iterating frames during a GC and hence it
   // should not in turn start a GC.
@@ -18158,12 +18190,9 @@
 
 
 intptr_t LinkedHashMap::Length() const {
-  EnumIndexDefaultMap map(Array::Handle(data()));
+  EnumIndexDefaultMap map(data());
   intptr_t result = map.NumOccupied();
-  {
-    RawArray* array = map.Release();
-    ASSERT(array == data());
-  }
+  ASSERT(map.Release().raw() == data());
   return result;
 }
 
@@ -18171,47 +18200,41 @@
 void LinkedHashMap::InsertOrUpdate(const Object& key,
                                      const Object& value) const {
   ASSERT(!IsNull());
-  EnumIndexDefaultMap map(Array::Handle(data()));
+  EnumIndexDefaultMap map(data());
   if (!map.UpdateOrInsert(key, value)) {
     SetModified();
   }
-  StorePointer(&raw_ptr()->data_, map.Release());
+  StorePointer(&raw_ptr()->data_, map.Release().raw());
 }
 
 
 RawObject* LinkedHashMap::LookUp(const Object& key) const {
   ASSERT(!IsNull());
-  EnumIndexDefaultMap map(Array::Handle(data()));
+  EnumIndexDefaultMap map(data());
   const Object& result = Object::Handle(map.GetOrNull(key));
-  {
-    RawArray* array = map.Release();
-    ASSERT(array == data());
-  }
+  ASSERT(map.Release().raw() == data());
   return result.raw();
 }
 
 
 bool LinkedHashMap::Contains(const Object& key) const {
   ASSERT(!IsNull());
-  EnumIndexDefaultMap map(Array::Handle(data()));
+  EnumIndexDefaultMap map(data());
   bool result = map.ContainsKey(key);
-  {
-    RawArray* array = map.Release();
-    ASSERT(array == data());
-  }
+  ASSERT(map.Release().raw() == data());
   return result;
 }
 
 
 RawObject* LinkedHashMap::Remove(const Object& key) const {
   ASSERT(!IsNull());
-  EnumIndexDefaultMap map(Array::Handle(data()));
+  EnumIndexDefaultMap map(data());
   // TODO(koda): Make 'Remove' also return the old value.
   const Object& result = Object::Handle(map.GetOrNull(key));
   if (map.Remove(key)) {
     SetModified();
   }
-  StorePointer(&raw_ptr()->data_, map.Release());
+  StorePointer(&raw_ptr()->data_, map.Release().raw());
   return result.raw();
 }
 
@@ -18219,19 +18242,18 @@
 void LinkedHashMap::Clear() const {
   ASSERT(!IsNull());
   if (Length() != 0) {
-    EnumIndexDefaultMap map(Array::Handle(data()));
+    EnumIndexDefaultMap map(data());
     map.Initialize();
     SetModified();
-    StorePointer(&raw_ptr()->data_, map.Release());
+    StorePointer(&raw_ptr()->data_, map.Release().raw());
   }
 }
 
 
 RawArray* LinkedHashMap::ToArray() const {
-  EnumIndexDefaultMap map(Array::Handle(data()));
+  EnumIndexDefaultMap map(data());
   const Array& result = Array::Handle(HashTables::ToArray(map, true));
-  RawArray* array = map.Release();
-  ASSERT(array == data());
+  ASSERT(map.Release().raw() == data());
   return result.raw();
 }
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index ba8b625..57bacda 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1665,6 +1665,10 @@
     return KindBits::decode(raw_ptr()->kind_tag_);
   }
 
+  RawFunction::AsyncModifier modifier() const {
+    return ModifierBits::decode(raw_ptr()->kind_tag_);
+  }
+
   static const char* KindToCString(RawFunction::Kind kind);
 
   bool is_static() const { return StaticBit::decode(raw_ptr()->kind_tag_); }
@@ -1811,6 +1815,11 @@
   void SetIsOptimizable(bool value) const;
   void SetIsNativeAutoSetupScope(bool value) const;
 
+  bool is_async_closure() const {
+    return AsyncClosureBit::decode(raw_ptr()->kind_tag_);
+  }
+  void set_is_async_closure(bool value) const;
+
   bool is_native() const { return NativeBit::decode(raw_ptr()->kind_tag_); }
   void set_is_native(bool value) const;
 
@@ -1961,6 +1970,10 @@
     return kind() == RawFunction::kSignatureFunction;
   }
 
+  bool IsAsyncFunction() const {
+    return modifier() == RawFunction::kAsync;
+  }
+
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawFunction));
   }
@@ -2015,6 +2028,8 @@
   static const int kCtorPhaseBody = 1 << 1;
   static const int kCtorPhaseAll = (kCtorPhaseInit | kCtorPhaseBody);
 
+  void set_modifier(RawFunction::AsyncModifier value) const;
+
  private:
   void set_ic_data_array(const Array& value) const;
 
@@ -2033,6 +2048,8 @@
     kRedirectingBit = 13,
     kExternalBit = 14,
     kAllowsHoistingCheckClassBit = 15,
+    kModifierPos = 16,
+    kAsyncClosureBit = 17,
   };
   class KindBits :
     public BitField<RawFunction::Kind, kKindTagPos, kKindTagSize> {};  // NOLINT
@@ -2049,6 +2066,9 @@
   class RedirectingBit : public BitField<bool, kRedirectingBit, 1> {};
   class AllowsHoistingCheckClassBit :
       public BitField<bool, kAllowsHoistingCheckClassBit, 1> {};  // NOLINT
+  class ModifierBits :
+      public BitField<RawFunction::AsyncModifier, kModifierPos, 1> {};  // NOLINT
+  class AsyncClosureBit : public BitField<bool, kAsyncClosureBit, 1> {};
 
   void set_name(const String& value) const;
   void set_kind(RawFunction::Kind value) const;
@@ -2634,10 +2654,12 @@
   void SetLoadInProgress() const;
   bool Loaded() const { return raw_ptr()->load_state_ == RawLibrary::kLoaded; }
   void SetLoaded() const;
-  bool LoadError() const {
+  bool LoadFailed() const {
     return raw_ptr()->load_state_ == RawLibrary::kLoadError;
   }
-  void SetLoadError() const;
+  RawInstance* LoadError() const { return raw_ptr()->load_error_; }
+  void SetLoadError(const Instance& error) const;
+  RawInstance* TransitiveLoadError() const;
 
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawLibrary));
@@ -3741,10 +3763,6 @@
   uword GetPcForDeoptId(intptr_t deopt_id, RawPcDescriptors::Kind kind) const;
   intptr_t GetDeoptIdForOsr(uword pc) const;
 
-  // Returns true if there is an object in the code between 'start_offset'
-  // (inclusive) and 'end_offset' (exclusive).
-  bool ObjectExistsInArea(intptr_t start_offest, intptr_t end_offset) const;
-
   RawString* Name() const;
   RawString* PrettyName() const;
 
@@ -4366,9 +4384,11 @@
   virtual RawString* DictionaryName() const { return name(); }
 
   RawArray* imports() const { return raw_ptr()->imports_; }
-  intptr_t num_imports() const { return raw_ptr()->num_imports_; }
+  int32_t num_imports() const { return raw_ptr()->num_imports_; }
   RawLibrary* importer() const { return raw_ptr()->importer_; }
 
+  RawInstance* LoadError() const;
+
   bool ContainsLibrary(const Library& library) const;
   RawLibrary* GetLibrary(int index) const;
   void AddImport(const Namespace& import) const;
@@ -5605,6 +5625,8 @@
 
   friend class Class;
   friend class Symbols;
+  friend class StringSlice;  // SetHash
+  template<typename CharType> friend class CharArray;  // SetHash
   friend class OneByteString;
   friend class TwoByteString;
   friend class ExternalOneByteString;
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 4bd14d2..6a236e1 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -110,6 +110,7 @@
 
   ASSERT(this->pending_functions() == GrowableObjectArray::null());
   this->pending_functions_ = GrowableObjectArray::New();
+  this->pending_deferred_loads_ = GrowableObjectArray::New();
 
   this->resume_capabilities_ = GrowableObjectArray::New();
 
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 4fc280d..36bcc01 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -354,6 +354,13 @@
     return pending_functions_;
   }
 
+  RawGrowableObjectArray* pending_deferred_loads() const {
+    return pending_deferred_loads_;
+  }
+  void clear_pending_deferred_loads() {
+    pending_deferred_loads_ = GrowableObjectArray::New();
+  }
+
   RawGrowableObjectArray* resume_capabilities() const {
     return resume_capabilities_;
   }
@@ -504,6 +511,7 @@
   RawGrowableObjectArray* libraries_;
   RawGrowableObjectArray* pending_classes_;
   RawGrowableObjectArray* pending_functions_;
+  RawGrowableObjectArray* pending_deferred_loads_;
   RawGrowableObjectArray* resume_capabilities_;
   RawError* sticky_error_;
   RawString* unhandled_exception_handler_;
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index c68767a..7812645 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -39,6 +39,7 @@
 DEFINE_FLAG(bool, enable_type_checks, false, "Enable type checks.");
 DEFINE_FLAG(bool, trace_parser, false, "Trace parser operations.");
 DEFINE_FLAG(bool, warn_mixin_typedef, true, "Warning on legacy mixin typedef.");
+DEFINE_FLAG(bool, enable_async, false, "Enable async operations.");
 DECLARE_FLAG(bool, error_on_bad_type);
 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
 DECLARE_FLAG(bool, warn_on_javascript_compatibility);
@@ -795,7 +796,7 @@
     case RawFunction::kConstructor:
       // The call to a redirecting factory is redirected.
       ASSERT(!func.IsRedirectingFactory());
-      if (!func.IsImplicitConstructor()) {
+      if (!func.IsImplicitConstructor() && !func.is_async_closure()) {
         parser.SkipFunctionPreamble();
       }
       node_sequence = parser.ParseFunc(func, &default_parameter_values);
@@ -2898,6 +2899,18 @@
 }
 
 
+// TODO(mlippautz): Once we know where these classes should come from, adjust
+// how we get their definition.
+RawClass* Parser::GetClassForAsync(const String& class_name) {
+  const Class& cls = Class::Handle(library_.LookupClass(class_name));
+  if (cls.IsNull()) {
+    ReportError("async modifier requires dart:async to be imported without "
+                "prefix");
+  }
+  return cls.raw();
+}
+
+
 // Parser is at the opening parenthesis of the formal parameter
 // declaration of the function or constructor.
 // Parse the formal parameters and code.
@@ -2912,6 +2925,7 @@
   intptr_t saved_try_index = last_used_try_index_;
   last_used_try_index_ = 0;
 
+  intptr_t formal_params_pos = TokenPos();
   // TODO(12455) : Need better validation mechanism.
 
   if (func.IsConstructor()) {
@@ -2946,12 +2960,23 @@
         &Symbols::TypeArgumentsParameter(),
         &Type::ZoneHandle(I, Type::DynamicType()));
   }
-  ASSERT((CurrentToken() == Token::kLPAREN) || func.IsGetterFunction());
+  ASSERT((CurrentToken() == Token::kLPAREN) ||
+         func.IsGetterFunction() ||
+         func.is_async_closure());
   const bool allow_explicit_default_values = true;
   if (func.IsGetterFunction()) {
     // Populate function scope with the formal parameters. Since in this case
     // we are compiling a getter this will at most populate the receiver.
     AddFormalParamsToScope(&params, current_block_->scope);
+  } else if (func.is_async_closure()) {
+    AddFormalParamsToScope(&params, current_block_->scope);
+    ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
+    ASSERT(func.NumParameters() == params.parameters->length());
+    if (!Function::Handle(func.parent_function()).IsGetterFunction()) {
+      // Parse away any formal parameters, as they are accessed as as context
+      // variables.
+      ParseFormalParameterList(allow_explicit_default_values, false, &params);
+    }
   } else {
     ParseFormalParameterList(allow_explicit_default_values, false, &params);
 
@@ -2992,7 +3017,16 @@
     }
   }
 
+  RawFunction::AsyncModifier func_modifier = ParseFunctionModifier();
+  func.set_modifier(func_modifier);
+
   OpenBlock();  // Open a nested scope for the outermost function block.
+
+  Function& async_closure = Function::ZoneHandle(I);
+  if (func.IsAsyncFunction() && !func.is_async_closure()) {
+    async_closure = OpenAsyncFunction(formal_params_pos);
+  }
+
   intptr_t end_token_pos = 0;
   if (CurrentToken() == Token::kLBRACE) {
     ConsumeToken();
@@ -3053,6 +3087,11 @@
          func.end_token_pos() == end_token_pos);
   func.set_end_token_pos(end_token_pos);
   SequenceNode* body = CloseBlock();
+  if (func.IsAsyncFunction() && !func.is_async_closure()) {
+    body = CloseAsyncFunction(async_closure, body);
+  } else if (func.is_async_closure()) {
+    CloseAsyncClosure(body);
+  }
   current_block_->statements->Add(body);
   innermost_function_ = saved_innermost_function.raw();
   last_used_try_index_ = saved_try_index;
@@ -3366,6 +3405,15 @@
                 method->name->ToCString());
   }
 
+  RawFunction::AsyncModifier async_modifier = ParseFunctionModifier();
+  if ((method->IsFactoryOrConstructor() || method->IsSetter()) &&
+      async_modifier != RawFunction::kNoModifier) {
+    ReportError(method->name_pos,
+                "%s '%s' may not be async",
+                (method->IsSetter()) ? "setter" : "constructor",
+                method->name->ToCString());
+  }
+
   intptr_t method_end_pos = TokenPos();
   if ((CurrentToken() == Token::kLBRACE) ||
       (CurrentToken() == Token::kARROW)) {
@@ -3480,6 +3528,7 @@
   func.set_result_type(*method->type);
   func.set_end_token_pos(method_end_pos);
   func.set_is_redirecting(is_redirecting);
+  func.set_modifier(async_modifier);
   if (method->has_native && library_.is_dart_scheme() &&
       library_.IsPrivate(*method->name)) {
     func.set_is_visible(false);
@@ -4800,6 +4849,17 @@
 }
 
 
+RawFunction::AsyncModifier Parser::ParseFunctionModifier() {
+  if (FLAG_enable_async) {
+    if (CurrentLiteral()->raw() == Symbols::Async().raw()) {
+      ConsumeToken();
+      return RawFunction::kAsync;
+    }
+  }
+  return RawFunction::kNoModifier;
+}
+
+
 void Parser::ParseTopLevelFunction(TopLevel* top_level,
                                    intptr_t metadata_pos) {
   TRACE_PARSER("ParseTopLevelFunction");
@@ -4853,6 +4913,8 @@
   const bool allow_explicit_default_values = true;
   ParseFormalParameterList(allow_explicit_default_values, false, &params);
 
+  RawFunction::AsyncModifier func_modifier = ParseFunctionModifier();
+
   intptr_t function_end_pos = function_pos;
   bool is_native = false;
   if (is_external) {
@@ -4887,6 +4949,7 @@
                     decl_begin_pos));
   func.set_result_type(result_type);
   func.set_end_token_pos(function_end_pos);
+  func.set_modifier(func_modifier);
   if (is_native && library_.is_dart_scheme() && library_.IsPrivate(func_name)) {
     func.set_is_visible(false);
   }
@@ -4989,6 +5052,8 @@
                 field_name->ToCString());
   }
 
+  RawFunction::AsyncModifier func_modifier = ParseFunctionModifier();
+
   intptr_t accessor_end_pos = accessor_pos;
   bool is_native = false;
   if (is_external) {
@@ -5024,6 +5089,7 @@
                     decl_begin_pos));
   func.set_result_type(result_type);
   func.set_end_token_pos(accessor_end_pos);
+  func.set_modifier(func_modifier);
   if (is_native && library_.is_dart_scheme() &&
       library_.IsPrivate(accessor_name)) {
     func.set_is_visible(false);
@@ -5440,6 +5506,45 @@
 }
 
 
+RawFunction* Parser::OpenAsyncFunction(intptr_t formal_param_pos) {
+  // Create the closure containing the old body of this function.
+  Class& sig_cls = Class::ZoneHandle(I);
+  Type& sig_type = Type::ZoneHandle(I);
+  Function& closure = Function::ZoneHandle(I);
+  String& sig = String::ZoneHandle(I);
+  ParamList closure_params;
+  closure_params.AddFinalParameter(
+      formal_param_pos,
+      &Symbols::ClosureParameter(),
+      &Type::ZoneHandle(I, Type::DynamicType()));
+  closure = Function::NewClosureFunction(
+      Symbols::AnonymousClosure(),
+      innermost_function(),
+      formal_param_pos);
+  AddFormalParamsToFunction(&closure_params, closure);
+  closure.set_is_async_closure(true);
+  closure.set_result_type(AbstractType::Handle(Type::DynamicType()));
+  sig = closure.Signature();
+  sig_cls = library_.LookupLocalClass(sig);
+  if (sig_cls.IsNull()) {
+    sig_cls = Class::NewSignatureClass(sig, closure, script_, formal_param_pos);
+    library_.AddClass(sig_cls);
+  }
+  closure.set_signature_class(sig_cls);
+  sig_type = sig_cls.SignatureType();
+  if (!sig_type.IsFinalized()) {
+    ClassFinalizer::FinalizeType(
+        sig_cls, sig_type, ClassFinalizer::kCanonicalize);
+  }
+  ASSERT(AbstractType::Handle(I, closure.result_type()).IsResolved());
+  ASSERT(closure.NumParameters() == closure_params.parameters->length());
+  OpenFunctionBlock(closure);
+  AddFormalParamsToScope(&closure_params, current_block_->scope);
+  OpenBlock();
+  return closure.raw();
+}
+
+
 SequenceNode* Parser::CloseBlock() {
   SequenceNode* statements = current_block_->statements;
   if (current_block_->scope != NULL) {
@@ -5453,6 +5558,141 @@
 }
 
 
+SequenceNode* Parser::CloseAsyncFunction(const Function& closure,
+                                         SequenceNode* closure_body) {
+  ASSERT(!closure.IsNull());
+  ASSERT(closure_body != NULL);
+  // The block for the async closure body has already been closed. Close the
+  // corresponding function block.
+  CloseBlock();
+
+  // Create and return a new future that executes a closure with the current
+  // body.
+
+  bool found = false;
+
+  // No need to capture parameters or other variables, since they have already
+  // been captured in the corresponding scope as the body has been parsed within
+  // a nested block (contained in the async funtion's block).
+  const Class& future = Class::ZoneHandle(I,
+      GetClassForAsync(Symbols::Future()));
+  ASSERT(!future.IsNull());
+  const Function& constructor = Function::ZoneHandle(I,
+      future.LookupFunction(Symbols::FutureConstructor()));
+  ASSERT(!constructor.IsNull());
+  const Class& completer = Class::ZoneHandle(I,
+      GetClassForAsync(Symbols::Completer()));
+  ASSERT(!completer.IsNull());
+  const Function& completer_constructor = Function::ZoneHandle(I,
+      completer.LookupFunction(Symbols::CompleterConstructor()));
+  ASSERT(!completer_constructor.IsNull());
+
+  // Add to AST:
+  //   var :async_op;
+  //   var :async_completer;
+  LocalVariable* async_op_var = new (I) LocalVariable(
+      Scanner::kNoSourcePos,
+      Symbols::AsyncOperation(),
+      Type::ZoneHandle(I, Type::DynamicType()));
+  current_block_->scope->AddVariable(async_op_var);
+  found = closure_body->scope()->CaptureVariable(Symbols::AsyncOperation());
+  ASSERT(found);
+  LocalVariable* async_completer = new (I) LocalVariable(
+      Scanner::kNoSourcePos,
+      Symbols::AsyncCompleter(),
+      Type::ZoneHandle(I, Type::DynamicType()));
+  current_block_->scope->AddVariable(async_completer);
+  found = closure_body->scope()->CaptureVariable(Symbols::AsyncCompleter());
+  ASSERT(found);
+
+  // Add to AST:
+  //   :async_completer = new Completer();
+  ArgumentListNode* empty_args = new (I) ArgumentListNode(
+      Scanner::kNoSourcePos);
+  ConstructorCallNode* completer_constructor_node = new (I) ConstructorCallNode(
+      Scanner::kNoSourcePos,
+      TypeArguments::ZoneHandle(I),
+      completer_constructor,
+      empty_args);
+  StoreLocalNode* store_completer = new (I) StoreLocalNode(
+      Scanner::kNoSourcePos,
+      async_completer,
+      completer_constructor_node);
+  current_block_->statements->Add(store_completer);
+
+  // Add to AST:
+  //   :async_op = <closure>;  (containing the original body)
+  ClosureNode* cn = new(I) ClosureNode(
+      Scanner::kNoSourcePos, closure, NULL, closure_body->scope());
+  StoreLocalNode* store_async_op = new (I) StoreLocalNode(
+      Scanner::kNoSourcePos,
+      async_op_var,
+      cn);
+  current_block_->statements->Add(store_async_op);
+
+  // Add to AST:
+  //   new Future(:async_op);
+  ArgumentListNode* arguments = new (I) ArgumentListNode(Scanner::kNoSourcePos);
+  arguments->Add(new (I) LoadLocalNode(
+      Scanner::kNoSourcePos, async_op_var));
+  ConstructorCallNode* future_node = new (I) ConstructorCallNode(
+      Scanner::kNoSourcePos, TypeArguments::ZoneHandle(I), constructor,
+      arguments);
+  current_block_->statements->Add(future_node);
+
+  // Add to AST:
+  //   return :async_completer.future;
+  ReturnNode* return_node = new (I) ReturnNode(
+      Scanner::kNoSourcePos,
+      new (I) InstanceGetterNode(
+          Scanner::kNoSourcePos,
+          new (I) LoadLocalNode(
+              Scanner::kNoSourcePos,
+              async_completer),
+          Symbols::CompleterFuture()));
+  current_block_->statements->Add(return_node);
+  return CloseBlock();
+}
+
+
+void Parser::CloseAsyncClosure(SequenceNode* body) {
+  ASSERT(body != NULL);
+  // Replace an optional ReturnNode with the appropriate completer calls.
+  intptr_t last_index = body->length() - 1;
+  AstNode* last = NULL;
+  if (last_index >= 0) {
+    // Non-empty async closure.
+    last = body->NodeAt(last_index);
+  }
+  ArgumentListNode* args = new (I) ArgumentListNode(Scanner::kNoSourcePos);
+  LocalVariable* completer = body->scope()->LookupVariable(
+      Symbols::AsyncCompleter(), false);
+  ASSERT(completer != NULL);
+  if (last != NULL && last->IsReturnNode()) {
+    // Replace
+    //   return <expr>;
+    // with
+    //   completer.complete(<expr>);
+    args->Add(body->NodeAt(last_index)->AsReturnNode()->value());
+    body->ReplaceNodeAt(last_index,
+        new (I) InstanceCallNode(
+          Scanner::kNoSourcePos,
+          new (I) LoadLocalNode(Scanner::kNoSourcePos, completer),
+          Symbols::CompleterComplete(),
+          args));
+  } else {
+    // Add to AST:
+    //   completer.complete();
+    body->Add(
+        new (I) InstanceCallNode(
+          Scanner::kNoSourcePos,
+          new (I) LoadLocalNode(Scanner::kNoSourcePos, completer),
+          Symbols::CompleterComplete(),
+          args));
+  }
+}
+
+
 // Set up default values for all optional parameters to the function.
 void Parser::SetupDefaultsForOptionalParams(const ParamList* params,
                                             Array* default_values) {
@@ -6228,7 +6468,9 @@
     if ((CurrentToken() == Token::kLBRACE) ||
         (CurrentToken() == Token::kARROW) ||
         (is_top_level_ && IsLiteral("native")) ||
-        is_external) {
+        is_external ||
+        (FLAG_enable_async &&
+            CurrentLiteral()->raw() == Symbols::Async().raw())) {
       SetPosition(saved_pos);
       return true;
     }
@@ -6271,6 +6513,7 @@
   const intptr_t saved_pos = TokenPos();
   bool is_function_literal = false;
   SkipToMatchingParenthesis();
+  ParseFunctionModifier();
   if ((CurrentToken() == Token::kLBRACE) ||
       (CurrentToken() == Token::kARROW)) {
     is_function_literal = true;
@@ -9785,10 +10028,8 @@
     ArgumentListNode* factory_param = new(I) ArgumentListNode(
         literal_pos);
     if (element_list.length() == 0) {
-      // TODO(srdjan): Use Object::empty_array once issue 9871 has been fixed.
-      Array& empty_array = Array::ZoneHandle(I, Object::empty_array().raw());
       LiteralNode* empty_array_literal =
-          new(I) LiteralNode(TokenPos(), empty_array);
+          new(I) LiteralNode(TokenPos(), Object::empty_array());
       factory_param->Add(empty_array_literal);
     } else {
       ArrayNode* list = new(I) ArrayNode(TokenPos(), type, element_list);
@@ -10767,6 +11008,7 @@
     params.skipped = true;
     ParseFormalParameterList(allow_explicit_default_values, false, &params);
   }
+  ParseFunctionModifier();
   if (CurrentToken() == Token::kLBRACE) {
     SkipBlock();
     ExpectToken(Token::kRBRACE);
@@ -10783,18 +11025,19 @@
 void Parser::SkipFunctionPreamble() {
   while (true) {
     const Token::Kind token = CurrentToken();
-    if (token == Token::kLPAREN ||
-        token == Token::kARROW ||
-        token == Token::kSEMICOLON ||
-        token == Token::kLBRACE) {
+    if (token == Token::kLPAREN) {
       return;
     }
-    // Case handles "native" keyword, but also return types of form
-    // native.SomeType where native is the name of a library.
-    if (token == Token::kIDENT && LookaheadToken(1) != Token::kPERIOD) {
-      if (CurrentLiteral()->raw() == Symbols::Native().raw()) {
+    if (token == Token::kGET) {
+      if (LookaheadToken(1) == Token::kLPAREN) {
+        // Case: Function/method named get.
+        ConsumeToken();  // Parse away 'get' (the function's name).
         return;
       }
+      // Case: Getter.
+      ConsumeToken();  // Parse away 'get'.
+      ConsumeToken();  // Parse away the getter name.
+      return;
     }
     ConsumeToken();
   }
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index bd7c3d2..b2fbfe6 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -363,6 +363,8 @@
   void ParseTopLevelAccessor(TopLevel* top_level, intptr_t metadata_pos);
   RawArray* EvaluateMetadata();
 
+  RawFunction::AsyncModifier ParseFunctionModifier();
+
   // Support for parsing libraries.
   RawObject* CallLibraryTagHandler(Dart_LibraryTag tag,
                                    intptr_t token_pos,
@@ -463,6 +465,7 @@
                                  Array* default_parameter_values);
   SequenceNode* ParseFunc(const Function& func,
                           Array* default_parameter_values);
+  RawClass* GetClassForAsync(const String& class_name);
 
   void ParseNativeFunctionBlock(const ParamList* params, const Function& func);
 
@@ -483,7 +486,12 @@
   void OpenBlock();
   void OpenLoopBlock();
   void OpenFunctionBlock(const Function& func);
+  RawFunction* OpenAsyncFunction(intptr_t formal_param_pos);
   SequenceNode* CloseBlock();
+  SequenceNode* CloseAsyncFunction(const Function& closure,
+                                   SequenceNode* closure_node);
+  void CloseAsyncClosure(SequenceNode* body);
+
 
   LocalVariable* LookupPhaseParameter();
   LocalVariable* LookupReceiver(LocalScope* from_scope, bool test_only);
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index cf0ff5e..7c19801 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -34,8 +34,13 @@
             "Time between profiler samples in microseconds. Minimum 50.");
 DEFINE_FLAG(int, profile_depth, 8,
             "Maximum number stack frames walked. Minimum 1. Maximum 255.");
+#if defined(PROFILE_NATIVE_CODE)
+DEFINE_FLAG(bool, profile_vm, true,
+            "Always collect native stack traces.");
+#else
 DEFINE_FLAG(bool, profile_vm, false,
             "Always collect native stack traces.");
+#endif
 
 bool Profiler::initialized_ = false;
 SampleBuffer* Profiler::sample_buffer_ = NULL;
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index cf3ca12..bff2eff 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -615,6 +615,11 @@
     kInvokeFieldDispatcher,  // invokes a field as a closure.
   };
 
+  enum AsyncModifier {
+    kNoModifier,
+    kAsync,
+  };
+
  private:
   // So that the MarkingVisitor::DetachCode can null out the code fields.
   friend class MarkingVisitor;
@@ -650,7 +655,7 @@
   int16_t num_fixed_parameters_;
   int16_t num_optional_parameters_;  // > 0: positional; < 0: named.
   int16_t deoptimization_counter_;
-  uint16_t kind_tag_;  // See Function::KindTagBits.
+  uint32_t kind_tag_;  // See Function::KindTagBits.
   uint16_t optimized_instruction_count_;
   uint16_t optimized_call_site_count_;
 };
@@ -798,8 +803,9 @@
   RawArray* imports_;            // List of Namespaces imported without prefix.
   RawArray* exports_;            // List of re-exported Namespaces.
   RawArray* loaded_scripts_;     // Array of scripts loaded in this library.
+  RawInstance* load_error_;      // Error iff load_state_ == kLoadError.
   RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->loaded_scripts_);
+    return reinterpret_cast<RawObject**>(&ptr()->load_error_);
   }
 
   int32_t index_;               // Library id number.
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 94358f6..fa25656 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -698,7 +698,7 @@
   func.set_num_fixed_parameters(reader->Read<int16_t>());
   func.set_num_optional_parameters(reader->Read<int16_t>());
   func.set_deoptimization_counter(reader->Read<int16_t>());
-  func.set_kind_tag(reader->Read<uint16_t>());
+  func.set_kind_tag(reader->Read<uint32_t>());
   func.set_optimized_instruction_count(reader->Read<uint16_t>());
   func.set_optimized_call_site_count(reader->Read<uint16_t>());
 
@@ -739,7 +739,7 @@
   writer->Write<int16_t>(ptr()->num_fixed_parameters_);
   writer->Write<int16_t>(ptr()->num_optional_parameters_);
   writer->Write<int16_t>(ptr()->deoptimization_counter_);
-  writer->Write<uint16_t>(ptr()->kind_tag_);
+  writer->Write<uint32_t>(ptr()->kind_tag_);
   writer->Write<uint16_t>(ptr()->optimized_instruction_count_);
   writer->Write<uint16_t>(ptr()->optimized_call_site_count_);
 
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 1716b0c..6ea0dd3 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -586,7 +586,7 @@
   if (Dart_IsError(source)) {
     return source;
   }
-  return Dart_LoadSource(library, url, source);
+  return Dart_LoadSource(library, url, source, 0, 0);
 }
 
 
@@ -1420,6 +1420,30 @@
 }
 
 
+static bool HandleLibrariesScriptsSetBreakpoint(
+    Isolate* isolate, const Script& script, JSONStream* js) {
+  if (!js->HasOption("line")) {
+    PrintError(js, "Missing 'line' option");
+    return true;
+  }
+  const char* line_option = js->LookupOption("line");
+  intptr_t line = -1;
+  if (!GetIntegerId(line_option, &line)) {
+    PrintError(js, "Invalid 'line' value: %s", line_option);
+    return true;
+  }
+  const String& script_url = String::Handle(script.url());
+  SourceBreakpoint* bpt =
+      isolate->debugger()->SetBreakpointAtLine(script_url, line);
+  if (bpt == NULL) {
+    PrintError(js, "Unable to set breakpoint at line %s", line_option);
+    return true;
+  }
+  bpt->PrintJSON(js);
+  return true;
+}
+
+
 static bool HandleLibrariesScripts(Isolate* isolate,
                                    const Library& lib,
                                    JSONStream* js) {
@@ -1458,6 +1482,8 @@
     const char* subcollection = js->GetArgument(4);
     if (strcmp(subcollection, "coverage") == 0) {
       return HandleLibrariesScriptsCoverage(isolate, script, js);
+    } else if (strcmp(subcollection, "setBreakpoint") == 0) {
+      return HandleLibrariesScriptsSetBreakpoint(isolate, script, js);
     } else {
       PrintError(js, "Invalid sub collection %s", subcollection);
       return true;
@@ -1554,6 +1580,80 @@
 }
 
 
+static RawClass* GetMetricsClass(Isolate* isolate) {
+  const Library& prof_lib =
+      Library::Handle(isolate, Library::ProfilerLibrary());
+  ASSERT(!prof_lib.IsNull());
+  const String& metrics_cls_name =
+      String::Handle(isolate, String::New("Metrics"));
+  ASSERT(!metrics_cls_name.IsNull());
+  const Class& metrics_cls =
+      Class::Handle(isolate, prof_lib.LookupClass(metrics_cls_name));
+  ASSERT(!metrics_cls.IsNull());
+  return metrics_cls.raw();
+}
+
+
+static bool HandleMetricsList(Isolate* isolate, JSONStream* js) {
+  const Class& metrics_cls = Class::Handle(isolate, GetMetricsClass(isolate));
+  const String& print_metrics_name =
+      String::Handle(String::New("_printMetrics"));
+  ASSERT(!print_metrics_name.IsNull());
+  const Function& print_metrics = Function::Handle(
+      isolate,
+      metrics_cls.LookupStaticFunctionAllowPrivate(print_metrics_name));
+  ASSERT(!print_metrics.IsNull());
+  const Array& args = Object::empty_array();
+  const Object& result =
+      Object::Handle(isolate, DartEntry::InvokeFunction(print_metrics, args));
+  ASSERT(!result.IsNull());
+  ASSERT(result.IsString());
+  TextBuffer* buffer = js->buffer();
+  buffer->AddString(String::Cast(result).ToCString());
+  return true;
+}
+
+
+static bool HandleMetric(Isolate* isolate, JSONStream* js, const char* id) {
+  const Class& metrics_cls = Class::Handle(isolate, GetMetricsClass(isolate));
+  const String& print_metric_name =
+      String::Handle(String::New("_printMetric"));
+  ASSERT(!print_metric_name.IsNull());
+  const Function& print_metric = Function::Handle(
+      isolate,
+      metrics_cls.LookupStaticFunctionAllowPrivate(print_metric_name));
+  ASSERT(!print_metric.IsNull());
+  const String& arg0 = String::Handle(String::New(id));
+  ASSERT(!arg0.IsNull());
+  const Array& args = Array::Handle(Array::New(1));
+  ASSERT(!args.IsNull());
+  args.SetAt(0, arg0);
+  const Object& result =
+      Object::Handle(isolate, DartEntry::InvokeFunction(print_metric, args));
+  if (!result.IsNull()) {
+    ASSERT(result.IsString());
+    TextBuffer* buffer = js->buffer();
+    buffer->AddString(String::Cast(result).ToCString());
+    return true;
+  }
+  PrintError(js, "Metric %s not found\n", id);
+  return true;
+}
+
+
+static bool HandleMetrics(Isolate* isolate, JSONStream* js) {
+  if (js->num_arguments() == 1) {
+    return HandleMetricsList(isolate, js);
+  }
+  if (js->num_arguments() > 2) {
+    PrintError(js, "Command too long");
+    return true;
+  }
+  const char* arg = js->GetArgument(1);
+  return HandleMetric(isolate, js, arg);
+}
+
+
 static bool HandleObjects(Isolate* isolate, JSONStream* js) {
   REQUIRE_COLLECTION_ID("objects");
   if (js->num_arguments() < 2) {
@@ -1681,7 +1781,9 @@
 }
 
 
-static bool HandleDebugResume(Isolate* isolate, JSONStream* js) {
+static bool HandleDebugResume(Isolate* isolate,
+                              const char* step_option,
+                              JSONStream* js) {
   if (isolate->message_handler()->paused_on_start()) {
     isolate->message_handler()->set_pause_on_start(false);
     JSONObject jsobj(js);
@@ -1697,6 +1799,18 @@
     return true;
   }
   if (isolate->debugger()->PauseEvent() != NULL) {
+    if (step_option != NULL) {
+      if (strcmp(step_option, "into") == 0) {
+        isolate->debugger()->SetSingleStep();
+      } else if (strcmp(step_option, "over") == 0) {
+        isolate->debugger()->SetStepOver();
+      } else if (strcmp(step_option, "out") == 0) {
+        isolate->debugger()->SetStepOut();
+      } else {
+        PrintError(js, "Invalid 'step' option: %s", step_option);
+        return true;
+      }
+    }
     isolate->Resume();
     JSONObject jsobj(js);
     jsobj.AddProperty("type", "Success");
@@ -1720,26 +1834,42 @@
       // Print breakpoint list.
       JSONObject jsobj(js);
       jsobj.AddProperty("type", "BreakpointList");
+      jsobj.AddProperty("id", "debug/breakpoints");
       JSONArray jsarr(&jsobj, "breakpoints");
       isolate->debugger()->PrintBreakpointsToJSONArray(&jsarr);
       return true;
-    } else if (js->num_arguments() == 3) {
-      // Print individual breakpoint.
+    } else {
       intptr_t id = 0;
       SourceBreakpoint* bpt = NULL;
       if (GetIntegerId(js->GetArgument(2), &id)) {
         bpt = isolate->debugger()->GetBreakpointById(id);
       }
-      if (bpt != NULL) {
-        bpt->PrintJSON(js);
-        return true;
-      } else {
-        PrintError(js, "Unrecognized breakpoint id %s", js->GetArgument(2));
+      if (bpt == NULL) {
+        PrintError(js, "Unrecognized breakpoint id: %s", js->GetArgument(2));
         return true;
       }
-    } else {
-      PrintError(js, "Command too long");
-      return true;
+      if (js->num_arguments() == 3) {
+        // Print individual breakpoint.
+        bpt->PrintJSON(js);
+        return true;
+      } else if (js->num_arguments() == 4) {
+        const char* sub_command = js->GetArgument(3);
+        if (strcmp(sub_command, "clear") == 0) {
+          // Clear this breakpoint.
+          isolate->debugger()->RemoveBreakpoint(id);
+
+          JSONObject jsobj(js);
+          jsobj.AddProperty("type", "Success");
+          jsobj.AddProperty("id", "");
+          return true;
+        } else {
+          PrintError(js, "Unrecognized subcommand: %s", sub_command);
+          return true;
+        }
+      } else {
+        PrintError(js, "Command too long");
+        return true;
+      }
     }
   } else if (strcmp(command, "pause") == 0) {
     if (js->num_arguments() == 2) {
@@ -1755,7 +1885,8 @@
     }
   } else if (strcmp(command, "resume") == 0) {
     if (js->num_arguments() == 2) {
-      return HandleDebugResume(isolate, js);
+      const char* step_option = js->LookupOption("step");
+      return HandleDebugResume(isolate, step_option, js);
     } else {
       PrintError(js, "Command too long");
       return true;
@@ -2046,6 +2177,7 @@
   { "debug", HandleDebug },
   { "heapmap", HandleHeapMap },
   { "libraries", HandleLibraries },
+  { "metrics", HandleMetrics },
   { "objects", HandleObjects },
   { "profile", HandleProfile },
   { "scripts", HandleScripts },
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 385c057..23427e8 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -125,7 +125,7 @@
 }
 
 
-// Search for the formatted string in buff.
+// Search for the formatted string in buffer.
 //
 // TODO(turnidge): This function obscures the line number of failing
 // EXPECTs.  Rework this.
@@ -264,6 +264,9 @@
   Isolate* isolate = Isolate::Current();
   Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
   EXPECT_VALID(lib);
+  Library& vmlib = Library::Handle();
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
 
   // Build a mock message handler and wrap it in a dart port.
   ServiceTestMessageHandler handler;
@@ -275,30 +278,83 @@
   Array& service_msg = Array::Handle();
 
   // Add a breakpoint.
-  const String& url = String::Handle(String::New(TestCase::url()));
-  isolate->debugger()->SetBreakpointAtLine(url, 3);
+  service_msg = EvalF(lib,
+                     "[0, port, ['libraries', '%" Pd "', "
+                     "'scripts', 'test-lib', 'setBreakpoint'], "
+                      "['line'], ['3']]",
+                      vmlib.index());
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  ExpectSubstringF(
+      handler.msg(),
+      "{\"type\":\"Breakpoint\",\"id\":\"debug\\/breakpoints\\/1\","
+      "\"breakpointNumber\":1,\"enabled\":true,\"resolved\":false,"
+      "\"location\":{\"type\":\"Location\","
+      "\"script\":{\"type\":\"@Script\","
+      "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\",\"kind\":\"script\"},"
+      "\"tokenPos\":5}}",
+      vmlib.index());
+
+  // Get the breakpoint list.
+  service_msg = Eval(lib, "[0, port, ['debug', 'breakpoints'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  ExpectSubstringF(
+      handler.msg(),
+      "{\"type\":\"BreakpointList\",\"id\":\"debug\\/breakpoints\","
+      "\"breakpoints\":["
+      "{\"type\":\"Breakpoint\",\"id\":\"debug\\/breakpoints\\/1\","
+      "\"breakpointNumber\":1,\"enabled\":true,\"resolved\":false,"
+      "\"location\":{\"type\":\"Location\","
+      "\"script\":{\"type\":\"@Script\","
+      "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\",\"kind\":\"script\"},"
+      "\"tokenPos\":5}}]}",
+      vmlib.index());
+
+  // Lookup individual breakpoint.
+  service_msg = Eval(lib, "[0, port, ['debug', 'breakpoints', '1'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  ExpectSubstringF(
+      handler.msg(),
+      "{\"type\":\"Breakpoint\",\"id\":\"debug\\/breakpoints\\/1\","
+      "\"breakpointNumber\":1,\"enabled\":true,\"resolved\":false,"
+      "\"location\":{\"type\":\"Location\","
+      "\"script\":{\"type\":\"@Script\","
+      "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\",\"kind\":\"script\"},"
+      "\"tokenPos\":5}}",
+      vmlib.index());
+
+  // Unrecognized breakpoint subcommand.
+  service_msg =
+      Eval(lib, "[0, port, ['debug', 'breakpoints', '1', 'green'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_STREQ("{\"type\":\"Error\",\"id\":\"\","
+                "\"message\":\"Unrecognized subcommand: green\","
+                "\"request\":{\"arguments\":[\"debug\",\"breakpoints\","
+                                            "\"1\",\"green\"],"
+                             "\"option_keys\":[],\"option_values\":[]}}",
+               handler.msg());
+
+  // Clear breakpoint.
+  service_msg =
+      Eval(lib, "[0, port, ['debug', 'breakpoints', '1', 'clear'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_STREQ("{\"type\":\"Success\",\"id\":\"\"}",
+               handler.msg());
 
   // Get the breakpoint list.
   service_msg = Eval(lib, "[0, port, ['debug', 'breakpoints'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
-      "{\"type\":\"BreakpointList\",\"breakpoints\":[{"
-          "\"type\":\"Breakpoint\",\"id\":1,\"enabled\":true,"
-          "\"resolved\":false,"
-          "\"location\":{\"type\":\"Location\","
-                        "\"script\":\"test-lib\",\"tokenPos\":5}}]}",
-      handler.msg());
-
-  // Individual breakpoint.
-  service_msg = Eval(lib, "[0, port, ['debug', 'breakpoints', '1'], [], []]");
-  Service::HandleIsolateMessage(isolate, service_msg);
-  handler.HandleNextMessage();
-  EXPECT_STREQ(
-      "{\"type\":\"Breakpoint\",\"id\":1,\"enabled\":true,"
-       "\"resolved\":false,"
-       "\"location\":{\"type\":\"Location\","
-                     "\"script\":\"test-lib\",\"tokenPos\":5}}",
+      "{\"type\":\"BreakpointList\",\"id\":\"debug\\/breakpoints\","
+      "\"breakpoints\":[]}",
       handler.msg());
 
   // Missing sub-command.
@@ -318,24 +374,12 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ("{\"type\":\"Error\",\"id\":\"\","
-                "\"message\":\"Unrecognized breakpoint id 1111\","
+                "\"message\":\"Unrecognized breakpoint id: 1111\","
                 "\"request\":{"
                     "\"arguments\":[\"debug\",\"breakpoints\",\"1111\"],"
                     "\"option_keys\":[],\"option_values\":[]}}",
                handler.msg());
 
-  // Command too long.
-  service_msg =
-      Eval(lib, "[0, port, ['debug', 'breakpoints', '1111', 'green'], [], []]");
-  Service::HandleIsolateMessage(isolate, service_msg);
-  handler.HandleNextMessage();
-  EXPECT_STREQ("{\"type\":\"Error\",\"id\":\"\","
-                "\"message\":\"Command too long\","
-                "\"request\":{\"arguments\":[\"debug\",\"breakpoints\","
-                                            "\"1111\",\"green\"],"
-                             "\"option_keys\":[],\"option_values\":[]}}",
-               handler.msg());
-
   // Unrecognized subcommand.
   service_msg = Eval(lib, "[0, port, ['debug', 'nosferatu'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
@@ -348,6 +392,98 @@
 }
 
 
+// Globals used to communicate with HandlerPausedEvent.
+static intptr_t pause_line_number = 0;
+static Dart_Handle saved_lib;
+static ServiceTestMessageHandler* saved_handler = NULL;
+
+static void HandlePausedEvent(Dart_IsolateId isolate_id,
+                              intptr_t bp_id,
+                              const Dart_CodeLocation& loc) {
+  Isolate* isolate = Isolate::Current();
+  Debugger* debugger = isolate->debugger();
+
+  // The debugger knows that it is paused, and why.
+  EXPECT(debugger->IsPaused());
+  const DebuggerEvent* event = debugger->PauseEvent();
+  EXPECT(event != NULL);
+  EXPECT(event->type() == DebuggerEvent::kBreakpointReached);
+
+  // Save the last line number seen by this handler.
+  pause_line_number = event->top_frame()->LineNumber();
+
+  // Single step
+  Array& service_msg = Array::Handle();
+  service_msg = Eval(saved_lib,
+                     "[0, port, ['debug', 'resume'], "
+                     "['step'], ['into']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  saved_handler->HandleNextMessage();
+  EXPECT_STREQ("{\"type\":\"Success\",\"id\":\"\"}",
+               saved_handler->msg());
+}
+
+
+TEST_CASE(Service_Stepping) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "var value = 0;\n"
+      "\n"
+      "main() {\n"   // We set breakpoint here.
+      "  value++;\n"
+      "  value++;\n"
+      "  value++;\n"
+      "}";           // We step up to here.
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& vmlib = Library::Handle();
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
+  saved_lib = lib;
+
+  // Build a mock message handler and wrap it in a dart port.
+  ServiceTestMessageHandler handler;
+  saved_handler = &handler;
+  Dart_Port port_id = PortMap::CreatePort(&handler);
+  Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+
+  Array& service_msg = Array::Handle();
+
+  // Add a breakpoint.
+  service_msg = EvalF(lib,
+                      "[0, port, ['libraries', '%" Pd "', "
+                      "'scripts', 'test-lib', 'setBreakpoint'], "
+                      "['line'], ['4']]",
+                      vmlib.index());
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  ExpectSubstringF(
+      handler.msg(),
+      "{\"type\":\"Breakpoint\",\"id\":\"debug\\/breakpoints\\/1\","
+      "\"breakpointNumber\":1,\"enabled\":true,\"resolved\":false,"
+      "\"location\":{\"type\":\"Location\","
+      "\"script\":{\"type\":\"@Script\","
+      "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\",\"kind\":\"script\"},"
+      "\"tokenPos\":11}}",
+      vmlib.index());
+
+  pause_line_number = -1;
+  Dart_SetPausedEventHandler(HandlePausedEvent);
+
+  // Run the program.
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // We were able to step to the last line in main.
+  EXPECT_EQ(8, pause_line_number);
+}
+
+
 TEST_CASE(Service_Objects) {
   // TODO(turnidge): Extend this test to cover a non-trivial stack trace.
   const char* kScript =
@@ -625,17 +761,17 @@
       "  lst = new List<String>(100);\n"
       "}\n";
   Isolate* isolate = Isolate::Current();
-  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
-  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
-  const Class& class_foo = Class::Handle(GetClass(lib, "Foo"));
+  Library& vmlib = Library::Handle();
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
+  const Class& class_foo = Class::Handle(GetClass(vmlib, "Foo"));
   EXPECT(!class_foo.IsNull());
-  Dart_Handle foo = Dart_GetField(h_lib, NewString("foo"));
-  Dart_Handle lst = Dart_GetField(h_lib, NewString("lst"));
+  Dart_Handle foo = Dart_GetField(lib, NewString("foo"));
+  Dart_Handle lst = Dart_GetField(lib, NewString("lst"));
   const intptr_t kElemIndex = 42;
   {
     Dart_EnterScope();
@@ -646,7 +782,7 @@
       EXPECT_VALID(Dart_SetField(foo, NewString("f0"), h_foo0));
       Dart_Handle id0 = Dart_NewInteger(ring->GetIdForObject(foo0.raw()));
       EXPECT_VALID(id0);
-      EXPECT_VALID(Dart_SetField(h_lib, NewString("id0"), id0));
+      EXPECT_VALID(Dart_SetField(lib, NewString("id0"), id0));
     }
     {
       const String& foo1 = String::Handle(String::New("foo1", Heap::kOld));
@@ -654,7 +790,7 @@
       EXPECT_VALID(Dart_SetField(foo, NewString("f1"), h_foo1));
       Dart_Handle id1 = Dart_NewInteger(ring->GetIdForObject(foo1.raw()));
       EXPECT_VALID(id1);
-      EXPECT_VALID(Dart_SetField(h_lib, NewString("id1"), id1));
+      EXPECT_VALID(Dart_SetField(lib, NewString("id1"), id1));
     }
     {
       const String& elem = String::Handle(String::New("elem", Heap::kOld));
@@ -662,7 +798,7 @@
       EXPECT_VALID(Dart_ListSetAt(lst, kElemIndex, h_elem));
       Dart_Handle idElem = Dart_NewInteger(ring->GetIdForObject(elem.raw()));
       EXPECT_VALID(idElem);
-      EXPECT_VALID(Dart_SetField(h_lib, NewString("idElem"), idElem));
+      EXPECT_VALID(Dart_SetField(lib, NewString("idElem"), idElem));
     }
     Dart_ExitScope();
   }
@@ -672,12 +808,12 @@
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
   Array& service_msg = Array::Handle();
 
   // Retaining path to 'foo0', limit 2.
   service_msg = Eval(
-      h_lib,
+      lib,
       "[0, port, ['objects', '$id0', 'retaining_path'], ['limit'], ['2']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -692,7 +828,7 @@
 
   // Retaining path to 'foo1', limit 2.
   service_msg = Eval(
-      h_lib,
+      lib,
       "[0, port, ['objects', '$id1', 'retaining_path'], ['limit'], ['2']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -707,7 +843,7 @@
 
   // Retaining path to 'elem', limit 2.
   service_msg = Eval(
-      h_lib,
+      lib,
       "[0, port, ['objects', '$idElem', 'retaining_path'], ['limit'], ['2']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -730,44 +866,35 @@
       "}";
 
   Isolate* isolate = Isolate::Current();
-  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
-
-  // Find the current library.
-  intptr_t lib_id = -1;
-  const GrowableObjectArray& libs =
-      GrowableObjectArray::Handle(isolate->object_store()->libraries());
-  for (intptr_t i = 0; i < libs.Length(); i++) {
-    if (libs.At(i) == lib.raw()) {
-      lib_id = i;
-    }
-  }
-  ASSERT(lib_id > 0);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& vmlib = Library::Handle();
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
 
   // Build a mock message handler and wrap it in a dart port.
   ServiceTestMessageHandler handler;
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
   Array& service_msg = Array::Handle();
 
   // Request library.
-  service_msg = EvalF(h_lib,
-                      "[0, port, ['libraries', '%" Pd "'], [], []]", lib_id);
+  service_msg = EvalF(lib,
+                      "[0, port, ['libraries', '%" Pd "'], [], []]",
+                      vmlib.index());
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Library\"", handler.msg());
   EXPECT_SUBSTRING("\"url\":\"test-lib\"", handler.msg());
 
   // Evaluate an expression from a library.
-  service_msg = EvalF(h_lib,
+  service_msg = EvalF(lib,
                       "[0, port, ['libraries', '%" Pd "', 'eval'], "
-                      "['expr'], ['libVar - 1']]", lib_id);
+                      "['expr'], ['libVar - 1']]",
+                      vmlib.index());
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   handler.filterMsg("name");
@@ -802,14 +929,14 @@
       "}";
 
   Isolate* isolate = Isolate::Current();
-  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
-  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& vmlib = Library::Handle();
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
-  const Class& class_a = Class::Handle(GetClass(lib, "A"));
+  const Class& class_a = Class::Handle(GetClass(vmlib, "A"));
   EXPECT(!class_a.IsNull());
   intptr_t cid = class_a.id();
 
@@ -818,12 +945,12 @@
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
   Array& service_msg = Array::Handle();
 
   // Request an invalid class id.
-  service_msg = Eval(h_lib, "[0, port, ['classes', '999999'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['classes', '999999'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
@@ -833,7 +960,7 @@
     "\"option_keys\":[],\"option_values\":[]}}", handler.msg());
 
   // Request the class A over the service.
-  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "'], [], []]", cid);
+  service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "'], [], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg());
@@ -844,7 +971,7 @@
   ExpectSubstringF(handler.msg(), "\"endTokenPos\":");
 
   // Evaluate an expression from class A.
-  service_msg = EvalF(h_lib,
+  service_msg = EvalF(lib,
                       "[0, port, ['classes', '%" Pd "', 'eval'], "
                       "['expr'], ['cobra + 100000']]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
@@ -859,7 +986,7 @@
       handler.msg());
 
   // Request function 0 from class A.
-  service_msg = EvalF(h_lib,
+  service_msg = EvalF(lib,
                       "[0, port, ['classes', '%" Pd "', 'functions', '0'],"
                       "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
@@ -870,8 +997,8 @@
                    "\"name\":\"get:a\",", cid);
 
   // Request field 0 from class A.
-  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'fields', '0'],"
-                              "[], []]", cid);
+  service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'fields', '0'],"
+                      "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Field\"", handler.msg());
@@ -880,8 +1007,8 @@
                    "\"name\":\"a\",", cid);
 
   // Invalid sub command.
-  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'huh', '0'],"
-                              "[], []]", cid);
+  service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'huh', '0'],"
+                      "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(),
@@ -891,8 +1018,8 @@
     "\"option_values\":[]}}", cid);
 
   // Invalid field request.
-  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'fields', '9'],"
-                              "[], []]", cid);
+  service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'fields', '9'],"
+                      "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(),
@@ -901,9 +1028,9 @@
     "\"option_keys\":[],\"option_values\":[]}}", cid);
 
   // Invalid function request.
-  service_msg = EvalF(h_lib,
+  service_msg = EvalF(lib,
                       "[0, port, ['classes', '%" Pd "', 'functions', '9'],"
-                    "[], []]", cid);
+                      "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(),
@@ -913,7 +1040,7 @@
 
 
   // Invalid field subcommand.
-  service_msg = EvalF(h_lib,
+  service_msg = EvalF(lib,
                       "[0, port, ['classes', '%" Pd "', 'fields', '9', 'x']"
                       ",[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
@@ -925,7 +1052,7 @@
     "\"option_keys\":[],\"option_values\":[]}}", cid);
 
   // Invalid function command.
-  service_msg = EvalF(h_lib,
+  service_msg = EvalF(lib,
                       "[0, port, ['classes', '%" Pd "', 'functions', '0',"
                       "'x', 'y'], [], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
@@ -937,7 +1064,7 @@
     "\"option_keys\":[],\"option_values\":[]}}", cid);
 
   // Invalid function subcommand with valid function id.
-  service_msg = EvalF(h_lib,
+  service_msg = EvalF(lib,
                       "[0, port, ['classes', '%" Pd "', 'functions', '0',"
                       "'x'], [], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
@@ -949,11 +1076,11 @@
     "\"option_keys\":[],\"option_values\":[]}}", cid);
 
   // Retained size of all instances of class B.
-  const Class& class_b = Class::Handle(GetClass(lib, "B"));
+  const Class& class_b = Class::Handle(GetClass(vmlib, "B"));
   EXPECT(!class_b.IsNull());
   const Instance& b0 = Instance::Handle(Instance::New(class_b));
   const Instance& b1 = Instance::Handle(Instance::New(class_b));
-  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'retained'],"
+  service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'retained'],"
                       "[], []]", class_b.id());
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -961,7 +1088,7 @@
                    "\"id\":\"objects\\/int-%" Pd "\"",
                    b0.raw()->Size() + b1.raw()->Size());
   // ... and list the instances of class B.
-  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'instances'],"
+  service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'instances'],"
                       "['limit'], ['3']]", class_b.id());
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -979,7 +1106,7 @@
   EXPECT((list.At(0) == b0.raw() && list.At(1) == b1.raw()) ||
          (list.At(0) == b1.raw() && list.At(1) == b0.raw()));
   // ... and if limit is 1, we one get one of them.
-  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'instances'],"
+  service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'instances'],"
                       "['limit'], ['1']]", class_b.id());
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -999,14 +1126,14 @@
       "}";
 
   Isolate* isolate = Isolate::Current();
-  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
-  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& vmlib = Library::Handle();
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
-  const Class& class_a = Class::Handle(GetClass(lib, "A"));
+  const Class& class_a = Class::Handle(GetClass(vmlib, "A"));
   EXPECT(!class_a.IsNull());
   intptr_t cid = class_a.id();
 
@@ -1015,12 +1142,12 @@
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
   Array& service_msg = Array::Handle();
 
   // Request the class A over the service.
-  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "'], [], []]", cid);
+  service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "'], [], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg());
@@ -1029,7 +1156,7 @@
                    "\"id\":\"classes\\/%" Pd "\"", cid);
 
   // Request canonical type 0 from class A.
-  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'types', '0'],"
+  service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'types', '0'],"
                               "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -1039,7 +1166,7 @@
                    "\"id\":\"classes\\/%" Pd "\\/types\\/0\"", cid);
 
   // Request canonical type 1 from class A.
-  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'types', '1'],"
+  service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'types', '1'],"
                               "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -1049,8 +1176,8 @@
                    "\"id\":\"classes\\/%" Pd "\\/types\\/1\"", cid);
 
   // Request for non-existent canonical type from class A.
-  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'types', '42'],"
-                              "[], []]", cid);
+  service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'types', '42'],"
+                      "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(),
@@ -1061,15 +1188,15 @@
     "\"option_keys\":[],\"option_values\":[]}}", cid);
 
   // Request canonical type arguments. Expect <A<bool>> to be listed.
-  service_msg = EvalF(h_lib, "[0, port, ['typearguments'],"
-                              "[], []]");
+  service_msg = EvalF(lib, "[0, port, ['typearguments'],"
+                      "[], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"TypeArgumentsList\"", handler.msg());
   ExpectSubstringF(handler.msg(), "\"name\":\"<A<bool>>\",");
 
   // Request canonical type arguments with instantiations.
-  service_msg = EvalF(h_lib,
+  service_msg = EvalF(lib,
                       "[0, port, ['typearguments', 'withinstantiations'],"
                       "[], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
@@ -1097,14 +1224,14 @@
       "}";
 
   Isolate* isolate = Isolate::Current();
-  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
-  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& vmlib = Library::Handle();
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
-  const Class& class_a = Class::Handle(GetClass(lib, "A"));
+  const Class& class_a = Class::Handle(GetClass(vmlib, "A"));
   EXPECT(!class_a.IsNull());
   const Function& function_c = Function::Handle(GetFunction(class_a, "c"));
   EXPECT(!function_c.IsNull());
@@ -1121,12 +1248,12 @@
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
   Array& service_msg = Array::Handle();
 
   // Request an invalid code object.
-  service_msg = Eval(h_lib, "[0, port, ['code', '0'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['code', '0'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_STREQ(
@@ -1136,7 +1263,7 @@
 
   // The following test checks that a code object can be found only
   // at compile_timestamp()-code.EntryPoint().
-  service_msg = EvalF(h_lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]",
+  service_msg = EvalF(lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]",
                       compile_timestamp,
                       entry);
   Service::HandleIsolateMessage(isolate, service_msg);
@@ -1155,7 +1282,7 @@
   // Request code object at compile_timestamp-code.EntryPoint() + 16
   // Expect this to fail because the address is not the entry point.
   uintptr_t address = entry + 16;
-  service_msg = EvalF(h_lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]",
+  service_msg = EvalF(lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]",
                       compile_timestamp,
                       address);
   Service::HandleIsolateMessage(isolate, service_msg);
@@ -1174,7 +1301,7 @@
   // Request code object at (compile_timestamp - 1)-code.EntryPoint()
   // Expect this to fail because the timestamp is wrong.
   address = entry;
-  service_msg = EvalF(h_lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]",
+  service_msg = EvalF(lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]",
                       compile_timestamp - 1,
                       address);
   Service::HandleIsolateMessage(isolate, service_msg);
@@ -1192,7 +1319,7 @@
 
   // Request native code at address. Expect the null code object back.
   address = last;
-  service_msg = EvalF(h_lib, "[0, port, ['code', 'native-%" Px "'], [], []]",
+  service_msg = EvalF(lib, "[0, port, ['code', 'native-%" Px "'], [], []]",
                       address);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -1201,7 +1328,7 @@
                handler.msg());
 
   // Request malformed native code.
-  service_msg = EvalF(h_lib, "[0, port, ['code', 'native%" Px "'], [], []]",
+  service_msg = EvalF(lib, "[0, port, ['code', 'native%" Px "'], [], []]",
                       address);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -1298,26 +1425,26 @@
       "}";
 
   Isolate* isolate = Isolate::Current();
-  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& vmlib = Library::Handle();
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
 
   // Build a mock message handler and wrap it in a dart port.
   ServiceTestMessageHandler handler;
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
   Array& service_msg = Array::Handle();
   char buf[1024];
   OS::SNPrint(buf, sizeof(buf),
       "[0, port, ['libraries', '%" Pd "', 'scripts', 'test-lib'], [], []]",
-      lib.index());
+      vmlib.index());
 
-  service_msg = Eval(h_lib, buf);
+  service_msg = Eval(lib, buf);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   OS::SNPrint(buf, sizeof(buf),
@@ -1330,7 +1457,7 @@
       "\"url\":\"test-lib\"},"
       "\"source\":\"var port;\\n\\nmain() {\\n}\","
       "\"tokenPosTable\":[[1,0,1,1,5,2,9],[3,5,1,6,5,7,6,8,8],[4,10,1]]}",
-      lib.index(), lib.index());
+      vmlib.index(), vmlib.index());
   EXPECT_STREQ(buf, handler.msg());
 }
 
@@ -1349,12 +1476,12 @@
       "}";
 
   Isolate* isolate = Isolate::Current();
-  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
-  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& vmlib = Library::Handle();
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 
   // Build a mock message handler and wrap it in a dart port.
@@ -1362,31 +1489,21 @@
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
   Array& service_msg = Array::Handle();
-  service_msg = Eval(h_lib, "[0, port, ['coverage'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['coverage'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
 
-  // Look up the service id for the library containg the test-lib script.
-  const GrowableObjectArray& libs =
-      GrowableObjectArray::Handle(isolate->object_store()->libraries());
-  intptr_t i;
-  for (i = 0; i < libs.Length(); i++) {
-    if (libs.At(i) == lib.raw()) {
-      break;
-    }
-  }
-  ASSERT(i != libs.Length());
-
   char buf[1024];
   OS::SNPrint(buf, sizeof(buf),
-      "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
-      "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
-      "\"kind\":\"script\"},\"hits\":"
-      "[5,1,6,1]}", i);
+              "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
+              "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
+              "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+              "\"kind\":\"script\"},\"hits\":"
+              "[5,1,6,1]}",
+              vmlib.index());
   EXPECT_SUBSTRING(buf, handler.msg());
 }
 
@@ -1402,12 +1519,12 @@
       "}";
 
   Isolate* isolate = Isolate::Current();
-  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
-  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& vmlib = Library::Handle();
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 
   // Build a mock message handler and wrap it in a dart port.
@@ -1415,16 +1532,16 @@
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
   Array& service_msg = Array::Handle();
   char buf[1024];
   OS::SNPrint(buf, sizeof(buf),
       "[0, port, ['libraries', '%" Pd  "', 'scripts', 'test-lib', 'coverage'], "
       "[], []]",
-      lib.index());
+      vmlib.index());
 
-  service_msg = Eval(h_lib, buf);
+  service_msg = Eval(lib, buf);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   OS::SNPrint(buf, sizeof(buf),
@@ -1432,7 +1549,7 @@
       "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
       "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
       "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
-      "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}", lib.index());
+      "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}", vmlib.index());
   EXPECT_STREQ(buf, handler.msg());
 }
 
@@ -1448,12 +1565,12 @@
       "}";
 
   Isolate* isolate = Isolate::Current();
-  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
-  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& vmlib = Library::Handle();
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 
   // Build a mock message handler and wrap it in a dart port.
@@ -1461,32 +1578,24 @@
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
-  // Look up the service id for the library containg the test-lib script.
-  const GrowableObjectArray& libs =
-      GrowableObjectArray::Handle(isolate->object_store()->libraries());
-  intptr_t i;
-  for (i = 0; i < libs.Length(); i++) {
-    if (libs.At(i) == lib.raw()) {
-      break;
-    }
-  }
-  ASSERT(i != libs.Length());
   char buf[1024];
   OS::SNPrint(buf, sizeof(buf),
-              "[0, port, ['libraries', '%" Pd "', 'coverage'], [], []]", i);
+              "[0, port, ['libraries', '%" Pd "', 'coverage'], [], []]",
+              vmlib.index());
 
   Array& service_msg = Array::Handle();
-  service_msg = Eval(h_lib, buf);
+  service_msg = Eval(lib, buf);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   OS::SNPrint(buf, sizeof(buf),
-      "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
-      "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
-      "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
-      "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}", lib.index());
+              "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
+              "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
+              "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
+              "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+              "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}",
+              vmlib.index());
   EXPECT_STREQ(buf, handler.msg());
 }
 
@@ -1509,12 +1618,12 @@
       "}";
 
   Isolate* isolate = Isolate::Current();
-  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
-  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& vmlib = Library::Handle();
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 
   // Build a mock message handler and wrap it in a dart port.
@@ -1522,11 +1631,11 @@
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
   // Look up the service id of Foo.
   const Class& cls = Class::Handle(
-      lib.LookupClass(String::Handle(String::New("Foo"))));
+      vmlib.LookupClass(String::Handle(String::New("Foo"))));
   ASSERT(!cls.IsNull());
   ClassTable* table = isolate->class_table();
   intptr_t i;
@@ -1541,15 +1650,16 @@
               "[0, port, ['classes', '%" Pd "', 'coverage'], [], []]", i);
 
   Array& service_msg = Array::Handle();
-  service_msg = Eval(h_lib, buf);
+  service_msg = Eval(lib, buf);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   OS::SNPrint(buf, sizeof(buf),
-      "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
-      "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
-      "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
-      "\"kind\":\"script\"},\"hits\":[5,1,7,4,8,3]}]}", lib.index());
+              "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
+              "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
+              "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
+              "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+              "\"kind\":\"script\"},\"hits\":[5,1,7,4,8,3]}]}",
+              vmlib.index());
   EXPECT_STREQ(buf, handler.msg());
 }
 
@@ -1573,12 +1683,12 @@
       "}";
 
   Isolate* isolate = Isolate::Current();
-  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
-  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& vmlib = Library::Handle();
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 
   // Build a mock message handler and wrap it in a dart port.
@@ -1586,11 +1696,11 @@
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
   // Look up the service id of Foo.
   const Class& cls = Class::Handle(
-      lib.LookupClass(String::Handle(String::New("Foo"))));
+      vmlib.LookupClass(String::Handle(String::New("Foo"))));
   ASSERT(!cls.IsNull());
   ClassTable* table = isolate->class_table();
   intptr_t i;
@@ -1615,7 +1725,7 @@
               "'% " Pd "', 'coverage'], [], []]", i,  function_id);
 
   Array& service_msg = Array::Handle();
-  service_msg = Eval(h_lib, buf);
+  service_msg = Eval(lib, buf);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   OS::SNPrint(buf, sizeof(buf),
@@ -1623,7 +1733,7 @@
       "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
       "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
       "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
-      "\"kind\":\"script\"},\"hits\":[7,4,8,3]}]}", lib.index());
+      "\"kind\":\"script\"},\"hits\":[7,4,8,3]}]}", vmlib.index());
   EXPECT_STREQ(buf, handler.msg());
 }
 
@@ -1641,12 +1751,9 @@
       "}";
 
   Isolate* isolate = Isolate::Current();
-  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
-  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 
   // Build a mock message handler and wrap it in a dart port.
@@ -1654,29 +1761,29 @@
   Dart_Port port_id = PortMap::CreatePort(&handler);
   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
   EXPECT_VALID(port);
-  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
 
   Array& service_msg = Array::Handle();
-  service_msg = Eval(h_lib, "[0, port, ['allocationprofile'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['allocationprofile'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg());
 
   // Too long.
-  service_msg = Eval(h_lib, "[0, port, ['allocationprofile', 'foo'], [], []]");
+  service_msg = Eval(lib, "[0, port, ['allocationprofile', 'foo'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
 
   // Bad gc option.
-  service_msg = Eval(h_lib,
+  service_msg = Eval(lib,
                      "[0, port, ['allocationprofile'], ['gc'], ['cat']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
 
   // Bad reset option.
-  service_msg = Eval(h_lib,
+  service_msg = Eval(lib,
                      "[0, port, ['allocationprofile'], ['reset'], ['ff']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -1684,20 +1791,20 @@
 
   // Good reset.
   service_msg =
-      Eval(h_lib, "[0, port, ['allocationprofile'], ['reset'], ['true']]");
+      Eval(lib, "[0, port, ['allocationprofile'], ['reset'], ['true']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg());
 
   // Good GC.
   service_msg =
-      Eval(h_lib, "[0, port, ['allocationprofile'], ['gc'], ['full']]");
+      Eval(lib, "[0, port, ['allocationprofile'], ['gc'], ['full']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg());
 
   // Good GC and reset.
-  service_msg = Eval(h_lib,
+  service_msg = Eval(lib,
       "[0, port, ['allocationprofile'], ['gc', 'reset'], ['full', 'true']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
@@ -1877,18 +1984,17 @@
 }
 
 
-// TODO(zra): Remove when tests are ready to enable.
-#if !defined(TARGET_ARCH_ARM64)
-
-TEST_CASE(Service_Profile) {
+TEST_CASE(Service_MetricsList) {
   const char* kScript =
-      "var port;\n"  // Set to our mock port by C++.
-      "\n"
-      "var x = 7;\n"
-      "main() {\n"
-      "  x = x * x;\n"
-      "  x = x / 13;\n"
-      "}";
+    "import 'dart:profiler';\n"
+    "var port;\n"  // Set to our mock port by C++.
+    "\n"
+    "main() {\n"
+    "  var counter = new Counter('a.b.c', 'description');\n"
+    "  Metrics.register(counter);\n"
+    "  return counter;\n"
+    "}\n"
+    "";
 
   Isolate* isolate = Isolate::Current();
   Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
@@ -1907,19 +2013,102 @@
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
   Array& service_msg = Array::Handle();
-  service_msg = Eval(h_lib, "[0, port, ['profile'], [], []]");
+  service_msg = Eval(h_lib, "[0, port, ['metrics'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  // Expect MetricList.
+  // TODO(johnmccutchan): Test that list length is 1.
+  EXPECT_SUBSTRING("\"type\":\"MetricList\"", handler.msg());
+}
+
+
+TEST_CASE(Service_Metric) {
+  const char* kScript =
+    "import 'dart:profiler';\n"
+    "var port;\n"  // Set to our mock port by C++.
+    "\n"
+    "main() {\n"
+    "  var counter = new Counter('a.b.c', 'description');\n"
+    "  Metrics.register(counter);\n"
+    "  return counter;\n"
+    "}\n"
+    "";
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(h_lib);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
+  EXPECT(!lib.IsNull());
+  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // Build a mock message handler and wrap it in a dart port.
+  ServiceTestMessageHandler handler;
+  Dart_Port port_id = PortMap::CreatePort(&handler);
+  Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+
+  // Request existing metric.
+  Array& service_msg = Array::Handle();
+  service_msg = Eval(h_lib, "[0, port, ['metrics', 'a.b.c'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+
+  // Expect Counter.
+  EXPECT_SUBSTRING("\"type\":\"Counter\"", handler.msg());
+
+  // Request invalid metric.
+  service_msg = Eval(h_lib, "[0, port, ['metrics', 'a.b.c.d'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+
+  // Expect error.
+  EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
+}
+
+
+// TODO(zra): Remove when tests are ready to enable.
+#if !defined(TARGET_ARCH_ARM64)
+
+TEST_CASE(Service_Profile) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "var x = 7;\n"
+      "main() {\n"
+      "  x = x * x;\n"
+      "  x = x / 13;\n"
+      "}";
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // Build a mock message handler and wrap it in a dart port.
+  ServiceTestMessageHandler handler;
+  Dart_Port port_id = PortMap::CreatePort(&handler);
+  Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+
+  Array& service_msg = Array::Handle();
+  service_msg = Eval(lib, "[0, port, ['profile'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   // Expect profile
   EXPECT_SUBSTRING("\"type\":\"Profile\"", handler.msg());
 
-  service_msg = Eval(h_lib, "[0, port, ['profile'], ['tags'], ['hide']]");
+  service_msg = Eval(lib, "[0, port, ['profile'], ['tags'], ['hide']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   // Expect profile
   EXPECT_SUBSTRING("\"type\":\"Profile\"", handler.msg());
 
-  service_msg = Eval(h_lib, "[0, port, ['profile'], ['tags'], ['hidden']]");
+  service_msg = Eval(lib, "[0, port, ['profile'], ['tags'], ['hidden']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   // Expect error.
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index dd1c050..8ddaff9 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -136,6 +136,12 @@
          ((1 << RawObject::kWatchedBit) | (1 << RawObject::kMarkBit)));
   ASSERT((kObjectAlignmentMask & kObjectId) == kObjectId);
   const Snapshot* snapshot = reinterpret_cast<const Snapshot*>(raw_memory);
+  // If the raw length is negative or greater than what the local machine can
+  // handle, then signal an error.
+  int64_t snapshot_length = ReadUnaligned(&snapshot->unaligned_length_);
+  if ((snapshot_length < 0) || (snapshot_length > kIntptrMax)) {
+    return NULL;
+  }
   return snapshot;
 }
 
@@ -745,7 +751,7 @@
   ASSERT(Utils::IsAligned(size, kObjectAlignment));
   Heap* heap = isolate()->heap();
 
-  uword address = heap->TryAllocate(size, Heap::kOld);
+  uword address = heap->TryAllocate(size, Heap::kOld, PageSpace::kForceGrowth);
   if (address == 0) {
     // Use the preallocated out of memory exception to avoid calling
     // into dart code or allocating any code.
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 0d5d54f..6a0a3bc 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -142,24 +142,32 @@
 
   // Getters.
   const uint8_t* content() const { return content_; }
-  intptr_t length() const { return static_cast<intptr_t>(length_); }
-  Kind kind() const { return static_cast<Kind>(kind_); }
+  intptr_t length() const {
+    return static_cast<intptr_t>(ReadUnaligned(&unaligned_length_));
+  }
+  Kind kind() const {
+    return static_cast<Kind>(ReadUnaligned(&unaligned_kind_));
+  }
 
-  bool IsMessageSnapshot() const { return kind_ == kMessage; }
-  bool IsScriptSnapshot() const { return kind_ == kScript; }
-  bool IsFullSnapshot() const { return kind_ == kFull; }
+  bool IsMessageSnapshot() const { return kind() == kMessage; }
+  bool IsScriptSnapshot() const { return kind() == kScript; }
+  bool IsFullSnapshot() const { return kind() == kFull; }
   uint8_t* Addr() { return reinterpret_cast<uint8_t*>(this); }
 
-  static intptr_t length_offset() { return OFFSET_OF(Snapshot, length_); }
+  static intptr_t length_offset() {
+    return OFFSET_OF(Snapshot, unaligned_length_);
+  }
   static intptr_t kind_offset() {
-    return OFFSET_OF(Snapshot, kind_);
+    return OFFSET_OF(Snapshot, unaligned_kind_);
   }
 
  private:
-  Snapshot() : length_(0), kind_(kFull) {}
+  // Prevent Snapshot from ever being allocated directly.
+  Snapshot();
 
-  int64_t length_;  // Stream length.
-  int64_t kind_;  // Kind of snapshot.
+  // The following fields are potentially unaligned.
+  int64_t unaligned_length_;  // Stream length.
+  int64_t unaligned_kind_;  // Kind of snapshot.
   uint8_t content_[];  // Stream content.
 
   DISALLOW_COPY_AND_ASSIGN(Snapshot);
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 666a853..ee8909b 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -1205,7 +1205,8 @@
 
     // Load the library.
     Dart_Handle import_lib = Dart_LoadLibrary(NewString("dart_import_lib"),
-                                              NewString(kLibScriptChars));
+                                              NewString(kLibScriptChars),
+                                              0, 0);
     EXPECT_VALID(import_lib);
 
     // Create a test library and Load up a test script in it.
@@ -1375,7 +1376,8 @@
 
     // Load the library.
     Dart_Handle import_lib = Dart_LoadLibrary(NewString("dart_import_lib"),
-                                              NewString(kLibScriptChars));
+                                              NewString(kLibScriptChars),
+                                              0, 0);
     EXPECT_VALID(import_lib);
 
     // Create a test library and Load up a test script in it.
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index fddf7f9..95e0d45 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -27,8 +27,6 @@
     "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
-DECLARE_FLAG(bool, enable_debugger);
-
 // Input parameters:
 //   LR : return address.
 //   SP : address of last argument in argument array.
@@ -1252,14 +1250,13 @@
 #endif  // DEBUG
 
   Label stepping, done_stepping;
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    __ ldr(R6, FieldAddress(CTX, Context::isolate_offset()));
-    __ ldrb(R6, Address(R6, Isolate::single_step_offset()));
-    __ CompareImmediate(R6, 0);
-    __ b(&stepping, NE);
-    __ Bind(&done_stepping);
-  }
+
+  // Check single stepping.
+  __ ldr(R6, FieldAddress(CTX, Context::isolate_offset()));
+  __ ldrb(R6, Address(R6, Isolate::single_step_offset()));
+  __ CompareImmediate(R6, 0);
+  __ b(&stepping, NE);
+  __ Bind(&done_stepping);
 
   // Load arguments descriptor into R4.
   __ ldr(R4, FieldAddress(R5, ICData::arguments_descriptor_offset()));
@@ -1363,15 +1360,13 @@
   __ AddImmediate(R2, Instructions::HeaderSize() - kHeapObjectTag);
   __ bx(R2);
 
-  if (FLAG_enable_debugger) {
-    __ Bind(&stepping);
-    __ EnterStubFrame();
-    __ Push(R5);  // Preserve IC data.
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ Pop(R5);
-    __ LeaveStubFrame();
-    __ b(&done_stepping);
-  }
+  __ Bind(&stepping);
+  __ EnterStubFrame();
+  __ Push(R5);  // Preserve IC data.
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ Pop(R5);
+  __ LeaveStubFrame();
+  __ b(&done_stepping);
 }
 
 
@@ -1455,20 +1450,18 @@
   }
 #endif  // DEBUG
 
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    Label not_stepping;
-    __ ldr(R6, FieldAddress(CTX, Context::isolate_offset()));
-    __ ldrb(R6, Address(R6, Isolate::single_step_offset()));
-    __ CompareImmediate(R6, 0);
-    __ b(&not_stepping, EQ);
-    __ EnterStubFrame();
-    __ Push(R5);  // Preserve IC data.
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ Pop(R5);
-    __ LeaveStubFrame();
-    __ Bind(&not_stepping);
-  }
+  // Check single stepping.
+  Label not_stepping;
+  __ ldr(R6, FieldAddress(CTX, Context::isolate_offset()));
+  __ ldrb(R6, Address(R6, Isolate::single_step_offset()));
+  __ CompareImmediate(R6, 0);
+  __ b(&not_stepping, EQ);
+  __ EnterStubFrame();
+  __ Push(R5);  // Preserve IC data.
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ Pop(R5);
+  __ LeaveStubFrame();
+  __ Bind(&not_stepping);
 
   // R5: IC data object (preserved).
   __ ldr(R6, FieldAddress(R5, ICData::ic_data_offset()));
@@ -1572,18 +1565,17 @@
 // Called only from unoptimized code. All relevant registers have been saved.
 void StubCode::GenerateDebugStepCheckStub(
     Assembler* assembler) {
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    Label not_stepping;
-    __ ldr(R1, FieldAddress(CTX, Context::isolate_offset()));
-    __ ldrb(R1, Address(R1, Isolate::single_step_offset()));
-    __ CompareImmediate(R1, 0);
-    __ b(&not_stepping, EQ);
-    __ EnterStubFrame();
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ LeaveStubFrame();
-    __ Bind(&not_stepping);
-  }
+  // Check single stepping.
+  Label not_stepping;
+  __ ldr(R1, FieldAddress(CTX, Context::isolate_offset()));
+  __ ldrb(R1, Address(R1, Isolate::single_step_offset()));
+  __ CompareImmediate(R1, 0);
+  __ b(&not_stepping, EQ);
+  __ EnterStubFrame();
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ LeaveStubFrame();
+  __ Bind(&not_stepping);
+
   __ Ret();
 }
 
@@ -1831,18 +1823,16 @@
 // Return Zero condition flag set if equal.
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    Label not_stepping;
-    __ ldr(R1, FieldAddress(CTX, Context::isolate_offset()));
-    __ ldrb(R1, Address(R1, Isolate::single_step_offset()));
-    __ CompareImmediate(R1, 0);
-    __ b(&not_stepping, EQ);
-    __ EnterStubFrame();
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ LeaveStubFrame();
-    __ Bind(&not_stepping);
-  }
+  // Check single stepping.
+  Label not_stepping;
+  __ ldr(R1, FieldAddress(CTX, Context::isolate_offset()));
+  __ ldrb(R1, Address(R1, Isolate::single_step_offset()));
+  __ CompareImmediate(R1, 0);
+  __ b(&not_stepping, EQ);
+  __ EnterStubFrame();
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ LeaveStubFrame();
+  __ Bind(&not_stepping);
 
   const Register temp = R2;
   const Register left = R1;
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 4331fce..b8534fe 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -26,8 +26,6 @@
     "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
-DECLARE_FLAG(bool, enable_debugger);
-
 // Input parameters:
 //   LR : return address.
 //   SP : address of last argument in argument array.
@@ -1347,15 +1345,13 @@
 #endif  // DEBUG
 
   Label stepping, done_stepping;
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset(), kNoPP);
-    __ LoadFromOffset(
-        R6, R6, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
-    __ CompareRegisters(R6, ZR);
-    __ b(&stepping, NE);
-    __ Bind(&done_stepping);
-  }
+  // Check single stepping.
+  __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadFromOffset(
+      R6, R6, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
+  __ CompareRegisters(R6, ZR);
+  __ b(&stepping, NE);
+  __ Bind(&done_stepping);
 
   // Load arguments descriptor into R4.
   __ LoadFieldFromOffset(R4, R5, ICData::arguments_descriptor_offset(), kNoPP);
@@ -1471,15 +1467,13 @@
       R2, R2, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
   __ br(R2);
 
-  if (FLAG_enable_debugger) {
-    __ Bind(&stepping);
-    __ EnterStubFrame();
-    __ Push(R5);  // Preserve IC data.
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ Pop(R5);
-    __ LeaveStubFrame();
-    __ b(&done_stepping);
-  }
+  __ Bind(&stepping);
+  __ EnterStubFrame();
+  __ Push(R5);  // Preserve IC data.
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ Pop(R5);
+  __ LeaveStubFrame();
+  __ b(&done_stepping);
 }
 
 
@@ -1561,21 +1555,19 @@
   }
 #endif  // DEBUG
 
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    Label not_stepping;
-    __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset(), kNoPP);
-    __ LoadFromOffset(
-        R6, R6, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
-    __ CompareImmediate(R6, 0, kNoPP);
-    __ b(&not_stepping, EQ);
-    __ EnterStubFrame();
-    __ Push(R5);  // Preserve IC data.
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ Pop(R5);
-    __ LeaveStubFrame();
-    __ Bind(&not_stepping);
-  }
+  // Check single stepping.
+  Label not_stepping;
+  __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadFromOffset(
+      R6, R6, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
+  __ CompareImmediate(R6, 0, kNoPP);
+  __ b(&not_stepping, EQ);
+  __ EnterStubFrame();
+  __ Push(R5);  // Preserve IC data.
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ Pop(R5);
+  __ LeaveStubFrame();
+  __ Bind(&not_stepping);
 
   // R5: IC data object (preserved).
   __ LoadFieldFromOffset(R6, R5, ICData::ic_data_offset(), kNoPP);
@@ -1682,19 +1674,18 @@
 // Called only from unoptimized code. All relevant registers have been saved.
 void StubCode::GenerateDebugStepCheckStub(
     Assembler* assembler) {
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    Label not_stepping;
-    __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP);
-    __ LoadFromOffset(
-        R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
-    __ CompareImmediate(R1, 0, kNoPP);
-    __ b(&not_stepping, EQ);
-    __ EnterStubFrame();
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ LeaveStubFrame();
-    __ Bind(&not_stepping);
-  }
+  // Check single stepping.
+  Label not_stepping;
+  __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadFromOffset(
+      R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
+  __ CompareImmediate(R1, 0, kNoPP);
+  __ b(&not_stepping, EQ);
+  __ EnterStubFrame();
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ LeaveStubFrame();
+  __ Bind(&not_stepping);
+
   __ ret();
 }
 
@@ -1932,19 +1923,17 @@
 // Return Zero condition flag set if equal.
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
-  if (FLAG_enable_debugger) {
     // Check single stepping.
-    Label not_stepping;
-    __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP);
-    __ LoadFromOffset(
-        R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
-    __ CompareImmediate(R1, 0, kNoPP);
-    __ b(&not_stepping, EQ);
-    __ EnterStubFrame();
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ LeaveStubFrame();
-    __ Bind(&not_stepping);
-  }
+  Label not_stepping;
+  __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadFromOffset(
+      R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
+  __ CompareImmediate(R1, 0, kNoPP);
+  __ b(&not_stepping, EQ);
+  __ EnterStubFrame();
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ LeaveStubFrame();
+  __ Bind(&not_stepping);
 
   const Register left = R1;
   const Register right = R0;
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 407c555..65f1c10 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -29,8 +29,6 @@
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 DEFINE_FLAG(bool, verify_incoming_contexts, false, "");
 
-DECLARE_FLAG(bool, enable_debugger);
-
 // Input parameters:
 //   ESP : points to return address.
 //   ESP + 4 : address of last argument in argument array.
@@ -1294,13 +1292,11 @@
 #endif  // DEBUG
 
   Label stepping, done_stepping;
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
-    __ cmpb(Address(EAX, Isolate::single_step_offset()), Immediate(0));
-    __ j(NOT_EQUAL, &stepping);
-    __ Bind(&done_stepping);
-  }
+  // Check single stepping.
+  __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
+  __ cmpb(Address(EAX, Isolate::single_step_offset()), Immediate(0));
+  __ j(NOT_EQUAL, &stepping);
+  __ Bind(&done_stepping);
 
   // ECX: IC data object (preserved).
   // Load arguments descriptor into EDX.
@@ -1410,15 +1406,13 @@
   __ jmp(EBX);
   __ int3();
 
-  if (FLAG_enable_debugger) {
-    __ Bind(&stepping);
-    __ EnterStubFrame();
-    __ pushl(ECX);
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ popl(ECX);
-    __ LeaveFrame();
-    __ jmp(&done_stepping);
-  }
+  __ Bind(&stepping);
+  __ EnterStubFrame();
+  __ pushl(ECX);
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ popl(ECX);
+  __ LeaveFrame();
+  __ jmp(&done_stepping);
 }
 
 
@@ -1514,21 +1508,19 @@
     __ Bind(&ok);
   }
 #endif  // DEBUG
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    Label not_stepping;
-    __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
-    __ movzxb(EAX, Address(EAX, Isolate::single_step_offset()));
-    __ cmpl(EAX, Immediate(0));
-    __ j(EQUAL, &not_stepping, Assembler::kNearJump);
+  // Check single stepping.
+  Label not_stepping;
+  __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
+  __ movzxb(EAX, Address(EAX, Isolate::single_step_offset()));
+  __ cmpl(EAX, Immediate(0));
+  __ j(EQUAL, &not_stepping, Assembler::kNearJump);
 
-    __ EnterStubFrame();
-    __ pushl(ECX);
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ popl(ECX);
-    __ LeaveFrame();
-    __ Bind(&not_stepping);
-  }
+  __ EnterStubFrame();
+  __ pushl(ECX);
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ popl(ECX);
+  __ LeaveFrame();
+  __ Bind(&not_stepping);
 
   // ECX: IC data object (preserved).
   __ movl(EBX, FieldAddress(ECX, ICData::ic_data_offset()));
@@ -1642,19 +1634,18 @@
 
 // Called only from unoptimized code.
 void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    Label not_stepping;
-    __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
-    __ movzxb(EAX, Address(EAX, Isolate::single_step_offset()));
-    __ cmpl(EAX, Immediate(0));
-    __ j(EQUAL, &not_stepping, Assembler::kNearJump);
+  // Check single stepping.
+  Label not_stepping;
+  __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
+  __ movzxb(EAX, Address(EAX, Isolate::single_step_offset()));
+  __ cmpl(EAX, Immediate(0));
+  __ j(EQUAL, &not_stepping, Assembler::kNearJump);
 
-    __ EnterStubFrame();
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ LeaveFrame();
-    __ Bind(&not_stepping);
-  }
+  __ EnterStubFrame();
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ LeaveFrame();
+  __ Bind(&not_stepping);
+
   __ ret();
 }
 
@@ -1904,19 +1895,17 @@
 // Returns ZF set.
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    Label not_stepping;
-    __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
-    __ movzxb(EAX, Address(EAX, Isolate::single_step_offset()));
-    __ cmpl(EAX, Immediate(0));
-    __ j(EQUAL, &not_stepping, Assembler::kNearJump);
+  // Check single stepping.
+  Label not_stepping;
+  __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
+  __ movzxb(EAX, Address(EAX, Isolate::single_step_offset()));
+  __ cmpl(EAX, Immediate(0));
+  __ j(EQUAL, &not_stepping, Assembler::kNearJump);
 
-    __ EnterStubFrame();
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ LeaveFrame();
-    __ Bind(&not_stepping);
-  }
+  __ EnterStubFrame();
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ LeaveFrame();
+  __ Bind(&not_stepping);
 
   const Register left = EAX;
   const Register right = EDX;
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index c28eae6..0273779 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -26,8 +26,6 @@
     "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
-DECLARE_FLAG(bool, enable_debugger);
-
 // Input parameters:
 //   RA : return address.
 //   SP : address of last argument in argument array.
@@ -1405,13 +1403,11 @@
 
 
   Label stepping, done_stepping;
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
-    __ lbu(T0, Address(T0, Isolate::single_step_offset()));
-    __ BranchNotEqual(T0, 0, &stepping);
-    __ Bind(&done_stepping);
-  }
+  // Check single stepping.
+  __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
+  __ lbu(T0, Address(T0, Isolate::single_step_offset()));
+  __ BranchNotEqual(T0, 0, &stepping);
+  __ Bind(&done_stepping);
 
   // Load argument descriptor into S4.
   __ lw(S4, FieldAddress(S5, ICData::arguments_descriptor_offset()));
@@ -1546,20 +1542,18 @@
   __ AddImmediate(T4, Instructions::HeaderSize() - kHeapObjectTag);
   __ jr(T4);
 
-  if (FLAG_enable_debugger) {
-    // Call single step callback in debugger.
-    __ Bind(&stepping);
-    __ EnterStubFrame();
-    __ addiu(SP, SP, Immediate(-2 * kWordSize));
-    __ sw(S5, Address(SP, 1 * kWordSize));  // Preserve IC data.
-    __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ lw(RA, Address(SP, 0 * kWordSize));
-    __ lw(S5, Address(SP, 1 * kWordSize));
-    __ addiu(SP, SP, Immediate(2 * kWordSize));
-    __ LeaveStubFrame();
-    __ b(&done_stepping);
-  }
+  // Call single step callback in debugger.
+  __ Bind(&stepping);
+  __ EnterStubFrame();
+  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ sw(S5, Address(SP, 1 * kWordSize));  // Preserve IC data.
+  __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ lw(RA, Address(SP, 0 * kWordSize));
+  __ lw(S5, Address(SP, 1 * kWordSize));
+  __ addiu(SP, SP, Immediate(2 * kWordSize));
+  __ LeaveStubFrame();
+  __ b(&done_stepping);
 }
 
 
@@ -1643,24 +1637,22 @@
   }
 #endif  // DEBUG
 
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    Label not_stepping;
-    __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
-    __ lbu(T0, Address(T0, Isolate::single_step_offset()));
-    __ BranchEqual(T0, 0, &not_stepping);
-    // Call single step callback in debugger.
-    __ EnterStubFrame();
-    __ addiu(SP, SP, Immediate(-2 * kWordSize));
-    __ sw(S5, Address(SP, 1 * kWordSize));  // Preserve IC data.
-    __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ lw(RA, Address(SP, 0 * kWordSize));
-    __ lw(S5, Address(SP, 1 * kWordSize));
-    __ addiu(SP, SP, Immediate(2 * kWordSize));
-    __ LeaveStubFrame();
-    __ Bind(&not_stepping);
-  }
+  // Check single stepping.
+  Label not_stepping;
+  __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
+  __ lbu(T0, Address(T0, Isolate::single_step_offset()));
+  __ BranchEqual(T0, 0, &not_stepping);
+  // Call single step callback in debugger.
+  __ EnterStubFrame();
+  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ sw(S5, Address(SP, 1 * kWordSize));  // Preserve IC data.
+  __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ lw(RA, Address(SP, 0 * kWordSize));
+  __ lw(S5, Address(SP, 1 * kWordSize));
+  __ addiu(SP, SP, Immediate(2 * kWordSize));
+  __ LeaveStubFrame();
+  __ Bind(&not_stepping);
 
   // S5: IC data object (preserved).
   __ lw(T0, FieldAddress(S5, ICData::ic_data_offset()));
@@ -1786,22 +1778,21 @@
 // Called only from unoptimized code. All relevant registers have been saved.
 // RA: return address.
 void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    Label not_stepping;
-    __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
-    __ lbu(T0, Address(T0, Isolate::single_step_offset()));
-    __ BranchEqual(T0, 0, &not_stepping);
-    // Call single step callback in debugger.
-    __ EnterStubFrame();
-    __ addiu(SP, SP, Immediate(-1 * kWordSize));
-    __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ lw(RA, Address(SP, 0 * kWordSize));
-    __ addiu(SP, SP, Immediate(1 * kWordSize));
-    __ LeaveStubFrame();
-    __ Bind(&not_stepping);
-  }
+  // Check single stepping.
+  Label not_stepping;
+  __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
+  __ lbu(T0, Address(T0, Isolate::single_step_offset()));
+  __ BranchEqual(T0, 0, &not_stepping);
+  // Call single step callback in debugger.
+  __ EnterStubFrame();
+  __ addiu(SP, SP, Immediate(-1 * kWordSize));
+  __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ lw(RA, Address(SP, 0 * kWordSize));
+  __ addiu(SP, SP, Immediate(1 * kWordSize));
+  __ LeaveStubFrame();
+  __ Bind(&not_stepping);
+
   __ Ret();
 }
 
@@ -2072,22 +2063,20 @@
 // Returns: CMPRES1 is zero if equal, non-zero otherwise.
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    Label not_stepping;
-    __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
-    __ lbu(T0, Address(T0, Isolate::single_step_offset()));
-    __ BranchEqual(T0, 0, &not_stepping);
-    // Call single step callback in debugger.
-    __ EnterStubFrame();
-    __ addiu(SP, SP, Immediate(-1 * kWordSize));
-    __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ lw(RA, Address(SP, 0 * kWordSize));
-    __ addiu(SP, SP, Immediate(1 * kWordSize));
-    __ LeaveStubFrame();
-    __ Bind(&not_stepping);
-  }
+  // Check single stepping.
+  Label not_stepping;
+  __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
+  __ lbu(T0, Address(T0, Isolate::single_step_offset()));
+  __ BranchEqual(T0, 0, &not_stepping);
+  // Call single step callback in debugger.
+  __ EnterStubFrame();
+  __ addiu(SP, SP, Immediate(-1 * kWordSize));
+  __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ lw(RA, Address(SP, 0 * kWordSize));
+  __ addiu(SP, SP, Immediate(1 * kWordSize));
+  __ LeaveStubFrame();
+  __ Bind(&not_stepping);
 
   const Register temp1 = T2;
   const Register temp2 = T3;
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index c5456fd..59b4ce3 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -27,8 +27,6 @@
     "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
-DECLARE_FLAG(bool, enable_debugger);
-
 // Input parameters:
 //   RSP : points to return address.
 //   RSP + 8 : address of last argument in argument array.
@@ -1268,13 +1266,11 @@
 #endif  // DEBUG
 
   Label stepping, done_stepping;
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
-    __ cmpb(Address(RAX, Isolate::single_step_offset()), Immediate(0));
-    __ j(NOT_EQUAL, &stepping);
-    __ Bind(&done_stepping);
-  }
+  // Check single stepping.
+  __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
+  __ cmpb(Address(RAX, Isolate::single_step_offset()), Immediate(0));
+  __ j(NOT_EQUAL, &stepping);
+  __ Bind(&done_stepping);
 
   // Load arguments descriptor into R10.
   __ movq(R10, FieldAddress(RBX, ICData::arguments_descriptor_offset()));
@@ -1378,15 +1374,13 @@
   __ addq(RCX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ jmp(RCX);
 
-  if (FLAG_enable_debugger) {
-    __ Bind(&stepping);
-    __ EnterStubFrame();
-    __ pushq(RBX);
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ popq(RBX);
-    __ LeaveStubFrame();
-    __ jmp(&done_stepping);
-  }
+  __ Bind(&stepping);
+  __ EnterStubFrame();
+  __ pushq(RBX);
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ popq(RBX);
+  __ LeaveStubFrame();
+  __ jmp(&done_stepping);
 }
 
 
@@ -1481,20 +1475,18 @@
   }
 #endif  // DEBUG
 
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    Label not_stepping;
-    __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
-    __ movzxb(RAX, Address(RAX, Isolate::single_step_offset()));
-    __ cmpq(RAX, Immediate(0));
-    __ j(EQUAL, &not_stepping, Assembler::kNearJump);
-    __ EnterStubFrame();
-    __ pushq(RBX);  // Preserve IC data object.
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ popq(RBX);
-    __ LeaveStubFrame();
-    __ Bind(&not_stepping);
-  }
+  // Check single stepping.
+  Label not_stepping;
+  __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
+  __ movzxb(RAX, Address(RAX, Isolate::single_step_offset()));
+  __ cmpq(RAX, Immediate(0));
+  __ j(EQUAL, &not_stepping, Assembler::kNearJump);
+  __ EnterStubFrame();
+  __ pushq(RBX);  // Preserve IC data object.
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ popq(RBX);
+  __ LeaveStubFrame();
+  __ Bind(&not_stepping);
 
   // RBX: IC data object (preserved).
   __ movq(R12, FieldAddress(RBX, ICData::ic_data_offset()));
@@ -1608,19 +1600,18 @@
 
 // Called only from unoptimized code.
 void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    Label not_stepping;
-    __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
-    __ movzxb(RAX, Address(RAX, Isolate::single_step_offset()));
-    __ cmpq(RAX, Immediate(0));
-    __ j(EQUAL, &not_stepping, Assembler::kNearJump);
+  // Check single stepping.
+  Label not_stepping;
+  __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
+  __ movzxb(RAX, Address(RAX, Isolate::single_step_offset()));
+  __ cmpq(RAX, Immediate(0));
+  __ j(EQUAL, &not_stepping, Assembler::kNearJump);
 
-    __ EnterStubFrame();
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ LeaveStubFrame();
-    __ Bind(&not_stepping);
-  }
+  __ EnterStubFrame();
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ LeaveStubFrame();
+  __ Bind(&not_stepping);
+
   __ ret();
 }
 
@@ -1875,18 +1866,16 @@
 // Returns ZF set.
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
-  if (FLAG_enable_debugger) {
-    // Check single stepping.
-    Label not_stepping;
-    __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
-    __ movzxb(RAX, Address(RAX, Isolate::single_step_offset()));
-    __ cmpq(RAX, Immediate(0));
-    __ j(EQUAL, &not_stepping, Assembler::kNearJump);
-    __ EnterStubFrame();
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ LeaveStubFrame();
-    __ Bind(&not_stepping);
-  }
+  // Check single stepping.
+  Label not_stepping;
+  __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
+  __ movzxb(RAX, Address(RAX, Isolate::single_step_offset()));
+  __ cmpq(RAX, Immediate(0));
+  __ j(EQUAL, &not_stepping, Assembler::kNearJump);
+  __ EnterStubFrame();
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ LeaveStubFrame();
+  __ Bind(&not_stepping);
 
   const Register left = RAX;
   const Register right = RDX;
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index 5f1d8d00..627fde6 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -6,6 +6,7 @@
 
 #include "vm/handles.h"
 #include "vm/handles_impl.h"
+#include "vm/hash_table.h"
 #include "vm/isolate.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
@@ -35,9 +36,6 @@
 #undef DEFINE_KEYWORD_SYMBOL_INDEX
 };
 
-intptr_t Symbols::num_of_grows_;
-intptr_t Symbols::collision_count_[kMaxCollisionBuckets];
-
 DEFINE_FLAG(bool, dump_symbol_stats, false, "Dump symbol table statistics");
 
 
@@ -61,30 +59,17 @@
   // Should only be run by the vm isolate.
   ASSERT(isolate == Dart::vm_isolate());
 
-  if (FLAG_dump_symbol_stats) {
-    num_of_grows_ = 0;
-    for (intptr_t i = 0; i < kMaxCollisionBuckets; i++) {
-      collision_count_[i] = 0;
-    }
-  }
-
   // Create and setup a symbol table in the vm isolate.
   SetupSymbolTable(isolate);
 
   // Create all predefined symbols.
   ASSERT((sizeof(names) / sizeof(const char*)) == Symbols::kNullCharId);
-  ObjectStore* object_store = isolate->object_store();
-  Array& symbol_table = Array::Handle();
-
 
   // First set up all the predefined string symbols.
   for (intptr_t i = 1; i < Symbols::kKwTableStart; i++) {
-    // The symbol_table needs to be reloaded as it might have grown in the
-    // previous iteration.
-    symbol_table = object_store->symbol_table();
     String* str = String::ReadOnlyHandle();
     *str = OneByteString::New(names[i], Heap::kOld);
-    Add(symbol_table, *str);
+    AddToVMIsolate(*str);
     symbol_handles_[i] = str;
   }
   Object::RegisterSingletonClassNames();
@@ -100,54 +85,154 @@
 
   // Add Latin1 characters as Symbols, so that Symbols::FromCharCode is fast.
   for (intptr_t c = 0; c < kNumberOfOneCharCodeSymbols; c++) {
-    // The symbol_table needs to be reloaded as it might have grown in the
-    // previous iteration.
-    symbol_table = object_store->symbol_table();
     intptr_t idx = (kNullCharId + c);
     ASSERT(idx < kMaxPredefinedId);
     ASSERT(Utf::IsLatin1(c));
     uint8_t ch = static_cast<uint8_t>(c);
     String* str = String::ReadOnlyHandle();
     *str = OneByteString::New(&ch, 1, Heap::kOld);
-    Add(symbol_table, *str);
+    AddToVMIsolate(*str);
     predefined_[c] = str->raw();
     symbol_handles_[idx] = str;
   }
 }
 
 
+RawString* StringFrom(const uint8_t* data, intptr_t len, Heap::Space space) {
+  return String::FromLatin1(data, len, space);
+}
+RawString* StringFrom(const uint16_t* data, intptr_t len, Heap::Space space) {
+  return String::FromUTF16(data, len, space);
+}
+RawString* StringFrom(const int32_t* data, intptr_t len, Heap::Space space) {
+  return String::FromUTF32(data, len, space);
+}
+
+
+template<typename CharType>
+class CharArray {
+ public:
+  CharArray(const CharType* data, intptr_t len)
+      : data_(data), len_(len) {
+    hash_ = String::Hash(data, len);
+  }
+  RawString* ToSymbol() const {
+    String& result = String::Handle(StringFrom(data_, len_, Heap::kOld));
+    result.SetCanonical();
+    result.SetHash(hash_);
+    return result.raw();
+  }
+  bool Equals(const String& other) const {
+    return other.Equals(data_, len_);
+  }
+  intptr_t Hash() const { return hash_; }
+ private:
+  const CharType* data_;
+  intptr_t len_;
+  intptr_t hash_;
+};
+typedef CharArray<uint8_t> Latin1Array;
+typedef CharArray<uint16_t> UTF16Array;
+typedef CharArray<int32_t> UTF32Array;
+
+
+class StringSlice {
+ public:
+  StringSlice(const String& str, intptr_t begin_index, intptr_t length)
+      : str_(str), begin_index_(begin_index), len_(length) {
+    hash_ = is_all() ? str.Hash() : String::Hash(str, begin_index, length);
+  }
+  RawString* ToSymbol() const;
+  bool Equals(const String& other) const {
+    return other.Equals(str_, begin_index_, len_);
+  }
+  intptr_t Hash() const { return hash_; }
+ private:
+  bool is_all() const { return begin_index_ == 0 && len_ == str_.Length(); }
+  const String& str_;
+  intptr_t begin_index_;
+  intptr_t len_;
+  intptr_t hash_;
+};
+
+
+RawString* StringSlice::ToSymbol() const {
+  if (is_all() && str_.IsOld()) {
+    str_.SetCanonical();
+    return str_.raw();
+  } else {
+    String& result = String::Handle(
+        String::SubString(str_, begin_index_, len_, Heap::kOld));
+    result.SetCanonical();
+    result.SetHash(hash_);
+    return result.raw();
+  }
+}
+
+
+class SymbolTraits {
+ public:
+  static bool IsMatch(const Object& a, const Object& b) {
+    return String::Cast(a).Equals(String::Cast(b));
+  }
+  template<typename CharType>
+  static bool IsMatch(const CharArray<CharType>& array, const Object& obj) {
+    return array.Equals(String::Cast(obj));
+  }
+  static bool IsMatch(const StringSlice& slice, const Object& obj) {
+    return slice.Equals(String::Cast(obj));
+  }
+  static uword Hash(const Object& key) {
+    return String::Cast(key).Hash();
+  }
+  template<typename CharType>
+  static uword Hash(const CharArray<CharType>& array) {
+    return array.Hash();
+  }
+  static uword Hash(const StringSlice& slice) {
+    return slice.Hash();
+  }
+  template<typename CharType>
+  static RawObject* NewKey(const CharArray<CharType>& array) {
+    return array.ToSymbol();
+  }
+  static RawObject* NewKey(const StringSlice& slice) {
+    return slice.ToSymbol();
+  }
+};
+typedef UnorderedHashSet<SymbolTraits> SymbolTable;
+
+
 void Symbols::SetupSymbolTable(Isolate* isolate) {
   ASSERT(isolate != NULL);
 
   // Setup the symbol table used within the String class.
   const intptr_t initial_size = (isolate == Dart::vm_isolate()) ?
       kInitialVMIsolateSymtabSize : kInitialSymtabSize;
-  const Array& array = Array::Handle(Array::New(initial_size + 1, Heap::kOld));
-
-  // Last element contains the count of used slots.
-  array.SetAt(initial_size, Smi::Handle(Smi::New(0)));
+  Array& array =
+      Array::Handle(HashTables::New<SymbolTable>(initial_size, Heap::kOld));
   isolate->object_store()->set_symbol_table(array);
 }
 
 
-intptr_t Symbols::Size(Isolate* isolate) {
+void Symbols::GetStats(Isolate* isolate, intptr_t* size, intptr_t* capacity) {
   ASSERT(isolate != NULL);
-  Array& symbol_table = Array::Handle(isolate,
-                                      isolate->object_store()->symbol_table());
-  intptr_t table_size_index = symbol_table.Length() - 1;
-  dart::Smi& used = Smi::Handle();
-  used ^= symbol_table.At(table_size_index);
-  return used.Value();
+  SymbolTable table(isolate, isolate->object_store()->symbol_table());
+  *size = table.NumOccupied();
+  *capacity = table.NumEntries();
+  table.Release();
 }
 
 
-void Symbols::Add(const Array& symbol_table, const String& str) {
+void Symbols::AddToVMIsolate(const String& str) {
   // Should only be run by the vm isolate.
   ASSERT(Isolate::Current() == Dart::vm_isolate());
-  intptr_t hash = str.Hash();
-  intptr_t index = FindIndex(symbol_table, str, 0, str.Length(), hash);
-  ASSERT(symbol_table.At(index) == String::null());
-  InsertIntoSymbolTable(symbol_table, str, index);
+  Isolate* isolate = Dart::vm_isolate();
+  SymbolTable table(isolate, isolate->object_store()->symbol_table());
+  bool present = table.Insert(str);
+  str.SetCanonical();
+  ASSERT(!present);
+  isolate->object_store()->set_symbol_table(table.Release());
 }
 
 
@@ -179,71 +264,41 @@
 
 
 RawString* Symbols::FromLatin1(const uint8_t* latin1_array, intptr_t len) {
-  return NewSymbol(latin1_array, len, String::FromLatin1);
+  return NewSymbol(Latin1Array(latin1_array, len));
 }
 
 
 RawString* Symbols::FromUTF16(const uint16_t* utf16_array, intptr_t len) {
-  return NewSymbol(utf16_array, len, String::FromUTF16);
+  return NewSymbol(UTF16Array(utf16_array, len));
 }
 
 
 RawString* Symbols::FromUTF32(const int32_t* utf32_array, intptr_t len) {
-  return NewSymbol(utf32_array, len, String::FromUTF32);
+  return NewSymbol(UTF32Array(utf32_array, len));
 }
 
 
-template<typename CharacterType, typename CallbackType>
-RawString* Symbols::NewSymbol(const CharacterType* characters,
-                              intptr_t len,
-                              CallbackType new_string) {
+// StringType can be StringSlice, Latin1Array, UTF16Array or UTF32Array.
+template<typename StringType>
+RawString* Symbols::NewSymbol(const StringType& str) {
   Isolate* isolate = Isolate::Current();
-  String& symbol = String::Handle(isolate, String::null());
-  Array& symbol_table = Array::Handle(isolate, Array::null());
-
-  // Calculate the String hash for this sequence of characters.
-  intptr_t hash = String::Hash(characters, len);
-
-  // First check if a symbol exists in the vm isolate for these characters.
-  symbol_table = Dart::vm_isolate()->object_store()->symbol_table();
-  intptr_t index = FindIndex(symbol_table, characters, len, hash);
-  symbol ^= symbol_table.At(index);
+  String& symbol = String::Handle(isolate);
+  {
+    Isolate* vm_isolate = Dart::vm_isolate();
+    SymbolTable table(isolate, vm_isolate->object_store()->symbol_table());
+    symbol ^= table.GetOrNull(str);
+    table.Release();
+  }
   if (symbol.IsNull()) {
-    // Now try in the symbol table of the current isolate.
-    symbol_table = isolate->object_store()->symbol_table();
-    index = FindIndex(symbol_table, characters, len, hash);
-    // Since we leave enough room in the table to guarantee, that we find an
-    // empty spot, index is the insertion point if symbol is null.
-    symbol ^= symbol_table.At(index);
-    if (symbol.IsNull()) {
-      // Allocate new result string.
-      symbol = (*new_string)(characters, len, Heap::kOld);
-      symbol.SetHash(hash);  // Remember the calculated hash value.
-      InsertIntoSymbolTable(symbol_table, symbol, index);
-    }
+    SymbolTable table(isolate, isolate->object_store()->symbol_table());
+    symbol ^= table.InsertNewOrGet(str);
+    isolate->object_store()->set_symbol_table(table.Release());
   }
   ASSERT(symbol.IsSymbol());
   return symbol.raw();
 }
 
 
-template RawString* Symbols::NewSymbol(const uint8_t* characters,
-                                       intptr_t len,
-                                       RawString* (*new_string)(const uint8_t*,
-                                                                intptr_t,
-                                                                Heap::Space));
-template RawString* Symbols::NewSymbol(const uint16_t* characters,
-                                       intptr_t len,
-                                       RawString* (*new_string)(const uint16_t*,
-                                                                intptr_t,
-                                                                Heap::Space));
-template RawString* Symbols::NewSymbol(const int32_t* characters,
-                                       intptr_t len,
-                                       RawString* (*new_string)(const int32_t*,
-                                                                intptr_t,
-                                                                Heap::Space));
-
-
 RawString* Symbols::New(const String& str) {
   if (str.IsSymbol()) {
     return str.raw();
@@ -253,43 +308,7 @@
 
 
 RawString* Symbols::New(const String& str, intptr_t begin_index, intptr_t len) {
-  ASSERT(begin_index >= 0);
-  ASSERT(len >= 0);
-  ASSERT((begin_index + len) <= str.Length());
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate != Dart::vm_isolate());
-  String& symbol = String::Handle(isolate, String::null());
-  Array& symbol_table = Array::Handle(isolate, Array::null());
-
-  // Calculate the String hash for this sequence of characters.
-  intptr_t hash = (begin_index == 0 && len == str.Length()) ? str.Hash() :
-      String::Hash(str, begin_index, len);
-
-  // First check if a symbol exists in the vm isolate for these characters.
-  symbol_table = Dart::vm_isolate()->object_store()->symbol_table();
-  intptr_t index = FindIndex(symbol_table, str, begin_index, len, hash);
-  symbol ^= symbol_table.At(index);
-  if (symbol.IsNull()) {
-    // Now try in the symbol table of the current isolate.
-    symbol_table = isolate->object_store()->symbol_table();
-    index = FindIndex(symbol_table, str, begin_index, len, hash);
-    // Since we leave enough room in the table to guarantee, that we find an
-    // empty spot, index is the insertion point if symbol is null.
-    symbol ^= symbol_table.At(index);
-    if (symbol.IsNull()) {
-      if (str.IsOld() && begin_index == 0 && len == str.Length()) {
-        // Reuse the incoming str as the symbol value.
-        symbol = str.raw();
-      } else {
-        // Allocate a copy in old space.
-        symbol = String::SubString(str, begin_index, len, Heap::kOld);
-        symbol.SetHash(hash);
-      }
-      InsertIntoSymbolTable(symbol_table, symbol, index);
-    }
-  }
-  ASSERT(symbol.IsSymbol());
-  return symbol.raw();
+  return NewSymbol(StringSlice(str, begin_index, len));
 }
 
 
@@ -303,163 +322,22 @@
 
 void Symbols::DumpStats() {
   if (FLAG_dump_symbol_stats) {
-    intptr_t table_size = 0;
-    dart::Smi& used = Smi::Handle();
-    Array& symbol_table = Array::Handle(Array::null());
-
+    intptr_t size = -1;
+    intptr_t capacity = -1;
     // First dump VM symbol table stats.
-    symbol_table = Dart::vm_isolate()->object_store()->symbol_table();
-    table_size = symbol_table.Length() - 1;
-    used ^= symbol_table.At(table_size);
-    OS::Print("VM Isolate: Number of symbols : %" Pd "\n", used.Value());
-    OS::Print("VM Isolate: Symbol table capacity : %" Pd "\n", table_size);
-
+    GetStats(Dart::vm_isolate(), &size, &capacity);
+    OS::Print("VM Isolate: Number of symbols : %" Pd "\n", size);
+    OS::Print("VM Isolate: Symbol table capacity : %" Pd "\n", capacity);
     // Now dump regular isolate symbol table stats.
-    symbol_table = Isolate::Current()->object_store()->symbol_table();
-    table_size = symbol_table.Length() - 1;
-    used ^= symbol_table.At(table_size);
-    OS::Print("Isolate: Number of symbols : %" Pd "\n", used.Value());
-    OS::Print("Isolate: Symbol table capacity : %" Pd "\n", table_size);
-
-    // Dump overall collision and growth counts.
-    OS::Print("Number of symbol table grows = %" Pd "\n", num_of_grows_);
-    OS::Print("Collision counts on add and lookup :\n");
-    intptr_t i = 0;
-    for (i = 0; i < (kMaxCollisionBuckets - 1); i++) {
-      OS::Print("  %" Pd " collisions => %" Pd "\n", i, collision_count_[i]);
-    }
-    OS::Print("  > %" Pd " collisions => %" Pd "\n", i, collision_count_[i]);
+    GetStats(Isolate::Current(), &size, &capacity);
+    OS::Print("Isolate: Number of symbols : %" Pd "\n", size);
+    OS::Print("Isolate: Symbol table capacity : %" Pd "\n", capacity);
+    // TODO(koda): Consider recording growth and collision stats in HashTable,
+    // in DEBUG mode.
   }
 }
 
 
-void Symbols::GrowSymbolTable(const Array& symbol_table) {
-  // TODO(iposva): Avoid exponential growth.
-  num_of_grows_ += 1;
-  intptr_t table_size = symbol_table.Length() - 1;
-  intptr_t new_table_size = table_size * 2;
-  Array& new_symbol_table =
-      Array::Handle(Array::New(new_table_size + 1, Heap::kOld));
-  // Copy all elements from the original symbol table to the newly allocated
-  // array.
-  String& element = String::Handle();
-  dart::Object& new_element = Object::Handle();
-  for (intptr_t i = 0; i < table_size; i++) {
-    element ^= symbol_table.At(i);
-    if (!element.IsNull()) {
-      intptr_t hash = element.Hash();
-      intptr_t index = hash % new_table_size;
-      new_element = new_symbol_table.At(index);
-      intptr_t num_collisions = 0;
-      while (!new_element.IsNull()) {
-        index = (index + 1) % new_table_size;  // Move to next element.
-        new_element = new_symbol_table.At(index);
-        num_collisions += 1;
-      }
-      if (FLAG_dump_symbol_stats) {
-        if (num_collisions >= kMaxCollisionBuckets) {
-          num_collisions = (kMaxCollisionBuckets - 1);
-        }
-        collision_count_[num_collisions] += 1;
-      }
-      new_symbol_table.SetAt(index, element);
-    }
-  }
-  // Copy used count.
-  new_element = symbol_table.At(table_size);
-  new_symbol_table.SetAt(new_table_size, new_element);
-  // Remember the new symbol table now.
-  Isolate::Current()->object_store()->set_symbol_table(new_symbol_table);
-}
-
-
-void Symbols::InsertIntoSymbolTable(const Array& symbol_table,
-                                    const String& symbol,
-                                    intptr_t index) {
-  intptr_t table_size = symbol_table.Length() - 1;
-  symbol.SetCanonical();  // Mark object as being canonical.
-  symbol_table.SetAt(index, symbol);  // Remember the new symbol.
-  dart::Smi& used = Smi::Handle();
-  used ^= symbol_table.At(table_size);
-  intptr_t used_elements = used.Value() + 1;  // One more element added.
-  used = Smi::New(used_elements);
-  symbol_table.SetAt(table_size, used);  // Update used count.
-
-  // Rehash if symbol_table is 75% full.
-  if (used_elements > ((table_size / 4) * 3)) {
-    GrowSymbolTable(symbol_table);
-  }
-}
-
-
-template<typename T>
-intptr_t Symbols::FindIndex(const Array& symbol_table,
-                            const T* characters,
-                            intptr_t len,
-                            intptr_t hash) {
-  // Last element of the array is the number of used elements.
-  intptr_t table_size = symbol_table.Length() - 1;
-  intptr_t index = hash % table_size;
-  intptr_t num_collisions = 0;
-
-  String& symbol = String::Handle();
-  symbol ^= symbol_table.At(index);
-  while (!symbol.IsNull() && !symbol.Equals(characters, len)) {
-    index = (index + 1) % table_size;  // Move to next element.
-    symbol ^= symbol_table.At(index);
-    num_collisions += 1;
-  }
-  if (FLAG_dump_symbol_stats) {
-    if (num_collisions >= kMaxCollisionBuckets) {
-      num_collisions = (kMaxCollisionBuckets - 1);
-    }
-    collision_count_[num_collisions] += 1;
-  }
-  return index;  // Index of symbol if found or slot into which to add symbol.
-}
-
-
-template intptr_t Symbols::FindIndex(const Array& symbol_table,
-                                     const uint8_t* characters,
-                                     intptr_t len,
-                                     intptr_t hash);
-template intptr_t Symbols::FindIndex(const Array& symbol_table,
-                                     const uint16_t* characters,
-                                     intptr_t len,
-                                     intptr_t hash);
-template intptr_t Symbols::FindIndex(const Array& symbol_table,
-                                     const int32_t* characters,
-                                     intptr_t len,
-                                     intptr_t hash);
-
-
-intptr_t Symbols::FindIndex(const Array& symbol_table,
-                            const String& str,
-                            intptr_t begin_index,
-                            intptr_t len,
-                            intptr_t hash) {
-  // Last element of the array is the number of used elements.
-  intptr_t table_size = symbol_table.Length() - 1;
-  intptr_t index = hash % table_size;
-  intptr_t num_collisions = 0;
-
-  String& symbol = String::Handle();
-  symbol ^= symbol_table.At(index);
-  while (!symbol.IsNull() && !symbol.Equals(str, begin_index, len)) {
-    index = (index + 1) % table_size;  // Move to next element.
-    symbol ^= symbol_table.At(index);
-    num_collisions += 1;
-  }
-  if (FLAG_dump_symbol_stats) {
-    if (num_collisions >= kMaxCollisionBuckets) {
-      num_collisions = (kMaxCollisionBuckets - 1);
-    }
-    collision_count_[num_collisions] += 1;
-  }
-  return index;  // Index of symbol if found or slot into which to add symbol.
-}
-
-
 intptr_t Symbols::LookupVMSymbol(RawObject* obj) {
   for (intptr_t i = 1; i < Symbols::kMaxPredefinedId; i++) {
     if (symbol_handles_[i]->raw() == obj) {
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 395eca0..319853f 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -68,6 +68,15 @@
   V(Library, "library")                                                        \
   V(LoadLibrary, "loadLibrary")                                                \
   V(_LibraryPrefix, "_LibraryPrefix")                                          \
+  V(Async, "async")                                                            \
+  V(AsyncCompleter, ":async_completer")                                        \
+  V(AsyncOperation, ":async_op")                                               \
+  V(Future, "Future")                                                          \
+  V(FutureConstructor, "Future.")                                              \
+  V(Completer, "Completer")                                                    \
+  V(CompleterComplete, "complete")                                             \
+  V(CompleterConstructor, "Completer.")                                        \
+  V(CompleterFuture, "future")                                                 \
   V(Native, "native")                                                          \
   V(Import, "import")                                                          \
   V(Source, "source")                                                          \
@@ -441,9 +450,6 @@
   // Initialize and setup a symbol table for the isolate.
   static void SetupSymbolTable(Isolate* isolate);
 
-  // Get number of symbols in an isolate's symbol table.
-  static intptr_t Size(Isolate* isolate);
-
   // Creates a Symbol given a C string that is assumed to contain
   // UTF-8 encoded characters and '\0' is considered a termination character.
   // TODO(7123) - Rename this to FromCString(....).
@@ -482,39 +488,20 @@
 
  private:
   enum {
-    kInitialVMIsolateSymtabSize = 512,
+    kInitialVMIsolateSymtabSize = 1024,
     kInitialSymtabSize = 2048
   };
 
-  // Helper functions to create a symbol given a string or set of characters.
-  template<typename CharacterType, typename CallbackType>
-  static RawString* NewSymbol(const CharacterType* characters,
-                              intptr_t len,
-                              CallbackType new_string);
+  static void GetStats(Isolate* isolate,
+                       intptr_t* size,
+                       intptr_t* capacity);
+
+  template<typename StringType>
+  static RawString* NewSymbol(const StringType& str);
 
   // Add the string into the VM isolate symbol table.
-  static void Add(const Array& symbol_table, const String& str);
+  static void AddToVMIsolate(const String& str);
 
-  // Insert symbol into symbol table, growing it if necessary.
-  static void InsertIntoSymbolTable(const Array& symbol_table,
-                                    const String& symbol,
-                                    intptr_t index);
-
-  // Grow the symbol table.
-  static void GrowSymbolTable(const Array& symbol_table);
-
-  // Return index in symbol table if the symbol already exists or
-  // return the index into which the new symbol can be added.
-  template<typename T>
-  static intptr_t FindIndex(const Array& symbol_table,
-                            const T* characters,
-                            intptr_t len,
-                            intptr_t hash);
-  static intptr_t FindIndex(const Array& symbol_table,
-                            const String& str,
-                            intptr_t begin_index,
-                            intptr_t len,
-                            intptr_t hash);
   static intptr_t LookupVMSymbol(RawObject* obj);
   static RawObject* GetVMSymbol(intptr_t object_id);
   static bool IsVMSymbolId(intptr_t object_id) {
@@ -530,11 +517,6 @@
   // List of handles for predefined symbols.
   static String* symbol_handles_[kMaxPredefinedId];
 
-  // Statistics used to measure the efficiency of the symbol table.
-  static const intptr_t kMaxCollisionBuckets = 10;
-  static intptr_t num_of_grows_;
-  static intptr_t collision_count_[kMaxCollisionBuckets];
-
   friend class String;
   friend class SnapshotReader;
   friend class SnapshotWriter;
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 5c0a2c8..3595d4f 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -104,7 +104,8 @@
     return Dart_LoadSource(library,
                            url,
                            Builtin::PartSource(Builtin::kIOLibrary,
-                                               url_chars));
+                                               url_chars),
+                           0, 0);
   }
   return DartUtils::LoadSource(library, url, tag, url_chars);
 }
diff --git a/sdk/bin/docgen b/sdk/bin/docgen
index b5795d0..bf807ad 100755
--- a/sdk/bin/docgen
+++ b/sdk/bin/docgen
@@ -26,10 +26,11 @@
 
 if test -f "$SNAPSHOT"; then
   exec "$BIN_DIR"/dart \
-      "--package-root=$BIN_DIR/../packages/" "$SNAPSHOT" \
-      docgen "--sdk=$SDK_DIR" "$@"
+      "--package-root=$BIN_DIR/../packages/" "--old_gen_heap_size=1024" \
+      "$SNAPSHOT" \
+       docgen "--sdk=$SDK_DIR" "$@"
 else
   exec "$BIN_DIR"/dart \
-      "--package-root=$BIN_DIR/../packages/" \
+      "--package-root=$BIN_DIR/../packages/" "--old_gen_heap_size=1024" \
       "$BIN_DIR/../../pkg/docgen/bin/docgen.dart" "--sdk=$SDK_DIR" "$@"
 fi
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_nodes.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_nodes.dart
index 2733720..73f985b 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_nodes.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library dart_printer;
+library backend_ast_nodes;
 
 import '../dart2jslib.dart' as dart2js;
 import '../tree/tree.dart' as tree;
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/copy_propagator.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/copy_propagator.dart
index 3278224..2701144 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/copy_propagator.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/copy_propagator.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library dart_tree;
+library copy_propagator;
 
 import '../elements/elements.dart';
 import 'tree_ir_nodes.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_builder.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_builder.dart
index 2e12220..fa1cea1 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_builder.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library cps_to_tree;
+library tree_ir_builder;
 
 import '../dart2jslib.dart' as dart2js;
 import '../elements/elements.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_nodes.dart
index 04da473..1fcf4a9 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_nodes.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library tree_ir;
+library tree_ir_nodes;
 
 import '../dart2jslib.dart' as dart2js;
 import '../elements/elements.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/dump_info.dart b/sdk/lib/_internal/compiler/implementation/dump_info.dart
index 6efb119..c5d0db8 100644
--- a/sdk/lib/_internal/compiler/implementation/dump_info.dart
+++ b/sdk/lib/_internal/compiler/implementation/dump_info.dart
@@ -183,7 +183,7 @@
       return null;
     }
 
-    int size = 0;
+    int size = compiler.dumpInfoTask.sizeOf(element);
     String code;
 
     if (emittedCode != null) {
@@ -346,6 +346,7 @@
   // pretty-printed contents.
   final Map<jsAst.Node, int> _nodeToSize = <jsAst.Node, int>{};
   final Map<jsAst.Node, int> _nodeBeforeSize = <jsAst.Node, int>{};
+  final Map<Element, int> _fieldNameToSize = <Element, int>{};
 
   /**
    * A callback that can be called before a jsAst [node] is
@@ -400,16 +401,25 @@
     }
   }
 
+  // Field names are treated differently by the dart compiler
+  // so they must be recorded seperately.
+  void recordFieldNameSize(Element element, int size) {
+    _fieldNameToSize[element] = size;
+  }
+
   // Returns the size of the source code that
   // was generated for an element.  If no source
   // code was produced, return 0.
   int sizeOf(Element element) {
+    if (_fieldNameToSize.containsKey(element)) {
+      return _fieldNameToSize[element];
+    }
     if (_elementToNodes.containsKey(element)) {
       return _elementToNodes[element]
         .map(sizeOfNode)
         .fold(0, (a, b) => a + b);
     } else {
-        return 0;
+      return 0;
     }
   }
 
@@ -497,7 +507,8 @@
       'compilationMoment': infoCollector.compilationMoment.toString(),
       'compilationDuration': infoCollector.compilationDuration.toString(),
       'toJsonDuration': toJsonDuration.toString(),
-      'dumpInfoDuration': infoCollector.dumpInfoDuration.toString()
+      'dumpInfoDuration': infoCollector.dumpInfoDuration.toString(),
+      'noSuchMethodEnabled': compiler.enabledNoSuchMethod
     };
 
     outJson['program'] = generalProgramInfo;
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index b16a9f1..fbd3f93 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -765,7 +765,6 @@
     if (compiler.enabledNoSuchMethod) return;
     if (compiler.backend.isDefaultNoSuchMethodImplementation(element)) return;
 
-    Selector selector = compiler.noSuchMethodSelector;
     compiler.enabledNoSuchMethod = true;
     compiler.backend.enableNoSuchMethod(element, this);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/js/printer.dart b/sdk/lib/_internal/compiler/implementation/js/printer.dart
index ecc0be5..f92c386 100644
--- a/sdk/lib/_internal/compiler/implementation/js/printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/printer.dart
@@ -823,7 +823,7 @@
         forceLine();
         indent();
       }
-      visitProperty(properties[i]);
+      visit(properties[i]);
     }
     --indentLevel;
     if (!node.isOneLiner && !properties.isEmpty) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index 96115b9..8b92b75 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -359,11 +359,10 @@
     if (!isPrivateName(name)) return nameString;
 
     // The first library asking for a short private name wins.
-    LibraryElement owner = shouldMinify
-        ? library
-        : shortPrivateNameOwners.putIfAbsent(nameString, () => library);
+    LibraryElement owner =
+        shortPrivateNameOwners.putIfAbsent(nameString, () => library);
 
-    if (owner == library && !shouldMinify && !nameString.contains('\$')) {
+    if (owner == library && !nameString.contains('\$')) {
       // Since the name doesn't contain $ it doesn't clash with any
       // of the private names that have the library name as the prefix.
       return nameString;
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
index 061c781..5db0019 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -444,8 +444,10 @@
   void assembleCode(CodeBuffer targetBuffer) {
     List<jsAst.Property> objectProperties = <jsAst.Property>[];
 
-    void addProperty(String name, jsAst.Expression value) {
-      objectProperties.add(new jsAst.Property(js.string(name), value));
+    jsAst.Property addProperty(String name, jsAst.Expression value) {
+      jsAst.Property prop = new jsAst.Property(js.string(name), value);
+      objectProperties.add(prop);
+      return prop;
     }
 
     if (!nativeClasses.isEmpty) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/class_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/class_builder.dart
index 7d96726..deb4fc4 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/class_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/class_builder.dart
@@ -24,8 +24,10 @@
   ClassBuilder(this.element, this.namer);
 
   // Has the same signature as [DefineStubFunction].
-  void addProperty(String name, jsAst.Expression value) {
-    properties.add(new jsAst.Property(js.string(name), value));
+  jsAst.Property addProperty(String name, jsAst.Expression value) {
+    jsAst.Property property = new jsAst.Property(js.string(name), value);
+    properties.add(property);
+    return property;
   }
 
   void addField(String field) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
index c936173..e3856a9 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
@@ -154,7 +154,8 @@
             metadata = new jsAst.LiteralNull();
           }
           fieldMetadata.add(metadata);
-          recordMangledField(field, accessorName, field.name);
+          recordMangledField(field, accessorName,
+              namer.privateName(field.library, field.name));
           String fieldName = name;
           String fieldCode = '';
           String reflectionMarker = '';
@@ -227,7 +228,11 @@
             DartType type = field.type;
             reflectionMarker = '-${task.metadataEmitter.reifyType(type)}';
           }
-          builder.addField('$fieldName$fieldCode$reflectionMarker');
+          String builtFieldname = '$fieldName$fieldCode$reflectionMarker';
+          builder.addField(builtFieldname);
+          // Add 1 because adding a field to the class also requires a comma
+          compiler.dumpInfoTask.recordFieldNameSize(field,
+              builtFieldname.length + 1);
           fieldsAdded = true;
         }
       });
@@ -526,7 +531,8 @@
     jsAst.Expression code = backend.generatedCode[member];
     assert(code != null);
     String setterName = namer.setterNameFromAccessorName(accessorName);
-    builder.addProperty(setterName, code);
+    compiler.dumpInfoTask.registerElementAst(member,
+        builder.addProperty(setterName, code));
     generateReflectionDataForFieldGetterOrSetter(
         member, setterName, builder, isGetter: false);
   }
@@ -617,8 +623,9 @@
     }
     jsAst.Expression convertRtiToRuntimeType =
         namer.elementAccess(backend.findHelper('convertRtiToRuntimeType'));
-    builder.addProperty(name,
-        js('function () { return #(#) }',
-            [convertRtiToRuntimeType, computeTypeVariable]));
+    compiler.dumpInfoTask.registerElementAst(element,
+        builder.addProperty(name,
+            js('function () { return #(#) }',
+                [convertRtiToRuntimeType, computeTypeVariable])));
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
index 97e459c..b1dbdc3 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
@@ -675,13 +675,15 @@
   }
 
   String getReflectionNameInternal(elementOrSelector, String mangledName) {
-    String name = elementOrSelector.name;
+    String name =
+        namer.privateName(elementOrSelector.library, elementOrSelector.name);
     if (elementOrSelector.isGetter) return name;
     if (elementOrSelector.isSetter) {
       if (!mangledName.startsWith(namer.setterPrefix)) return '$name=';
       String base = mangledName.substring(namer.setterPrefix.length);
       String getter = '${namer.getterPrefix}$base';
-      mangledFieldNames[getter] = name;
+      mangledFieldNames.putIfAbsent(getter, () => name);
+      assert(mangledFieldNames[getter] == name);
       recordedMangledNames.add(getter);
       // TODO(karlklose,ahe): we do not actually need to store information
       // about the name of this setter in the output, but it is needed for
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
index ebb6ea5..d9f1537 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
@@ -305,9 +305,8 @@
             'function(#) { return #.#(#); }',
             [ parameters, buildGetter(), closureCallName, arguments]);
 
-        compiler.dumpInfoTask.registerElementAst(member, function);
-        addProperty(invocationName, function);
-
+        compiler.dumpInfoTask.registerElementAst(member,
+            addProperty(invocationName, function));
       }
     }
   }
@@ -387,14 +386,14 @@
     final bool needStructuredInfo =
         canTearOff || canBeReflected || canBeApplied;
     if (!needStructuredInfo) {
-      builder.addProperty(name, code);
-      compiler.dumpInfoTask.registerElementAst(member, code);
+      compiler.dumpInfoTask.registerElementAst(member,
+          builder.addProperty(name, code));
       if (needsStubs) {
         addParameterStubs(
             member,
             (Selector selector, jsAst.Fun function) {
-              builder.addProperty(namer.invocationName(selector), function);
-              compiler.dumpInfoTask.registerElementAst(member, function);
+              compiler.dumpInfoTask.registerElementAst(member,
+                  builder.addProperty(namer.invocationName(selector), function));
             });
       }
       return;
@@ -535,18 +534,20 @@
             new jsAst.LiteralString(
                 '"new ${Elements.reconstructConstructorName(member)}"');
       } else {
-        reflectionName = js.string(member.name);
+        reflectionName =
+            js.string(namer.privateName(member.library, member.name));
       }
       expressions
           ..add(reflectionName)
           ..addAll(task.metadataEmitter.computeMetadata(member).map(js.number));
     } else if (isClosure && canBeApplied) {
-      expressions.add(js.string(member.name));
+      expressions.add(js.string(namer.privateName(member.library,
+                                                  member.name)));
     }
     jsAst.ArrayInitializer arrayInit =
       new jsAst.ArrayInitializer.from(expressions);
-    builder.addProperty(name, arrayInit);
-    compiler.dumpInfoTask.registerElementAst(member, arrayInit);
+    compiler.dumpInfoTask.registerElementAst(member,
+        builder.addProperty(name, arrayInit));
   }
 
   void addMemberField(VariableElement member, ClassBuilder builder) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/declarations.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/declarations.dart
index 4175867..8177da7 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/declarations.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/declarations.dart
@@ -15,7 +15,7 @@
 /**
  * Call-back for adding property with [name] and [value].
  */
-typedef void AddPropertyFunction(String name, jsAst.Expression value);
+typedef jsAst.Property AddPropertyFunction(String name, jsAst.Expression value);
 
 /**
  * [member] is a field (instance, static, or top level).
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize.dart b/sdk/lib/_internal/pub/asset/dart/serialize.dart
index 5e32378..f37ab70 100644
--- a/sdk/lib/_internal/pub/asset/dart/serialize.dart
+++ b/sdk/lib/_internal/pub/asset/dart/serialize.dart
@@ -8,7 +8,14 @@
 import 'dart:isolate';
 
 import 'package:barback/barback.dart';
-import 'package:source_maps/span.dart';
+
+//# if source_maps >=0.9.0 <0.10.0
+//> import 'package:source_maps/span.dart';
+//# end
+
+//# if source_span
+import 'package:source_span/source_span.dart';
+//# end
 
 import 'serialize/exception.dart';
 import 'utils.dart';
@@ -25,42 +32,63 @@
 AssetId deserializeId(Map id) => new AssetId(id['package'], id['path']);
 
 /// Converts [span] into a serializable map.
-Map serializeSpan(Span span) {
+///
+/// [span] may be a [SourceSpan] or a [Span].
+Map serializeSpan(span) {
   // TODO(nweiz): convert FileSpans to FileSpans.
+  // Handily, this code works for both source_map and source_span spans.
   return {
-    'type': 'fixed',
-    'sourceUrl': span.sourceUrl,
+    'sourceUrl': span.sourceUrl.toString(),
     'start': serializeLocation(span.start),
+    'end': serializeLocation(span.end),
     'text': span.text,
-    'isIdentifier': span.isIdentifier
   };
 }
 
-/// Converts a serializable map into a [Span].
-Span deserializeSpan(Map span) {
-  assert(span['type'] == 'fixed');
-  var location = deserializeLocation(span['start']);
-  return new FixedSpan(span['sourceUrl'], location.offset, location.line,
-      location.column, text: span['text'], isIdentifier: span['isIdentifier']);
+/// Converts a serializable map into a [SourceSpan].
+SourceSpan deserializeSpan(Map span) {
+  return new SourceSpan(
+      deserializeLocation(span['start']),
+      deserializeLocation(span['end']),
+      span['text']);
 }
 
 /// Converts [location] into a serializable map.
-Map serializeLocation(Location location) {
+///
+/// [location] may be a [SourceLocation] or a [SourceLocation].
+Map serializeLocation(location) {
+//# if source_maps >=0.9.0 <0.10.0
+//>  if (location is Location) {
+//>    return {
+//>      'sourceUrl': location.sourceUrl,
+//>      'offset': location.offset,
+//>      'line': location.line,
+//>      'column': location.column
+//>    };
+//>  }
+//# end
+
+//# if source_span
   // TODO(nweiz): convert FileLocations to FileLocations.
-  return {
-    'type': 'fixed',
-    'sourceUrl': location.sourceUrl,
-    'offset': location.offset,
-    'line': location.line,
-    'column': location.column
-  };
+  if (location is SourceLocation) {
+    return {
+      'sourceUrl': location.sourceUrl.toString(),
+      'offset': location.offset,
+      'line': location.line,
+      'column': location.column
+    };
+  }
+//# end
+
+  throw new ArgumentError("Unknown type ${location.runtimeType} for location.");
 }
 
 /// Converts a serializable map into a [Location].
-Location deserializeLocation(Map location) {
-  assert(location['type'] == 'fixed');
-  return new FixedLocation(location['offset'], location['sourceUrl'],
-      location['line'], location['column']);
+SourceLocation deserializeLocation(Map location) {
+  return new SourceLocation(location['offset'],
+      sourceUrl: location['sourceUrl'],
+      line: location['line'],
+      column: location['column']);
 }
 
 /// Converts [stream] into a serializable map.
diff --git a/sdk/lib/_internal/pub/bin/pub.dart b/sdk/lib/_internal/pub/bin/pub.dart
index ab95fc6..35b8c90 100644
--- a/sdk/lib/_internal/pub/bin/pub.dart
+++ b/sdk/lib/_internal/pub/bin/pub.dart
@@ -173,7 +173,7 @@
   }
 
   return syncFuture(() {
-    return command.run(cacheDir, options);
+    return command.run(cacheDir, mainOptions, options);
   }).whenComplete(() {
     command.cache.deleteTempDir();
   });
diff --git a/sdk/lib/_internal/pub/lib/src/barback.dart b/sdk/lib/_internal/pub/lib/src/barback.dart
index e6af94f..6ea65f7 100644
--- a/sdk/lib/_internal/pub/lib/src/barback.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback.dart
@@ -38,8 +38,8 @@
 ///
 /// [compat]: https://gist.github.com/nex3/10942218
 final pubConstraints = {
-  "barback": new VersionConstraint.parse(">=0.13.0 <0.14.2"),
-  "source_maps": new VersionConstraint.parse(">=0.9.0 <0.10.0"),
+  "barback": new VersionConstraint.parse(">=0.13.0 <0.15.1"),
+  "source_span": new VersionConstraint.parse(">=1.0.0 <2.0.0"),
   "stack_trace": new VersionConstraint.parse(">=0.9.1 <2.0.0")
 };
 
diff --git a/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart b/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
index 7bc57e6..75f90d7 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
@@ -673,7 +673,7 @@
   var prefix = "[${prefixParts.join(' ')}]:";
   var message = entry.message;
   if (entry.span != null) {
-    message = entry.span.getLocationMessage(entry.message);
+    message = entry.span.message(entry.message);
   }
 
   switch (entry.level) {
diff --git a/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart b/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
index 21e6fed..5e2c306 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
@@ -13,6 +13,7 @@
 import '../package_graph.dart';
 import '../preprocess.dart';
 import '../sdk.dart' as sdk;
+import '../utils.dart';
 
 /// An implementation of barback's [PackageProvider] interface so that barback
 /// can find assets within pub packages.
@@ -37,13 +38,14 @@
       // Barback may not be in the package graph if there are no user-defined
       // transformers being used at all. The "$pub" sources are still provided,
       // but will never be loaded.
-      var barback = _graph.packages['barback'];
-      if (barback == null) {
+      if (!_graph.packages.containsKey("barback")) {
         return new Future.value(new Asset.fromPath(id, file));
       }
 
+      var versions = mapMap(_graph.packages,
+          value: (_, package) => package.version);
       var contents = readTextFile(file);
-      contents = preprocess(contents, barback.version, path.toUri(file));
+      contents = preprocess(contents, versions, path.toUri(file));
       return new Future.value(new Asset.fromString(id, contents));
     }
 
diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
index 0b3e985..d70bf17 100644
--- a/sdk/lib/_internal/pub/lib/src/command.dart
+++ b/sdk/lib/_internal/pub/lib/src/command.dart
@@ -105,6 +105,10 @@
   GlobalPackages get globals => _globals;
   GlobalPackages _globals;
 
+  /// The parsed options for the pub executable.
+  ArgResults get globalOptions => _globalOptions;
+  ArgResults _globalOptions;
+
   /// The parsed options for this command.
   ArgResults get commandOptions => _commandOptions;
   ArgResults _commandOptions;
@@ -115,7 +119,10 @@
   /// is not a package.
   Entrypoint get entrypoint {
     // Lazy load it.
-    if (_entrypoint == null) _entrypoint = new Entrypoint(path.current, _cache);
+    if (_entrypoint == null) {
+      _entrypoint = new Entrypoint(path.current, _cache,
+          packageSymlinks: globalOptions['package-symlinks']);
+    }
     return _entrypoint;
   }
 
@@ -181,8 +188,10 @@
         help: 'Print usage information for this command.');
   }
 
-  /// Runs this command using a system cache at [cacheDir] with [options].
-  Future run(String cacheDir, ArgResults options) {
+  /// Runs this command using a system cache at [cacheDir] with [globalOptions]
+  /// and [options].
+  Future run(String cacheDir, ArgResults globalOptions, ArgResults options) {
+    _globalOptions = globalOptions;
     _commandOptions = options;
 
     _cache = new SystemCache.withSources(cacheDir, isOffline: isOffline);
@@ -305,6 +314,8 @@
       help: 'Shortcut for "--verbosity=all".');
   argParser.addFlag('with-prejudice', hide: !isAprilFools, negatable: false,
       help: 'Execute commands with prejudice.');
+  argParser.addFlag('package-symlinks', hide: true, negatable: true,
+      defaultsTo: true);
 
   // Register the commands.
   PubCommand.mainCommands.forEach((name, command) {
diff --git a/sdk/lib/_internal/pub/lib/src/entrypoint.dart b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
index 6a9f607..6ce137d 100644
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
@@ -43,18 +43,28 @@
   /// the network.
   final SystemCache cache;
 
+  /// Whether to create and symlink a "packages" directory containing links to
+  /// the installed packages.
+  final bool _packageSymlinks;
+
   /// The lockfile for the entrypoint.
   ///
   /// If not provided to the entrypoint, it will be laoded lazily from disc.
   LockFile _lockFile;
 
   /// Loads the entrypoint from a package at [rootDir].
-  Entrypoint(String rootDir, SystemCache cache)
+  ///
+  /// If [packageSymlinks] is `true`, this will create a "packages" directory
+  /// with symlinks to the installed packages. This directory will be symlinked
+  /// into any directory that might contain an entrypoint.
+  Entrypoint(String rootDir, SystemCache cache, {bool packageSymlinks: true})
       : root = new Package.load(null, rootDir, cache.sources),
-        cache = cache;
+        cache = cache,
+        _packageSymlinks = packageSymlinks;
 
   /// Creates an entrypoint given package and lockfile objects.
-  Entrypoint.inMemory(this.root, this._lockFile, this.cache);
+  Entrypoint.inMemory(this.root, this._lockFile, this.cache)
+      : _packageSymlinks = false;
 
   /// The path to the entrypoint's "packages" directory.
   String get packagesDir => path.join(root.dir, 'packages');
@@ -109,12 +119,19 @@
         return null;
       }
 
-      // Install the packages.
-      cleanDir(packagesDir);
+      // Install the packages and maybe link them into the entrypoint.
+      if (_packageSymlinks) {
+        cleanDir(packagesDir);
+      } else {
+        deleteEntry(packagesDir);
+      }
+
       return Future.wait(result.packages.map(_get)).then((ids) {
         _saveLockFile(ids);
-        _linkSelf();
-        _linkSecondaryPackageDirs();
+
+        if (_packageSymlinks) _linkSelf();
+        _linkOrDeleteSecondaryPackageDirs();
+
         result.summarizeChanges(type, dryRun: dryRun);
       });
     });
@@ -128,11 +145,17 @@
   Future<PackageId> _get(PackageId id) {
     if (id.isRoot) return new Future.value(id);
 
-    var packageDir = path.join(packagesDir, id.name);
-    if (entryExists(packageDir)) deleteEntry(packageDir);
-
     var source = cache.sources[id.source];
-    return source.get(id, packageDir).then((_) => source.resolveId(id));
+    return syncFuture(() {
+      if (!_packageSymlinks) {
+        if (source is! CachedSource) return null;
+        return source.downloadToSystemCache(id);
+      }
+
+      var packageDir = path.join(packagesDir, id.name);
+      if (entryExists(packageDir)) deleteEntry(packageDir);
+      return source.get(id, packageDir);
+    }).then((_) => source.resolveId(id));
   }
 
   /// Determines whether or not the lockfile is out of date with respect to the
@@ -257,28 +280,34 @@
         isSelfLink: true, relative: true);
   }
 
-  /// Add "packages" directories to the whitelist of directories that may
-  /// contain Dart entrypoints.
-  void _linkSecondaryPackageDirs() {
+  /// If [packageSymlinks] is true, add "packages" directories to the whitelist
+  /// of directories that may contain Dart entrypoints.
+  ///
+  /// Otherwise, delete any "packages" directories in the whitelist of
+  /// directories that may contain Dart entrypoints.
+  void _linkOrDeleteSecondaryPackageDirs() {
     // Only the main "bin" directory gets a "packages" directory, not its
     // subdirectories.
     var binDir = path.join(root.dir, 'bin');
-    if (dirExists(binDir)) _linkSecondaryPackageDir(binDir);
+    if (dirExists(binDir)) _linkOrDeleteSecondaryPackageDir(binDir);
 
     // The others get "packages" directories in subdirectories too.
     for (var dir in ['benchmark', 'example', 'test', 'tool', 'web']) {
-      _linkSecondaryPackageDirsRecursively(path.join(root.dir, dir));
+      _linkOrDeleteSecondaryPackageDirsRecursively(path.join(root.dir, dir));
     }
  }
 
-  /// Creates a symlink to the `packages` directory in [dir] and all its
+  /// If [packageSymlinks] is true, creates a symlink to the "packages"
+  /// directory in [dir] and all its subdirectories.
+  ///
+  /// Otherwise, deletes any "packages" directories in [dir] and all its
   /// subdirectories.
-  void _linkSecondaryPackageDirsRecursively(String dir) {
+  void _linkOrDeleteSecondaryPackageDirsRecursively(String dir) {
     if (!dirExists(dir)) return;
-    _linkSecondaryPackageDir(dir);
+    _linkOrDeleteSecondaryPackageDir(dir);
     _listDirWithoutPackages(dir)
         .where(dirExists)
-        .forEach(_linkSecondaryPackageDir);
+        .forEach(_linkOrDeleteSecondaryPackageDir);
   }
 
   // TODO(nweiz): roll this into [listDir] in io.dart once issue 4775 is fixed.
@@ -294,11 +323,13 @@
     }));
   }
 
-  /// Creates a symlink to the `packages` directory in [dir]. Will replace one
-  /// if already there.
-  void _linkSecondaryPackageDir(String dir) {
+  /// If [packageSymlinks] is true, creates a symlink to the "packages"
+  /// directory in [dir].
+  ///
+  /// Otherwise, deletes a "packages" directories in [dir] if one exists.
+  void _linkOrDeleteSecondaryPackageDir(String dir) {
     var symlink = path.join(dir, 'packages');
     if (entryExists(symlink)) deleteEntry(symlink);
-    createSymlink(packagesDir, symlink, relative: true);
+    if (_packageSymlinks) createSymlink(packagesDir, symlink, relative: true);
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/exceptions.dart b/sdk/lib/_internal/pub/lib/src/exceptions.dart
index fc83c0c3..3f287f0 100644
--- a/sdk/lib/_internal/pub/lib/src/exceptions.dart
+++ b/sdk/lib/_internal/pub/lib/src/exceptions.dart
@@ -92,7 +92,7 @@
 
 /// All the names of user-facing exceptions.
 final _userFacingExceptions = new Set<String>.from([
-  'ApplicationException',
+  'ApplicationException', 'GitException',
   // This refers to http.ClientException.
   'ClientException',
   // Errors coming from the Dart analyzer are probably caused by syntax errors
diff --git a/sdk/lib/_internal/pub/lib/src/git.dart b/sdk/lib/_internal/pub/lib/src/git.dart
index 598627a..2c522eb 100644
--- a/sdk/lib/_internal/pub/lib/src/git.dart
+++ b/sdk/lib/_internal/pub/lib/src/git.dart
@@ -10,12 +10,13 @@
 
 import 'package:stack_trace/stack_trace.dart';
 
+import 'exceptions.dart';
 import 'io.dart';
 import 'log.dart' as log;
 import 'utils.dart';
 
 /// An exception thrown because a git command failed.
-class GitException implements Exception {
+class GitException implements ApplicationException {
   /// The arguments to the git command.
   final List<String> args;
 
diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
index 90e8cf7..bd0dd7a 100644
--- a/sdk/lib/_internal/pub/lib/src/io.dart
+++ b/sdk/lib/_internal/pub/lib/src/io.dart
@@ -455,7 +455,7 @@
 
 /// Whether pub is running from within the Dart SDK, as opposed to from the Dart
 /// source repository.
-bool get runningFromSdk => Platform.script.path.endsWith('.snapshot');
+final bool runningFromSdk = Platform.script.path.endsWith('.snapshot');
 
 /// Resolves [target] relative to the path to pub's `asset` directory.
 String assetPath(String target) {
@@ -793,8 +793,16 @@
     return _extractTarGzWindows(stream, destination);
   }
 
-  return startProcess("tar",
-      ["--extract", "--gunzip", "--directory", destination]).then((process) {
+  var args = ["--extract", "--gunzip", "--directory", destination];
+  if (Platform.operatingSystem == "linux") {
+    // BSD tar (the default on OS X) can insert strange headers to a tarfile
+    // that GNU tar (the default on Linux) is unable to understand. This will
+    // cause GNU tar to emit a number of harmless but scary-looking warnings
+    // which are silenced by this flag.
+    args.insert(0, "--warning=no-unknown-keyword");
+  }
+
+  return startProcess("tar", args).then((process) {
     // Ignore errors on process.std{out,err}. They'll be passed to
     // process.exitCode, and we don't want them being top-levelled by
     // std{out,err}Sink.
diff --git a/sdk/lib/_internal/pub/lib/src/log.dart b/sdk/lib/_internal/pub/lib/src/log.dart
index 3eb2557..edc7fe0 100644
--- a/sdk/lib/_internal/pub/lib/src/log.dart
+++ b/sdk/lib/_internal/pub/lib/src/log.dart
@@ -10,7 +10,6 @@
 import 'dart:io';
 
 import 'package:path/path.dart' as p;
-import 'package:source_maps/source_maps.dart';
 import 'package:source_span/source_span.dart';
 import 'package:stack_trace/stack_trace.dart';
 
@@ -316,9 +315,7 @@
 
   // This is basically the top-level exception handler so that we don't
   // spew a stack trace on our users.
-  if (exception is SpanException) {
-    error(exception.toString(useColors: canUseSpecialChars));
-  } else if (exception is SourceSpanException) {
+  if (exception is SourceSpanException) {
     error(exception.toString(color: canUseSpecialChars));
   } else {
     error(getErrorMessage(exception));
@@ -510,8 +507,7 @@
     }
 
     // If the error came from a file, include the path.
-    if ((error is SpanException || error is SourceSpanException) &&
-        error.span.sourceUrl != null) {
+    if (error is SourceSpanException && error.span.sourceUrl != null) {
       errorJson["path"] = p.fromUri(error.span.sourceUrl);
     }
 
diff --git a/sdk/lib/_internal/pub/lib/src/preprocess.dart b/sdk/lib/_internal/pub/lib/src/preprocess.dart
index 827d256..ff14738 100644
--- a/sdk/lib/_internal/pub/lib/src/preprocess.dart
+++ b/sdk/lib/_internal/pub/lib/src/preprocess.dart
@@ -11,9 +11,9 @@
 /// Runs a simple preprocessor over [input] to remove sections that are
 /// incompatible with the available barback version.
 ///
-/// [barbackVersion] is the version of barback that's available, and [sourceUrl]
-/// is a [String] or [Uri] indicating where [input] came from. It's used for
-/// error reporting.
+/// [versions] are the available versions of each installed package, and
+/// [sourceUrl] is a [String] or [Uri] indicating where [input] came from. It's
+/// used for error reporting.
 ///
 /// For the most part, the preprocessor leaves text in the source document
 /// alone. However, it handles two types of lines specially. Lines that begin
@@ -28,10 +28,12 @@
 ///       ...
 ///     //# end
 ///
-/// If the current barback version matches the constraint, everything within the
-/// first block is included in the output and everything within the second block
-/// is removed; otherwise, the first block is removed and the second block is
-/// included. The `else` block is optional.
+/// If can check against any package installed in the current package. It can
+/// check the version of the package, as above, or (if the version range is
+/// omitted) whether the package exists at all. If the condition is true,
+/// everything within the first block is included in the output and everything
+/// within the second block is removed; otherwise, the first block is removed
+/// and the second block is included. The `else` block is optional.
 ///
 /// It's important that the preprocessor syntax also be valid Dart code, because
 /// pub loads the source files before preprocessing and runs them against the
@@ -44,10 +46,10 @@
 ///     //# else
 ///     //>   ClassMirror get aggregateClass => null;
 ///     //# end
-String preprocess(String input, Version barbackVersion, sourceUrl) {
+String preprocess(String input, Map<String, Version> versions, sourceUrl) {
   // Short-circuit if there are no preprocessor directives in the file.
   if (!input.contains(new RegExp(r"^//[>#]", multiLine: true))) return input;
-  return new _Preprocessor(input, barbackVersion, sourceUrl).run();
+  return new _Preprocessor(input, versions, sourceUrl).run();
 }
 
 /// The preprocessor class.
@@ -55,19 +57,18 @@
   /// The scanner over the input string.
   final StringScanner _scanner;
 
-  /// The version of barback to match against.
-  final Version _barbackVersion;
+  final Map<String, Version> _versions;
 
   /// The buffer to which the output is written.
   final _buffer = new StringBuffer();
 
-  _Preprocessor(String input, this._barbackVersion, sourceUrl)
+  _Preprocessor(String input, this._versions, sourceUrl)
       : _scanner = new StringScanner(input, sourceUrl: sourceUrl);
 
   /// Run the preprocessor and return the processed output.
   String run() {
     while (!_scanner.isDone) {
-      if (_scanner.scan(new RegExp(r"//#\s*"))) {
+      if (_scanner.scan(new RegExp(r"//#[ \t]*"))) {
         _if();
       } else {
         _emitText();
@@ -101,22 +102,23 @@
 
   /// Handle an `if` operator.
   void _if() {
-    _scanner.expect(new RegExp(r"if\s+"), name: "if statement");
+    _scanner.expect(new RegExp(r"if[ \t]+"), name: "if statement");
     _scanner.expect(new RegExp(r"[a-zA-Z0-9_]+"), name: "package name");
     var package = _scanner.lastMatch[0];
-    if (package != 'barback') _scanner.error('Unknown package "$package".');
 
-    _scanner.scan(new RegExp(r"\s*"));
-    _scanner.expect(new RegExp(r"[^\n]+"), name: "version constraint");
-    var constraint;
-    try {
-      constraint = new VersionConstraint.parse(_scanner.lastMatch[0]);
-    } on FormatException catch (error) {
-      _scanner.error("Invalid version constraint: ${error.message}");
+    _scanner.scan(new RegExp(r"[ \t]*"));
+    var constraint = VersionConstraint.any;
+    if (_scanner.scan(new RegExp(r"[^\n]+"))) {
+      try {
+        constraint = new VersionConstraint.parse(_scanner.lastMatch[0]);
+      } on FormatException catch (error) {
+        _scanner.error("Invalid version constraint: ${error.message}");
+      }
     }
     _scanner.expect("\n");
 
-    var allowed = constraint.allows(_barbackVersion);
+    var allowed = _versions.containsKey(package) &&
+        constraint.allows(_versions[package]);
     if (allowed) {
       _emitText();
     } else {
@@ -124,7 +126,7 @@
     }
 
     _scanner.expect("//#");
-    _scanner.scan(new RegExp(r"\s*"));
+    _scanner.scan(new RegExp(r"[ \t]*"));
     if (_scanner.scan("else")) {
       _scanner.expect("\n");
       if (allowed) {
@@ -133,7 +135,7 @@
         _emitText();
       }
       _scanner.expect("//#");
-      _scanner.scan(new RegExp(r"\s*"));
+      _scanner.scan(new RegExp(r"[ \t]*"));
     }
 
     _scanner.expect("end");
diff --git a/sdk/lib/_internal/pub/lib/src/sdk.dart b/sdk/lib/_internal/pub/lib/src/sdk.dart
index a97df46..2fe1858 100644
--- a/sdk/lib/_internal/pub/lib/src/sdk.dart
+++ b/sdk/lib/_internal/pub/lib/src/sdk.dart
@@ -17,12 +17,12 @@
 /// When running from the actual built SDK, this will be the SDK that contains
 /// the running Dart executable. When running from the repo, it will be the
 /// "sdk" directory in the Dart repository itself.
-String get rootDirectory =>
+final String rootDirectory =
     runningFromSdk ? _rootDirectory : path.join(repoRoot, "sdk");
 
 /// Gets the path to the root directory of the SDK, assuming that the currently
 /// running Dart executable is within it.
-String get _rootDirectory =>
+final String _rootDirectory =
     path.dirname(path.dirname(Platform.executable));
 
 /// The SDK's revision number formatted to be a semantic version.
diff --git a/sdk/lib/_internal/pub/lib/src/version.dart b/sdk/lib/_internal/pub/lib/src/version.dart
index 50cfb0c5..b68c3ed 100644
--- a/sdk/lib/_internal/pub/lib/src/version.dart
+++ b/sdk/lib/_internal/pub/lib/src/version.dart
@@ -474,10 +474,27 @@
 
   /// Tests if [other] matches falls within this version range.
   bool allows(Version other) {
-    if (min != null && other < min) return false;
-    if (min != null && !includeMin && other == min) return false;
-    if (max != null && other > max) return false;
-    if (max != null && !includeMax && other == max) return false;
+    if (min != null) {
+      if (other < min) return false;
+      if (!includeMin && other == min) return false;
+    }
+
+    if (max != null) {
+      if (other > max) return false;
+      if (!includeMax && other == max) return false;
+
+      // If the max isn't itself a pre-release, don't allow any pre-release
+      // versions of the max.
+      //
+      // See: https://www.npmjs.org/doc/misc/semver.html
+      if (!includeMax &&
+          !max.isPreRelease && other.isPreRelease &&
+          other.major == max.major && other.minor == max.minor &&
+          other.patch == max.patch) {
+        return false;
+      }
+    }
+
     return true;
   }
 
diff --git a/sdk/lib/_internal/pub/pub.status b/sdk/lib/_internal/pub/pub.status
index f9df64b..449c482 100644
--- a/sdk/lib/_internal/pub/pub.status
+++ b/sdk/lib/_internal/pub/pub.status
@@ -2,7 +2,9 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+test/dart2js/compiles_generated_file_from_dependency_test: Pass, Slow
 test/serve/web_socket/url_to_asset_id_test: Pass, Slow
+test/transformer/loads_a_diamond_transformer_dependency_graph_test: Pass, Slow
 
 # Pub only runs on the VM, so just rule out all compilers.
 [ $compiler == dart2js || $compiler == dart2dart ]
diff --git a/sdk/lib/_internal/pub/test/build/allows_arbitrary_modes_test.dart b/sdk/lib/_internal/pub/test/build/allows_arbitrary_modes_test.dart
index 98a5d37..e9f4096 100644
--- a/sdk/lib/_internal/pub/test/build/allows_arbitrary_modes_test.dart
+++ b/sdk/lib/_internal/pub/test/build/allows_arbitrary_modes_test.dart
@@ -11,7 +11,6 @@
 import 'dart:async';
 
 import 'package:barback/barback.dart';
-import 'package:source_maps/source_maps.dart';
 
 class ModeTransformer extends Transformer {
   final BarbackSettings settings;
diff --git a/sdk/lib/_internal/pub/test/build/defaults_to_release_mode_test.dart b/sdk/lib/_internal/pub/test/build/defaults_to_release_mode_test.dart
index c08e3db..a507ef7 100644
--- a/sdk/lib/_internal/pub/test/build/defaults_to_release_mode_test.dart
+++ b/sdk/lib/_internal/pub/test/build/defaults_to_release_mode_test.dart
@@ -11,7 +11,6 @@
 import 'dart:async';
 
 import 'package:barback/barback.dart';
-import 'package:source_maps/source_maps.dart';
 
 class ModeTransformer extends Transformer {
   final BarbackSettings settings;
diff --git a/sdk/lib/_internal/pub/test/cache/add/all_adds_all_matching_versions_test.dart b/sdk/lib/_internal/pub/test/cache/add/all_adds_all_matching_versions_test.dart
index a63627b..3939f5b 100644
--- a/sdk/lib/_internal/pub/test/cache/add/all_adds_all_matching_versions_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/add/all_adds_all_matching_versions_test.dart
@@ -14,7 +14,6 @@
       packageMap("foo", "1.2.2"),
       packageMap("foo", "1.2.3-dev"),
       packageMap("foo", "1.2.3"),
-      packageMap("foo", "2.0.0-dev"),
       packageMap("foo", "2.0.0")
     ]);
 
@@ -22,8 +21,7 @@
         output: '''
           Downloading foo 1.2.2...
           Downloading foo 1.2.3-dev...
-          Downloading foo 1.2.3...
-          Downloading foo 2.0.0-dev...''');
+          Downloading foo 1.2.3...''');
 
     d.cacheDir({"foo": "1.2.2"}).validate();
     d.cacheDir({"foo": "1.2.3-dev"}).validate();
diff --git a/sdk/lib/_internal/pub/test/implicit_barback_dependency_test.dart b/sdk/lib/_internal/pub/test/implicit_barback_dependency_test.dart
index 446e883..03f18d8 100644
--- a/sdk/lib/_internal/pub/test/implicit_barback_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/implicit_barback_dependency_test.dart
@@ -17,7 +17,7 @@
   var nextPatch = constraint.min.nextPatch.toString();
   var max = constraint.max.toString();
 
-  var sourceMapsVersion = barback.pubConstraints["source_maps"].min.toString();
+  var sourceSpanVersion = barback.pubConstraints["source_span"].min.toString();
   var stackTraceVersion = barback.pubConstraints["stack_trace"].min.toString();
 
   forBothPubGetAndUpgrade((command) {
@@ -27,7 +27,7 @@
         packageMap("barback", current),
         packageMap("barback", nextPatch),
         packageMap("barback", max),
-        packageMap("source_maps", sourceMapsVersion),
+        packageMap("source_span", sourceSpanVersion),
         packageMap("stack_trace", stackTraceVersion)
       ]);
 
@@ -48,7 +48,7 @@
         packageMap("barback", current),
         packageMap("barback", nextPatch),
         packageMap("barback", max),
-        packageMap("source_maps", sourceMapsVersion),
+        packageMap("source_span", sourceSpanVersion),
         packageMap("stack_trace", stackTraceVersion)
       ]);
 
@@ -74,7 +74,7 @@
     integration("pub's implicit constraint uses the same source and "
         "description as a dependency override", () {
       servePackages([
-        packageMap("source_maps", sourceMapsVersion),
+        packageMap("source_span", sourceSpanVersion),
         packageMap("stack_trace", stackTraceVersion)
       ]);
 
@@ -104,7 +104,7 @@
     servePackages([
       packageMap("barback", previous),
       packageMap("barback", current),
-      packageMap("source_maps", sourceMapsVersion),
+      packageMap("source_span", sourceSpanVersion),
       packageMap("stack_trace", stackTraceVersion)
     ]);
 
@@ -127,7 +127,7 @@
       "is no version available", () {
     servePackages([
       packageMap("barback", previous),
-      packageMap("source_maps", sourceMapsVersion),
+      packageMap("source_span", sourceSpanVersion),
       packageMap("stack_trace", stackTraceVersion)
     ]);
 
@@ -144,7 +144,7 @@
     servePackages([
       packageMap("barback", previous),
       packageMap("barback", current),
-      packageMap("source_maps", sourceMapsVersion),
+      packageMap("source_span", sourceSpanVersion),
       packageMap("stack_trace", stackTraceVersion)
     ]);
 
diff --git a/sdk/lib/_internal/pub/test/implicit_dependency_test.dart b/sdk/lib/_internal/pub/test/implicit_dependency_test.dart
index b02123e..3f46637 100644
--- a/sdk/lib/_internal/pub/test/implicit_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/implicit_dependency_test.dart
@@ -18,7 +18,7 @@
         packageMap("stack_trace", current("stack_trace")),
         packageMap("stack_trace", nextPatch("stack_trace")),
         packageMap("stack_trace", max("stack_trace")),
-        packageMap("source_maps", current("source_maps"))
+        packageMap("source_span", current("source_span"))
       ]);
 
       d.appDir({
@@ -35,7 +35,7 @@
       servePackages([
         packageMap("barback", current("barback")),
         packageMap("stack_trace", nextPatch("stack_trace")),
-        packageMap("source_maps", current("source_maps"))
+        packageMap("source_span", current("source_span"))
       ]);
 
       d.dir("stack_trace", [
@@ -69,7 +69,7 @@
         packageMap("stack_trace", current("stack_trace")),
         packageMap("stack_trace", nextPatch("stack_trace")),
         packageMap("stack_trace", max("stack_trace")),
-        packageMap("source_maps", current("source_maps"))
+        packageMap("source_span", current("source_span"))
       ]);
 
       d.appDir({
@@ -88,7 +88,7 @@
       packageMap("barback", current("barback")),
       packageMap("stack_trace", previous("stack_trace")),
       packageMap("stack_trace", current("stack_trace")),
-      packageMap("source_maps", current("source_maps"))
+      packageMap("source_span", current("source_span"))
     ]);
 
     d.appDir({"barback": "any"}).create();
diff --git a/sdk/lib/_internal/pub/test/no_package_symlinks_test.dart b/sdk/lib/_internal/pub/test/no_package_symlinks_test.dart
new file mode 100644
index 0000000..12d5151
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/no_package_symlinks_test.dart
@@ -0,0 +1,115 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import 'descriptor.dart' as d;
+import 'test_pub.dart';
+
+main() {
+  initConfig();
+
+  forBothPubGetAndUpgrade((command) {
+    group("with --no-package-symlinks", () {
+      integration("installs hosted dependencies to the cache", () {
+        servePackages([
+          packageMap("foo", "1.0.0"),
+          packageMap("bar", "1.0.0")
+        ]);
+
+        d.appDir({"foo": "any", "bar": "any"}).create();
+
+        pubCommand(command, args: ["--no-package-symlinks"]);
+
+        d.nothing("$appPath/packages").validate();
+
+        d.hostedCache([
+          d.dir("foo-1.0.0", [
+            d.dir("lib", [d.file("foo.dart", 'main() => "foo 1.0.0";')])
+          ]),
+          d.dir("bar-1.0.0", [
+            d.dir("lib", [d.file("bar.dart", 'main() => "bar 1.0.0";')])
+          ])
+        ]).validate();
+      });
+
+      integration("installs git dependencies to the cache", () {
+        ensureGit();
+
+        d.git('foo.git', [
+          d.libDir('foo'),
+          d.libPubspec('foo', '1.0.0')
+        ]).create();
+
+        d.appDir({"foo": {"git": "../foo.git"}}).create();
+
+        pubCommand(command, args: ["--no-package-symlinks"]);
+
+        d.nothing("$appPath/packages").validate();
+
+        d.dir(cachePath, [
+          d.dir('git', [
+            d.dir('cache', [d.gitPackageRepoCacheDir('foo')]),
+            d.gitPackageRevisionCacheDir('foo')
+          ])
+        ]).validate();
+      });
+
+      integration("locks path dependencies", () {
+        d.dir("foo", [
+          d.libDir("foo"),
+          d.libPubspec("foo", "0.0.1")
+        ]).create();
+
+        d.dir(appPath, [
+          d.appPubspec({
+            "foo": {"path": "../foo"}
+          })
+        ]).create();
+
+        pubCommand(command, args: ["--no-package-symlinks"]);
+
+        d.nothing("$appPath/packages").validate();
+        d.matcherFile("$appPath/pubspec.lock", contains("foo"));
+      });
+
+      integration("removes package directories near entrypoints", () {
+        d.dir(appPath, [
+          d.appPubspec(),
+          d.dir("packages"),
+          d.dir("bin/packages"),
+          d.dir("web/packages"),
+          d.dir("web/subdir/packages")
+        ]).create();
+
+        pubCommand(command, args: ["--no-package-symlinks"]);
+
+        d.dir(appPath, [
+          d.nothing("packages"),
+          d.nothing("bin/packages"),
+          d.nothing("web/packages"),
+          d.nothing("web/subdir/packages")
+        ]).validate();
+      });
+
+      integration("doesn't remove package directories that pub wouldn't "
+          "generate", () {
+        d.dir(appPath, [
+          d.appPubspec(),
+          d.dir("packages"),
+          d.dir("bin/subdir/packages"),
+          d.dir("lib/packages")
+        ]).create();
+
+        pubCommand(command, args: ["--no-package-symlinks"]);
+
+        d.dir(appPath, [
+          d.nothing("packages"),
+          d.dir("bin/subdir/packages"),
+          d.dir("lib/packages")
+        ]).validate();
+      });
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/preprocess_test.dart b/sdk/lib/_internal/pub/test/preprocess_test.dart
index d908f1f..98aef17 100644
--- a/sdk/lib/_internal/pub/test/preprocess_test.dart
+++ b/sdk/lib/_internal/pub/test/preprocess_test.dart
@@ -37,8 +37,9 @@
   });
 
   group("if", () {
-    test("removes sections with non-matching versions", () {
-      expect(_preprocess('''
+    group("with a version range", () {
+      test("removes sections with non-matching versions", () {
+        expect(_preprocess('''
 before
 //# if barback <1.0.0
 inside
@@ -48,10 +49,10 @@
 before
 after
 '''));
-    });
+      });
 
-    test("doesn't insert section with non-matching versions", () {
-      expect(_preprocess('''
+      test("doesn't insert section with non-matching versions", () {
+        expect(_preprocess('''
 before
 //# if barback <1.0.0
 //> inside
@@ -61,10 +62,10 @@
 before
 after
 '''));
-    });
+      });
 
-    test("doesn't remove sections with matching versions", () {
-      expect(_preprocess('''
+      test("doesn't remove sections with matching versions", () {
+        expect(_preprocess('''
 before
 //# if barback >1.0.0
 inside
@@ -75,10 +76,10 @@
 inside
 after
 '''));
-    });
+      });
 
-    test("inserts sections with matching versions", () {
-      expect(_preprocess('''
+      test("inserts sections with matching versions", () {
+        expect(_preprocess('''
 before
 //# if barback >1.0.0
 //> inside
@@ -89,10 +90,10 @@
 inside
 after
 '''));
-    });
+      });
 
-    test("allows version ranges", () {
-      expect(_preprocess('''
+      test("allows multi-element version ranges", () {
+        expect(_preprocess('''
 before
 //# if barback >=1.0.0 <2.0.0
 inside 1
@@ -106,6 +107,63 @@
 inside 1
 after
 '''));
+      });
+    });
+
+    group("with a package name", () {
+      test("removes sections for a nonexistent package", () {
+        expect(_preprocess('''
+before
+//# if fblthp
+inside
+//# end
+after
+'''), equals('''
+before
+after
+'''));
+      });
+
+      test("doesn't insert sections for a nonexistent package", () {
+        expect(_preprocess('''
+before
+//# if fblthp
+//> inside
+//# end
+after
+'''), equals('''
+before
+after
+'''));
+      });
+
+      test("doesn't remove sections with an existent package", () {
+        expect(_preprocess('''
+before
+//# if barback
+inside
+//# end
+after
+'''), equals('''
+before
+inside
+after
+'''));
+      });
+
+      test("inserts sections with an existent package", () {
+        expect(_preprocess('''
+before
+//# if barback
+//> inside
+//# end
+after
+'''), equals('''
+before
+inside
+after
+'''));
+      });
     });
   });
 
@@ -189,21 +247,11 @@
         expect(() => _preprocess('//# if\n//# end'), throwsFormatException);
       });
 
-      test("disallows if with no version range", () {
-        expect(() => _preprocess('//# if barback\n//# end'),
-            throwsFormatException);
-      });
-
       test("disallows if with no package", () {
         expect(() => _preprocess('//# if <=1.0.0\n//# end'),
             throwsFormatException);
       });
 
-      test("disallows unknown package name", () {
-        expect(() => _preprocess('//# if polymer <=1.0.0\n//# end'),
-            throwsFormatException);
-      });
-
       test("disallows invalid version constraint", () {
         expect(() => _preprocess('//# if barback >=1.0\n//# end'),
             throwsFormatException);
@@ -252,4 +300,4 @@
 }
 
 String _preprocess(String input) =>
-    preprocess(input, new Version.parse("1.2.3"), 'source/url');
+    preprocess(input, {'barback': new Version.parse("1.2.3")}, 'source/url');
diff --git a/sdk/lib/_internal/pub/test/serve/allows_arbitrary_modes_test.dart b/sdk/lib/_internal/pub/test/serve/allows_arbitrary_modes_test.dart
index d124a44..9eb7ccf 100644
--- a/sdk/lib/_internal/pub/test/serve/allows_arbitrary_modes_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/allows_arbitrary_modes_test.dart
@@ -12,7 +12,6 @@
 import 'dart:async';
 
 import 'package:barback/barback.dart';
-import 'package:source_maps/source_maps.dart';
 
 class ModeTransformer extends Transformer {
   final BarbackSettings settings;
diff --git a/sdk/lib/_internal/pub/test/serve/defaults_to_debug_mode_test.dart b/sdk/lib/_internal/pub/test/serve/defaults_to_debug_mode_test.dart
index f83f405..5037824 100644
--- a/sdk/lib/_internal/pub/test/serve/defaults_to_debug_mode_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/defaults_to_debug_mode_test.dart
@@ -12,7 +12,6 @@
 import 'dart:async';
 
 import 'package:barback/barback.dart';
-import 'package:source_maps/source_maps.dart';
 
 class ModeTransformer extends Transformer {
   final BarbackSettings settings;
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index 6729e0d..5b499e3 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -74,9 +74,12 @@
 Matcher isUnminifiedDart2JSOutput =
     contains("// The code supports the following hooks");
 
-/// The directory containing the version of barback that should be used for this
-/// test.
-String _barbackDir;
+/// A map from package names to paths from which those packages should be loaded
+/// for [createLockFile].
+///
+/// This allows older versions of dependencies than those that exist in the repo
+/// to be used when testing pub.
+Map<String, String> _packageOverrides;
 
 /// A map from barback versions to the paths of directories in the repo
 /// containing them.
@@ -85,6 +88,18 @@
 /// versions of barback in third_party.
 final _barbackVersions = _findBarbackVersions();
 
+/// Some older barback versions require older versions of barback's dependencies
+/// than those that are in the repo.
+///
+/// This is a map from barback version ranges to the dependencies for those
+/// barback versions. Each dependency version listed here should be included in
+/// third_party/pkg.
+final _barbackDeps = {
+  new VersionConstraint.parse("<0.15.0"): {
+    "source_maps": "0.9.4"
+  }
+};
+
 /// Populates [_barbackVersions].
 Map<Version, String> _findBarbackVersions() {
   var versions = {};
@@ -119,7 +134,19 @@
   for (var version in validVersions) {
     group("with barback $version", () {
       setUp(() {
-        _barbackDir = _barbackVersions[version];
+        _packageOverrides = {};
+        _packageOverrides['barback'] = _barbackVersions[version];
+        _barbackDeps.forEach((constraint, deps) {
+          if (!constraint.allows(version)) return;
+          deps.forEach((packageName, version) {
+            _packageOverrides[packageName] = path.join(
+                repoRoot, 'third_party', 'pkg', '$packageName-$version');
+          });
+        });
+
+        currentSchedule.onComplete.schedule(() {
+          _packageOverrides = null;
+        });
       });
 
       callback();
@@ -789,13 +816,14 @@
       if (dependencies.containsKey(package)) return;
 
       var packagePath;
-      if (package == 'barback') {
-        if (_barbackDir == null) {
-          throw new StateError("createLockFile() can only create a lock file "
-              "with a barback dependency within a withBarbackVersions() "
-              "block.");
-        }
-        packagePath = _barbackDir;
+      if (package == 'barback' && _packageOverrides == null) {
+        throw new StateError("createLockFile() can only create a lock file "
+            "with a barback dependency within a withBarbackVersions() "
+            "block.");
+      }
+
+      if (_packageOverrides.containsKey(package)) {
+        packagePath = _packageOverrides[package];
       } else {
         packagePath = path.join(pkgPath, package);
       }
diff --git a/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart b/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart
index 528b9c8..da82d5d 100644
--- a/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart
@@ -11,7 +11,7 @@
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 
-const TRANSFORMER = """
+const SOURCE_MAPS_TRANSFORMER = """
 import 'dart:async';
 
 import 'package:barback/barback.dart';
@@ -38,52 +38,87 @@
 }
 """;
 
+const SOURCE_SPAN_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:source_span/source_span.dart';
+
+class RewriteTransformer extends Transformer {
+  RewriteTransformer.asPlugin();
+
+  String get allowedExtensions => '.txt';
+
+  Future apply(Transform transform) {
+    transform.logger.info('info!');
+    transform.logger.warning('Warning!',
+        asset: transform.primaryInput.id.changeExtension('.foo'));
+    var sourceFile = new SourceFile('not a real\\ndart file',
+        url: 'http://fake.com/not_real.dart');
+    transform.logger.error('ERROR!', span: sourceFile.span(11, 12));
+    return transform.primaryInput.readAsString().then((contents) {
+      var id = transform.primaryInput.id.changeExtension(".out");
+      transform.addOutput(new Asset.fromString(id, "\$contents.out"));
+    });
+  }
+}
+""";
+
 main() {
   initConfig();
-  withBarbackVersions("any", () {
-    integration("can log messages", () {
-      d.dir(appPath, [
-        d.pubspec({
-          "name": "myapp",
-          "transformers": ["myapp/src/transformer"]
-        }),
-        d.dir("lib", [d.dir("src", [
-          d.file("transformer.dart", TRANSFORMER)
-        ])]),
-        d.dir("web", [
-          d.file("foo.txt", "foo")
-        ])
-      ]).create();
+  // This intentionally tests barback 0.14.2 with both transformers, since it
+  // supports both types of span.
+  withBarbackVersions("<0.15.0", () => runTest(SOURCE_MAPS_TRANSFORMER));
+  withBarbackVersions(">=0.14.2", () => runTest(SOURCE_SPAN_TRANSFORMER));
+}
 
-      createLockFile('myapp', pkg: ['barback']);
+void runTest(String transformerText) {
+  integration("can log messages", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp/src/transformer"]
+      }),
+      d.dir("lib", [d.dir("src", [
+        d.file("transformer.dart", transformerText)
+      ])]),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
 
-      var pub = startPub(args: ["build"]);
-      pub.stdout.expect(startsWith("Loading source assets..."));
-      pub.stdout.expect(consumeWhile(matches("Loading .* transformers...")));
-      pub.stdout.expect(startsWith("Building myapp..."));
+    createLockFile('myapp', pkg: ['barback']);
 
-      pub.stdout.expect(emitsLines("""
+    var pub = startPub(args: ["build"]);
+    pub.stdout.expect(startsWith("Loading source assets..."));
+    pub.stdout.expect(consumeWhile(matches("Loading .* transformers...")));
+    pub.stdout.expect(startsWith("Building myapp..."));
+
+    pub.stdout.expect(emitsLines("""
 [Rewrite on myapp|web/foo.txt]:
 info!"""));
 
-      pub.stderr.expect(emitsLines("""
+    pub.stderr.expect(emitsLines("""
 [Rewrite on myapp|web/foo.txt with input myapp|web/foo.foo]:
 Warning!
 [Rewrite on myapp|web/foo.txt]:"""));
 
-      // The details of the analyzer's error message change pretty frequently,
-      // so instead of validating the entire line, just look for a couple of
-      // salient bits of information.
-      pub.stderr.expect(allOf([
-        contains("2"),                              // The line number.
-        contains("1"),                              // The column number.
-        contains("http://fake.com/not_real.dart"),  // The library.
-        contains("ERROR"),                          // That it's an error.
-      ]));
+    // The details of the analyzer's error message change pretty frequently,
+    // so instead of validating the entire line, just look for a couple of
+    // salient bits of information.
+    pub.stderr.expect(allOf([
+      contains("2"),                              // The line number.
+      contains("1"),                              // The column number.
+      contains("http://fake.com/not_real.dart"),  // The library.
+      contains("ERROR"),                          // That it's an error.
+    ]));
 
-      pub.stderr.expect("Build failed.");
+    // In barback >=0.15.0, the span will point to the location where the error
+    // occurred.
+    pub.stderr.expect(allow(inOrder(["d", "^"])));
 
-      pub.shouldExit(exit_codes.DATA);
-    });
+    pub.stderr.expect("Build failed.");
+
+    pub.shouldExit(exit_codes.DATA);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/version_solver_test.dart b/sdk/lib/_internal/pub/test/version_solver_test.dart
index 000ea2b..de0d113 100644
--- a/sdk/lib/_internal/pub/test/version_solver_test.dart
+++ b/sdk/lib/_internal/pub/test/version_solver_test.dart
@@ -893,11 +893,11 @@
     },
     'a 1.0.0-dev': {},
     'a 1.1.0-dev': {},
-    'a 2.0.0-dev': {},
+    'a 1.9.0-dev': {},
     'a 3.0.0': {}
   }, result: {
     'myapp from root': '0.0.0',
-    'a': '2.0.0-dev'
+    'a': '1.9.0-dev'
   });
 
   testResolve('use an earlier stable version on a < constraint', {
diff --git a/sdk/lib/_internal/pub/test/version_test.dart b/sdk/lib/_internal/pub/test/version_test.dart
index 8e6a825..0bfe60e 100644
--- a/sdk/lib/_internal/pub/test/version_test.dart
+++ b/sdk/lib/_internal/pub/test/version_test.dart
@@ -253,7 +253,7 @@
 
     group('allows()', () {
       test('version must be greater than min', () {
-        var range = new VersionRange(min: v123, max: v234);
+        var range = new VersionRange(min: v123);
 
         expect(range.allows(new Version.parse('1.2.2')), isFalse);
         expect(range.allows(new Version.parse('1.2.3')), isFalse);
@@ -262,7 +262,7 @@
       });
 
       test('version must be min or greater if includeMin', () {
-        var range = new VersionRange(min: v123, max: v234, includeMin: true);
+        var range = new VersionRange(min: v123, includeMin: true);
 
         expect(range.allows(new Version.parse('1.2.2')), isFalse);
         expect(range.allows(new Version.parse('1.2.3')), isTrue);
@@ -270,20 +270,46 @@
         expect(range.allows(new Version.parse('2.3.3')), isTrue);
       });
 
+      test('pre-release versions of inclusive min are excluded', () {
+        var range = new VersionRange(min: v123, includeMin: true);
+
+        expect(range.allows(new Version.parse('1.2.3-dev')), isFalse);
+        expect(range.allows(new Version.parse('1.2.4-dev')), isTrue);
+      });
+
       test('version must be less than max', () {
-        var range = new VersionRange(min: v123, max: v234);
+        var range = new VersionRange(max: v234);
 
         expect(range.allows(new Version.parse('2.3.3')), isTrue);
         expect(range.allows(new Version.parse('2.3.4')), isFalse);
         expect(range.allows(new Version.parse('2.4.3')), isFalse);
       });
 
+      test('pre-release versions of non-pre-release max are excluded', () {
+        var range = new VersionRange(max: v234);
+
+        expect(range.allows(new Version.parse('2.3.3')), isTrue);
+        expect(range.allows(new Version.parse('2.3.4-dev')), isFalse);
+        expect(range.allows(new Version.parse('2.3.4')), isFalse);
+      });
+
+      test('pre-release versions of pre-release max are included', () {
+        var range = new VersionRange(max: new Version.parse('2.3.4-dev.2'));
+
+        expect(range.allows(new Version.parse('2.3.4-dev.1')), isTrue);
+        expect(range.allows(new Version.parse('2.3.4-dev.2')), isFalse);
+        expect(range.allows(new Version.parse('2.3.4-dev.3')), isFalse);
+      });
+
       test('version must be max or less if includeMax', () {
         var range = new VersionRange(min: v123, max: v234, includeMax: true);
 
         expect(range.allows(new Version.parse('2.3.3')), isTrue);
         expect(range.allows(new Version.parse('2.3.4')), isTrue);
         expect(range.allows(new Version.parse('2.4.3')), isFalse);
+
+        // Pre-releases of the max are allowed.
+        expect(range.allows(new Version.parse('2.3.4-dev')), isTrue);
       });
 
       test('has no min if one was not set', () {
@@ -416,7 +442,7 @@
       test('parses a "<" maximum version', () {
         expect(new VersionConstraint.parse('<1.2.3'), allows([
             new Version.parse('1.2.1'),
-            new Version.parse('1.2.3-build')]));
+            new Version.parse('1.2.2+foo')]));
         expect(new VersionConstraint.parse('<1.2.3'), doesNotAllow([
             new Version.parse('1.2.3'),
             new Version.parse('1.2.3+foo'),
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index ad7ac44..1f85d93 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -535,7 +535,7 @@
  * when you're converting a callback-based API into a Future-based
  * one — you can use a Completer as follows:
  *
- *     Class AsyncOperation {
+ *     class AsyncOperation {
  *       Completer _completer = new Completer();
  *
  *       Future<T> doOperation() {
diff --git a/sdk/lib/convert/utf.dart b/sdk/lib/convert/utf.dart
index 5b28193..9c41626 100644
--- a/sdk/lib/convert/utf.dart
+++ b/sdk/lib/convert/utf.dart
@@ -420,13 +420,21 @@
     int value = _value;
     int expectedUnits = _expectedUnits;
     int extraUnits = _extraUnits;
-    int singleBytesCount = 0;
     _value = 0;
     _expectedUnits = 0;
     _extraUnits = 0;
 
+    int scanOneByteCharacters(units, int from) {
+      final to = endIndex;
+      final mask = _ONE_BYTE_LIMIT;
+      for (var i = from; i < to; i++) {
+        final unit = units[i];
+        if ((unit & mask) != unit) return i - from;
+      }
+      return to - from;
+    }
+
     void addSingleBytes(int from, int to) {
-      assert(singleBytesCount > 0);
       assert(from >= startIndex && from <= endIndex);
       assert(to >= startIndex && to <= endIndex);
       if (from == 0 && to == codeUnits.length) {
@@ -435,7 +443,6 @@
         _stringSink.write(
             new String.fromCharCodes(codeUnits.sublist(from, to)));
       }
-      singleBytesCount = 0;
     }
 
     int i = startIndex;
@@ -485,6 +492,13 @@
       }
 
       while (i < endIndex) {
+        int oneBytes = scanOneByteCharacters(codeUnits, i);
+        if (oneBytes > 0) {
+          _isFirstCharacter = false;
+          addSingleBytes(i, i + oneBytes);
+          i += oneBytes;
+          if (i == endIndex) break;
+        }
         int unit = codeUnits[i++];
         // TODO(floitsch): the way we test we could potentially allow
         // units that are too large, if they happen to have the
@@ -493,23 +507,13 @@
         // https://codereview.chromium.org/22929022/diff/1/sdk/lib/convert/utf.dart?column_width=80
         if (unit < 0) {
           // TODO(floitsch): should this be unit <= 0 ?
-          if (singleBytesCount > 0) {
-            int to = i - 1;
-            addSingleBytes(to - singleBytesCount, to);
-          }
           if (!_allowMalformed) {
             throw new FormatException(
                 "Negative UTF-8 code unit: -0x${(-unit).toRadixString(16)}");
           }
           _stringSink.writeCharCode(UNICODE_REPLACEMENT_CHARACTER_RUNE);
-        } else if (unit <= _ONE_BYTE_LIMIT) {
-          _isFirstCharacter = false;
-          singleBytesCount++;
         } else {
-          if (singleBytesCount > 0) {
-            int to = i - 1;
-            addSingleBytes(to - singleBytesCount, to);
-          }
+          assert(unit > _ONE_BYTE_LIMIT);
           if ((unit & 0xE0) == 0xC0) {
             value = unit & 0x1F;
             expectedUnits = extraUnits = 1;
@@ -538,9 +542,6 @@
       }
       break loop;
     }
-    if (singleBytesCount > 0) {
-      addSingleBytes(i - singleBytesCount, endIndex);
-    }
     if (expectedUnits > 0) {
       _value = value;
       _expectedUnits = expectedUnits;
diff --git a/sdk/lib/core/num.dart b/sdk/lib/core/num.dart
index 825dba0..8de6c86 100644
--- a/sdk/lib/core/num.dart
+++ b/sdk/lib/core/num.dart
@@ -16,6 +16,7 @@
    *
    * If both operands are doubles, they are equal if they have the same
    * representation, except that:
+   *
    *   * zero and minus zero (0.0 and -0.0) are considered equal. They
    *     both have the numerical value zero.
    *   * NaN is not equal to anything, including NaN. If either operand is
@@ -23,7 +24,7 @@
    *
    * If one operand is a double and the other is an int, they are equal if
    * the double has an integer value (finite with no fractional part) and
-   * `identical(doubleValue.toInt(), intValue)`.
+   * `identical(doubleValue.toInt(), intValue)` is true.
    *
    * If both operands are integers, they are equal if they have the same value.
    *
diff --git a/sdk/lib/io/platform.dart b/sdk/lib/io/platform.dart
index c1447c4..b90afe4 100644
--- a/sdk/lib/io/platform.dart
+++ b/sdk/lib/io/platform.dart
@@ -72,9 +72,6 @@
   static final _localHostname = _Platform.localHostname;
   static final _version = _Platform.version;
 
-  // This script singleton is written to by the embedder if applicable.
-  static String _nativeScript = '';
-
   /**
    * Get the number of processors of the machine.
    */
diff --git a/sdk/lib/io/platform_impl.dart b/sdk/lib/io/platform_impl.dart
index 91bb7a7..0cffec6 100644
--- a/sdk/lib/io/platform_impl.dart
+++ b/sdk/lib/io/platform_impl.dart
@@ -25,16 +25,18 @@
   static int get numberOfProcessors => _numberOfProcessors();
   static String get pathSeparator => _pathSeparator();
   static String get operatingSystem => _operatingSystem();
-  static Uri script = _script();
-  static Uri _script() {
-    // The embedder (Dart executable) creates the Platform._nativeScript field.
-    var s = Platform._nativeScript;
-    if (s.startsWith('http:') ||
-        s.startsWith('https:') ||
-        s.startsWith('file:')) {
-      return Uri.parse(s);
+  static Uri script;
+
+  // This script singleton is written to by the embedder if applicable.
+  static void set _nativeScript(String path) {
+    if (path.startsWith('http:') ||
+        path.startsWith('https:') ||
+        path.startsWith('package:') ||
+        path.startsWith('dart:') ||
+        path.startsWith('file:')) {
+      script = Uri.parse(path);
     } else {
-      return Uri.base.resolveUri(new Uri.file(s));
+      script = Uri.base.resolveUri(new Uri.file(path));
     }
   }
 
diff --git a/sdk/lib/js/dart2js/js_dart2js.dart b/sdk/lib/js/dart2js/js_dart2js.dart
index 27fac2e..9bf0a20 100644
--- a/sdk/lib/js/dart2js/js_dart2js.dart
+++ b/sdk/lib/js/dart2js/js_dart2js.dart
@@ -455,7 +455,8 @@
   }
 
   void sort([int compare(E a, E b)]) {
-    callMethod('sort', [compare]);
+    // Note: arr.sort(null) is a type error in FF
+    callMethod('sort', compare == null ? [] : [compare]);
   }
 }
 
@@ -495,9 +496,10 @@
 final _dartProxyCtor = JS('', 'function DartObject(o) { this.o = o; }');
 
 dynamic _convertToJS(dynamic o) {
-  if (o == null) {
-    return null;
-  } else if (o is String || o is num || o is bool) {
+  // Note: we don't write `if (o == null) return null;` to make sure dart2js
+  // doesn't convert `return null;` into `return;` (which would make `null` be
+  // `undefined` in Javascprit). See dartbug.com/20305 for details.
+  if (o == null || o is String || o is num || o is bool) {
     return o;
   } else if (o is Blob || o is Event || o is KeyRange || o is ImageData
       || o is Node || o is TypedData || o is Window) {
diff --git a/sdk/lib/profiler/profiler.dart b/sdk/lib/profiler/profiler.dart
index 0bcae56..e30fd1d 100644
--- a/sdk/lib/profiler/profiler.dart
+++ b/sdk/lib/profiler/profiler.dart
@@ -4,6 +4,8 @@
 
 library dart.profiler;
 
+import 'dart:convert';
+
 /// A UserTag can be used to group samples in the Observatory profiler.
 abstract class UserTag {
   /// The maximum number of UserTag instances that can be created by a program.
@@ -63,3 +65,135 @@
 UserTag getCurrentTag() {
   return _currentTag;
 }
+
+/// Abstract [Metric] class. Metric names must be unique, are hierarchical,
+/// and use periods as separators. For example, 'a.b.c'. Uniqueness is only
+/// enforced when a Metric is registered. The name of a metric cannot contain
+/// the slash ('/') character.
+abstract class Metric {
+  /// [name] of this metric.
+  final String name;
+  /// [description] of this metric.
+  final String description;
+
+  Metric(this.name, this.description) {
+    if (name.contains('/')) {
+      throw new ArgumentError('Invalid Metric name.');
+    }
+  }
+
+  Map _toJSON();
+}
+
+/// A measured value with a min and max. Initial value is min. Value will
+/// be clamped to the interval [min, max].
+class Gauge extends Metric {
+  final double min;
+  final double max;
+
+  double _value;
+  double get value => _value;
+  set value(double v) {
+    if (v < min) {
+      v = min;
+    } else if (v > max) {
+      v = max;
+    }
+    _value = v;
+  }
+
+  Gauge(String name, String description, this.min, this.max)
+      : super(name, description) {
+    if (min is! double) {
+      throw new ArgumentError('min must be a double');
+    }
+    if (max is! double) {
+      throw new ArgumentError('max must be a double');
+    }
+    if (!(min < max)) {
+      throw new ArgumentError('min must be less than max');
+    }
+    _value = min;
+  }
+
+  Map _toJSON() {
+    var map = {
+      'type': 'Gauge',
+      'id': 'metrics/$name',
+      'name': name,
+      'description': description,
+      'value': value,
+      'min': min,
+      'max': max,
+    };
+    return map;
+  }
+}
+
+
+/// A changing value. Initial value is 0.0.
+class Counter extends Metric {
+  Counter(String name, String description)
+      : super(name, description);
+
+  double _value = 0.0;
+  double get value => _value;
+  set value(double v) {
+    _value = v;
+  }
+
+  Map _toJSON() {
+    var map = {
+      'type': 'Counter',
+      'id': 'metrics/$name',
+      'name': name,
+      'description': description,
+      'value': value,
+    };
+    return map;
+  }
+}
+
+class Metrics {
+  static final Map<String, Metric> _metrics = new Map<String, Metric>();
+
+  /// Register [Metric]s to make them visible to Observatory.
+  static void register(Metric metric) {
+    if (metric is! Metric) {
+      throw new ArgumentError('metric must be a Metric');
+    }
+    if (_metrics[metric.name] != null) {
+      throw new ArgumentError('Registered metrics have unique names');
+    }
+    _metrics[metric.name] = metric;
+  }
+
+  /// Deregister [Metric]s to make them not visible to Observatory.
+  static void deregister(Metric metric) {
+    if (metric is! Metric) {
+      throw new ArgumentError('metric must be a Metric');
+    }
+    _metrics.remove(metric.name);
+  }
+
+  static String _printMetric(String id) {
+    var metric = _metrics[id];
+    if (metric == null) {
+      return null;
+    }
+    return JSON.encode(metric._toJSON());
+  }
+
+  static String _printMetrics() {
+    var members = [];
+    for (var metric in _metrics.values) {
+      members.add(metric._toJSON());
+    }
+    var map = {
+      'type': 'MetricList',
+      'id': 'metrics',
+      'members': members,
+    };
+    return JSON.encode(map);
+  }
+}
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index 5f37f97..2832f32 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -146,7 +146,6 @@
 LibTest/html/Document/clone_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/Document/clone_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/Document/securityPolicy_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Element/Element.tag_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/Element/borderEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/Element/contentEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/Element/dataset_A02_t01: RuntimeError # Issue 17758.  Please triage this failure.
@@ -156,7 +155,6 @@
 LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/Element/isContentEditable_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/Element/isContentEditable_A02_t01: RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/Element/marginEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/Element/paddingEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LibTest/html/Element/replaceWith_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
@@ -258,14 +256,6 @@
 WebPlatformTest/custom-elements/concepts/type_A03_t01: RuntimeError # Issue 19055.
 WebPlatformTest/custom-elements/concepts/type_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/custom-elements/concepts/type_A06_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/createElement_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/createElement_A03_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/template-end-tag-without-start-one_t01: RuntimeError # co19-roll r722: Please triage this failure.
diff --git a/tests/compiler/dart2js/list_tracer_typed_data_length_test.dart b/tests/compiler/dart2js/list_tracer_typed_data_length_test.dart
new file mode 100644
index 0000000..b5ccc80
--- /dev/null
+++ b/tests/compiler/dart2js/list_tracer_typed_data_length_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import "package:async_helper/async_helper.dart";
+import 'package:compiler/implementation/types/types.dart'
+    show ContainerTypeMask, TypeMask;
+    
+import 'memory_compiler.dart';
+import 'compiler_helper.dart' show findElement;
+import 'type_mask_test_helper.dart';
+
+const TEST = const {
+  'main.dart' : r'''
+import 'dart:typed_data';
+
+var myList = new Float32List(42);
+var myOtherList = new Uint8List(32);
+
+main() {
+  var a = new Float32List(9);
+  return myList[0] + myOtherList[0];
+}
+'''};
+
+void main() {
+  var compiler = compilerFor(TEST);
+  asyncTest(() => compiler.run(Uri.parse('memory:main.dart')).then((_) {
+    var typesInferrer = compiler.typesTask.typesInferrer;
+
+    checkType(String name, type, length) {
+      var element = findElement(compiler, name);
+      TypeMask mask = typesInferrer.getTypeOfElement(element);
+      Expect.isTrue(mask.isContainer);
+      ContainerTypeMask container = mask;
+      Expect.equals(type, simplify(container.elementType, compiler), name);
+      Expect.equals(container.length, length);
+    }
+
+    checkType('myList', compiler.typesTask.numType, 42);
+    checkType('myOtherList', compiler.typesTask.uint31Type, 32);
+  }));
+}
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 3e27f11..11c51f2 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -34,16 +34,14 @@
 
 symbol_test/01: Fail, Pass # bug 11669
 
-# const Symbol('void') should be allowed.
-[ $compiler == dart2analyzer ]
-symbol_reserved_word_test/01: CompileTimeError
-
 # #void should be a valid symbol.
-[ $compiler == none || $compiler == dart2js || $compiler == dart2dart || $compiler == dartanalyzer || $compiler == dart2analyzer ]
+[ $compiler == none || $compiler == dart2js || $compiler == dart2dart ]
 symbol_reserved_word_test/02: CompileTimeError # bug 20191
+symbol_reserved_word_test/05: CompileTimeError # bug 20191
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 symbol_reserved_word_test/02: RuntimeError # bug 20191 / dartium/drt cannot detect CompileTimeErrors
+symbol_reserved_word_test/05: RuntimeError # bug 20191 / dartium/drt cannot detect CompileTimeErrors
 
 # new Symbol('void') should be allowed.
 [ $compiler == dart2js ]
diff --git a/tests/corelib/symbol_reserved_word_test.dart b/tests/corelib/symbol_reserved_word_test.dart
index 7a61aab..901fb34 100644
--- a/tests/corelib/symbol_reserved_word_test.dart
+++ b/tests/corelib/symbol_reserved_word_test.dart
@@ -18,7 +18,7 @@
 
   // However, it is not allowed as a part of a symbol name.
   x = const Symbol('void.foo'); /// 04: compile-time error
-  x = #void.foo;                /// 05: compile-time error
+  x = #void.foo;                /// 05: static type warning
   checkBadSymbol('void.foo');   /// 06: ok
   x = const Symbol('foo.void'); /// 07: compile-time error
   x = #foo.void;                /// 08: compile-time error
diff --git a/tests/html/canvasrenderingcontext2d_test.dart b/tests/html/canvasrenderingcontext2d_test.dart
index 73eeeb7a..ffd8b8d 100644
--- a/tests/html/canvasrenderingcontext2d_test.dart
+++ b/tests/html/canvasrenderingcontext2d_test.dart
@@ -678,7 +678,7 @@
       // Draw a blue box.
       context.fillText('█', x, y);
 
-      var width = context.measureText('█').width.toInt();
+      var width = context.measureText('█').width.ceil();
 
       checkPixel(readPixel(x, y), [0, 0, 255, 255]);
       checkPixel(readPixel(x + 10, y), [0, 0, 255, 255]);
@@ -699,7 +699,7 @@
       // Draw a blue box with null maxWidth.
       context.fillText('█', x, y, null);
 
-      var width = context.measureText('█').width.toInt();
+      var width = context.measureText('█').width.ceil();
 
       checkPixel(readPixel(x, y), [0, 0, 255, 255]);
       checkPixel(readPixel(x + 10, y), [0, 0, 255, 255]);
diff --git a/tests/html/html.status b/tests/html/html.status
index bf8def6..55d6dfb 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -46,7 +46,6 @@
 audiobuffersourcenode_test/functional: Skip # Causes the following (next) test to time out.  Issue 19127
 audiocontext_test/functional: Skip # Causes the following (next) test to time out.  Issue 19127
 canvasrenderingcontext2d_test/drawImage_video_element: RuntimeError # Issue 19127
-canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: RuntimeError # Issue 19127
 css_test/supportsPointConversions: Skip # Times out. Issue 19127
 element_offset_test/offset: Skip # Issue 17550
 indexeddb_1_test/functional: RuntimeError # Issue 19127. Actually a timeout, but do not skip.
@@ -82,7 +81,6 @@
 xhr_test/json: Fail # TODO(dart2js-team): Please triage this failure.
 
 [ $runtime == safarimobilesim ]
-canvasrenderingcontext2d_test/fillText: RuntimeError # Issue 18573
 element_offset_test/offset: RuntimeError # Issue 18573
 element_types_test/supported_meter: RuntimeError # Issue 18573
 
diff --git a/tests/language/async_backwards_compatibility_1_test.dart b/tests/language/async_backwards_compatibility_1_test.dart
new file mode 100644
index 0000000..9390879
--- /dev/null
+++ b/tests/language/async_backwards_compatibility_1_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'async_helper_lib.dart' as async;
+
+class A {
+  async.async get async => null;
+}
+
+async.async topLevel() => null;
+
+main() {
+  var a = new A();
+  var b = a.async;
+  var c = topLevel();
+}
diff --git a/tests/language/async_backwards_compatibility_2_test.dart b/tests/language/async_backwards_compatibility_2_test.dart
new file mode 100644
index 0000000..4f9074f
--- /dev/null
+++ b/tests/language/async_backwards_compatibility_2_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+int get async { return 1; }
+
+class A {
+  async() => null;
+}
+
+main() {
+  var a = async;
+  var b = new A();
+  var c = b.async();
+}
diff --git a/tests/language/async_helper_lib.dart b/tests/language/async_helper_lib.dart
new file mode 100644
index 0000000..269ec6d7
--- /dev/null
+++ b/tests/language/async_helper_lib.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library async;
+class async {}
diff --git a/tests/language/async_test.dart b/tests/language/async_test.dart
new file mode 100644
index 0000000..d9e6381
--- /dev/null
+++ b/tests/language/async_test.dart
@@ -0,0 +1,129 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--enable_async
+
+import 'package:expect/expect.dart';
+
+import 'dart:async';
+
+topLevelFunction() async { }
+
+Future<int> topLevelWithParameter(int a) async {
+  return 7 + a;
+}
+
+int topLevelWithParameterWrongType(int a) async {
+  return 7 + a;
+}
+
+var what = 'async getter';
+Future<String> get topLevelGetter async {
+  return 'I want to be an ${what}';
+}
+
+class A {
+  static int staticVar = 1;
+
+  static staticMethod(int param) async => staticVar + param;
+  static get staticGetter async => staticVar + 3;
+
+  int _x;
+  A(this._x);
+
+  A.fail() async;  /// constructor2: compile-time error
+  factory A.create() async {return null; } /// constructor3: compile-time error
+
+  int someMethod(int param1, int param2, int param3) async => _x + param2;
+  int get getter async { return 5 + _x; }
+  operator+(A other) async {
+    return new A(_x + other._x);
+  }
+
+  get value => _x;
+}
+
+class B {
+  final _y;
+  const B._internal(this._y);
+  const factory B.createConst(int y) async = A._internal;  /// constructor4: compile-time error
+
+  B();
+
+  set dontDoThat(value) async {}  /// setter1: compile-time error
+}
+
+
+main() {
+  var asyncReturn;
+
+  asyncReturn = topLevelFunction();
+  Expect.isTrue(asyncReturn is Future);
+
+  int a1 = topLevelWithParameter(2);  /// type-mismatch1: static type warning, dynamic type error
+  int a2 = topLevelWithParameterWrongType(2);  /// type-mismatch2: static type warning, dynamic type error
+  asyncReturn = topLevelWithParameter(4);
+  Expect.isTrue(asyncReturn is Future);
+  asyncReturn.then((int result) => Expect.equals(result, 11));
+
+  asyncReturn = topLevelGetter;
+  Expect.isTrue(asyncReturn is Future);
+  asyncReturn.then((String result) =>
+      Expect.stringEquals(result, 'I want to be an async getter'));
+
+  asyncReturn = A.staticMethod(2);
+  Expect.isTrue(asyncReturn is Future);
+  asyncReturn.then((int result) => Expect.equals(result, 3));
+
+  asyncReturn = A.staticGetter;
+  Expect.isTrue(asyncReturn is Future);
+  asyncReturn.then((int result) => Expect.equals(result, 4));
+
+  A a = new A(13);
+
+  asyncReturn = a.someMethod(1,2,3);  /// type-mismatch3: static type warning, dynamic type error
+  Expect.isTrue(asyncReturn is Future);  /// type-mismatch3: continued
+  asyncReturn.then((int result) => Expect.equals(result, 15));  /// type-mismatch3: continued
+
+  asyncReturn = a.getter;  /// type-mismatch4: static type warning, dynamic type error
+  Expect.isTrue(asyncReturn is Future);  /// type-mismatch4: continued
+  asyncReturn.then((int result) => Expect.equals(result, 18));  /// type-mismatch4: continued
+
+  var b = new A(9);
+  asyncReturn = a + b;
+  Expect.isTrue(asyncReturn is Future);
+  asyncReturn.then((A result) => Expect.equals(result.value, 22));
+
+  var foo = 17;
+  bar(int p1, p2) async { 
+    var z = 8;
+    return p2 + z + foo; 
+  }
+  asyncReturn = bar(1,2);
+  Expect.isTrue(asyncReturn is Future);
+  asyncReturn.then((int result) => Expect.equals(result, 27));
+
+  var moreNesting = (int shadowP1, String p2, num p3) {
+    var z = 3;
+    aa(int shadowP1) async {
+      return foo + z + p3 + shadowP1;
+    }
+    return aa(6);
+  };
+  asyncReturn = moreNesting(1, "ignore", 2);
+  Expect.isTrue(asyncReturn is Future);
+  asyncReturn.then((int result) => Expect.equals(result, 28));
+
+  var b1 = const B.createConst(4);  /// constructor4: compile-time error
+  var b2 = new B();
+  b2.dontDoThat = 4;  /// setter1: compile-time error
+
+  var checkAsync = (var someFunc) {
+    var toTest = someFunc();
+    Expect.isTrue(toTest is Future);
+    toTest.then((int result) => Expect.equals(result, 4));
+  };
+  checkAsync(() async => 4);
+
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index 5e8b8c5..13465ba 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -31,8 +31,13 @@
 deferred_constraints_constants_old_syntax_test/constructor1: Fail, Ok
 deferred_constraints_constants_old_syntax_test/constructor2: Fail, Ok
 
+[ $runtime != vm ]
+# Async tests are currently only supported by the vm.
+async_test/*: Skip
 
 [ $compiler == dart2dart]
+# Async tests are not yet supported in dart2dart.
+async_test/*: Skip
 deferred_load_library_wrong_args_test/none: Fail # Issue 17523
 deferred_load_inval_code_test: Fail # Issue 17523
 deferred_not_loaded_check_test: Fail # Issue 17523
@@ -130,6 +135,7 @@
 closure7_test: Skip # Times out. Issue 19127
 abstract_exact_selector_test/01: Skip # Times out. Issue 19127
 function_subtype_local1_test: Skip # Times out. Issue 19127
+try_catch_syntax_test/13: Skip # Times out flakily.  Issue 19127
 
 [ $compiler == none && $runtime == vm && $arch == mips && $checked ]
 generic_instanceof3_test: Pass, Crash # Issue 17440.
@@ -138,5 +144,5 @@
 stack_overflow_test: Skip # Crashes. Issue 17440.
 stack_overflow_stacktrace_test: Skip # Crashes. Issue 17440.
 
-[ $compiler == none || $compiler == dart2analyzer ]
+[ $compiler == none ]
 const_constructor_nonconst_field_test/01: Fail # Issue 18779, 18780
diff --git a/tests/lib/js/null_test.dart b/tests/lib/js/null_test.dart
new file mode 100644
index 0000000..82bc9df
--- /dev/null
+++ b/tests/lib/js/null_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library null_test;
+
+import 'dart:js';
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+
+main() {
+  useHtmlConfiguration();
+  test('null is sent as null', () {
+    expect(context['isNull'].apply([null]), isTrue);
+    expect(context['isUndefined'].apply([null]), isFalse);
+  });
+}
diff --git a/tests/lib/js/null_test.html b/tests/lib/js/null_test.html
new file mode 100644
index 0000000..8d23cfa
--- /dev/null
+++ b/tests/lib/js/null_test.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="dart.unittest" content="full-stack-traces">
+  <title> null test </title>
+  <style>
+     .unittest-table { font-family:monospace; border:1px; }
+     .unittest-pass { background: #6b3;}
+     .unittest-fail { background: #d55;}
+     .unittest-error { background: #a11;}
+  </style>
+</head>
+<body>
+  <h1> Running null_test </h1>
+  <script>
+    function isUndefined(o) { return o === undefined; }
+    function isNull(o) { return o === null; }
+  </script>
+  <script type="text/javascript"
+      src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  %TEST_SCRIPTS%
+</body>
+</html>
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index dd021be..e16c839 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -19,6 +19,7 @@
 async/deferred/deferred_in_isolate_test: RuntimeError # Issue 16898
 mirrors/deferred_mirrors_metadata_test: Fail # Issue 16898
 mirrors/deferred_mirrors_metatarget_test: Fail # Issue 16898
+js/null_test: Fail # Issue 20310
 
 [ $compiler == dart2js ]
 async/schedule_microtask6_test: RuntimeError # global error handling is not supported. http://dartbug.com/5958
@@ -303,6 +304,9 @@
 
 mirrors/deferred_mirrors_metadata_test: Fail # Issue 17522
 
+profiler/metrics_test: Fail # Issue 20309
+profiler/metrics_num_test: Fail # Issue 20309
+
 [ $compiler == dart2js && $runtime == d8 && $system == windows ]
 async/*deferred*: Skip # Issue 17458
 mirrors/*deferred*: Skip # Issue 17458
@@ -318,11 +322,8 @@
 convert/chunked_conversion_utf88_test: Skip  # Pass, Slow Issue 12644.
 convert/utf85_test: Skip  # Pass, Slow Issue 12644.
 
+[ $compiler == dart2js ]
+profiler/metrics_num_test: Skip # Because of a int / double type test.
+
 [ $arch == simarm64 ]
 convert/utf85_test: Skip # Pass, Slow Issue 20111.
-
-# These tests use "const Symbol('void')".
-[ $compiler == dart2analyzer ]
-mirrors/basic_types_in_dart_core_test: CompileTimeError
-mirrors/function_type_mirror_test: CompileTimeError
-mirrors/method_mirror_returntype_test: CompileTimeError
diff --git a/tests/lib/math/point_test.dart b/tests/lib/math/point_test.dart
index 8d9ab72..93d6c4a 100644
--- a/tests/lib/math/point_test.dart
+++ b/tests/lib/math/point_test.dart
@@ -38,7 +38,7 @@
 
   test('constructor X Y NaN', () {
     var point = new Point(double.NAN, 1000);
-    expect(point.x.isNaN, isTrue);
+    expect(point.x, isNaN);
     expect(point.y, 1000);
     expect('$point', 'Point(NaN, 1000)');
   });
diff --git a/tests/lib/mirrors/private_symbol_mangling_lib.dart b/tests/lib/mirrors/private_symbol_mangling_lib.dart
new file mode 100644
index 0000000..8d9c93b
--- /dev/null
+++ b/tests/lib/mirrors/private_symbol_mangling_lib.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library other;
+
+var _privateGlobalField = 3;
+
+_privateGlobalMethod() => 11;
+
+class C2 {
+  var _privateField = 1;
+  _privateMethod() => 3;
+}
diff --git a/tests/lib/mirrors/private_symbol_mangling_test.dart b/tests/lib/mirrors/private_symbol_mangling_test.dart
new file mode 100644
index 0000000..ebb9371
--- /dev/null
+++ b/tests/lib/mirrors/private_symbol_mangling_test.dart
@@ -0,0 +1,71 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library main;
+
+//@MirrorsUsed(targets: const ['C1', 'C2', '_privateGlobalField', '_privateGlobalMethod'])
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+import 'private_symbol_mangling_lib.dart';
+
+var _privateGlobalField = 1;
+
+_privateGlobalMethod() => 9;
+
+class C1 {
+  var _privateField = 0;
+  _privateMethod() => 2;
+}
+
+getPrivateGlobalFieldValue(LibraryMirror lib) {
+  for (Symbol symbol in lib.declarations.keys) {
+    DeclarationMirror decl = lib.declarations[symbol];
+    if (decl is VariableMirror && decl.isPrivate) {
+      return lib.getField(symbol).reflectee;
+    }
+  }
+}
+
+getPrivateFieldValue(InstanceMirror cls) {
+  for (Symbol symbol in cls.type.declarations.keys) {
+    DeclarationMirror decl = cls.type.declarations[symbol];
+    if (decl is VariableMirror && decl.isPrivate) {
+      return cls.getField(symbol).reflectee;
+    }
+  }
+}
+
+getPrivateGlobalMethodValue(LibraryMirror lib) {
+  for (Symbol symbol in lib.declarations.keys) {
+    DeclarationMirror decl = lib.declarations[symbol];
+    if (decl is MethodMirror && decl.isRegularMethod && decl.isPrivate) {
+      return lib.invoke(symbol, []).reflectee;
+    }
+  }
+}
+
+getPrivateMethodValue(InstanceMirror cls) {
+  for (Symbol symbol in cls.type.declarations.keys) {
+    DeclarationMirror decl = cls.type.declarations[symbol];
+    if (decl is MethodMirror && decl.isRegularMethod && decl.isPrivate) {
+      return cls.invoke(symbol, []).reflectee;
+    }
+  }
+}
+
+main() {
+  LibraryMirror libmain = currentMirrorSystem().findLibrary(#main);
+  LibraryMirror libother = currentMirrorSystem().findLibrary(#other);
+  Expect.equals(1, getPrivateGlobalFieldValue(libmain));
+  Expect.equals(3, getPrivateGlobalFieldValue(libother));
+  Expect.equals(9, getPrivateGlobalMethodValue(libmain));
+  Expect.equals(11, getPrivateGlobalMethodValue(libother));
+
+  var c1 = reflect(new C1());
+  var c2 = reflect(new C2());
+  Expect.equals(0, getPrivateFieldValue(c1));
+  Expect.equals(1, getPrivateFieldValue(c2));
+  Expect.equals(2, getPrivateMethodValue(c1));
+  Expect.equals(3, getPrivateMethodValue(c2));
+}
diff --git a/tests/lib/profiler/metrics_num_test.dart b/tests/lib/profiler/metrics_num_test.dart
new file mode 100644
index 0000000..d6a6689
--- /dev/null
+++ b/tests/lib/profiler/metrics_num_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+
+import 'dart:profiler';
+import 'package:expect/expect.dart';
+
+testGaugeDouble() {
+  Expect.throws(() {
+    // max argument is not a double
+    gauge = new Gauge('test', 'alpha bravo', 1.0, 4);
+  });
+}
+
+main() {
+  testGaugeDouble();
+}
diff --git a/tests/lib/profiler/metrics_test.dart b/tests/lib/profiler/metrics_test.dart
new file mode 100644
index 0000000..69be446
--- /dev/null
+++ b/tests/lib/profiler/metrics_test.dart
@@ -0,0 +1,111 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+
+import 'dart:profiler';
+import 'package:expect/expect.dart';
+
+testGauge1() {
+  var gauge = new Gauge('test', 'alpha bravo', 0.0, 100.0);
+  Expect.equals(0.0, gauge.min);
+  Expect.equals(0.0, gauge.value);
+  Expect.equals(100.0, gauge.max);
+  Expect.equals('test', gauge.name);
+  Expect.equals('alpha bravo', gauge.description);
+  gauge.value = 44.0;
+  Expect.equals(44.0, gauge.value);
+  // Test setting below min.
+  gauge.value = -1.0;
+  Expect.equals(0.0, gauge.value);
+  // Test setting above max.
+  gauge.value = 101.0;
+  Expect.equals(100.0, gauge.value);
+}
+
+testGauge2() {
+  var gauge = new Gauge('test', 'alpha bravo', 1.0, 2.0);
+  Expect.equals(1.0, gauge.min);
+  Expect.equals(2.0, gauge.max);
+  Expect.equals(gauge.min, gauge.value);
+  Expect.equals('test', gauge.name);
+  Expect.equals('alpha bravo', gauge.description);
+
+  Expect.throws(() {
+    // min argument > max argument .
+    gauge = new Gauge('test', 'alpha bravo', 2.0, 1.0);
+  });
+
+  Expect.throws(() {
+    // min argument  == max argument .
+    gauge = new Gauge('test', 'alpha bravo', 1.0, 1.0);
+  });
+
+  Expect.throws(() {
+    // min argument is null
+    gauge = new Gauge('test', 'alpha bravo', null, 1.0);
+  });
+
+  Expect.throws(() {
+    // min argument is not a double
+    gauge = new Gauge('test', 'alpha bravo', 'string', 1.0);
+  });
+
+  Expect.throws(() {
+    // max argument is null
+    gauge = new Gauge('test', 'alpha bravo', 1.0, null);
+  });
+}
+
+testCounter() {
+  var counter = new Counter('test', 'alpha bravo');
+  Expect.equals(0.0, counter.value);
+  Expect.equals('test', counter.name);
+  Expect.equals('alpha bravo', counter.description);
+  counter.value = 1.0;
+  Expect.equals(1.0, counter.value);
+}
+
+class CustomCounter extends Counter {
+  CustomCounter(name, description) : super(name, description);
+  // User provided getter.
+  double get value => 77.0;
+}
+
+testCustomCounter() {
+  var counter = new CustomCounter('test', 'alpha bravo');
+  Expect.equals(77.0, counter.value);
+  Expect.equals('test', counter.name);
+  Expect.equals('alpha bravo', counter.description);
+  // Should have no effect.
+  counter.value = 1.0;
+  Expect.equals(77.0, counter.value);
+}
+
+testMetricNameCollision() {
+  var counter = new Counter('a.b.c', 'alpha bravo charlie');
+  var counter2 = new Counter('a.b.c', 'alpha bravo charlie collider');
+  Metrics.register(counter);
+  Expect.throws(() {
+    Metrics.register(counter2);
+  });
+  Metrics.deregister(counter);
+  Metrics.register(counter);
+  var counter3 = new Counter('a.b.c.d', '');
+  Metrics.register(counter3);
+}
+
+testBadName() {
+  Expect.throws(() {
+    var counter = new Counter('a.b/c', 'description');
+  });
+}
+
+main() {
+  testGauge1();
+  testGauge2();
+  testCounter();
+  testCustomCounter();
+  testMetricNameCollision();
+  testBadName();
+}
diff --git a/tests/standalone/io/platform_test.dart b/tests/standalone/io/platform_test.dart
index 85a7a47..5abdc0f 100644
--- a/tests/standalone/io/platform_test.dart
+++ b/tests/standalone/io/platform_test.dart
@@ -25,8 +25,14 @@
   var environment = Platform.environment;
   Expect.isTrue(environment is Map<String, String>);
   Expect.isTrue(Platform.executable.contains('dart'));
+  // Move directory to be sure script is correct.
+  var oldDir = Directory.current;
+  Directory.current = Directory.current.parent;
   Expect.isTrue(Platform.script.path.
                 endsWith('tests/standalone/io/platform_test.dart'));
+  Expect.isTrue(Platform.script.toFilePath().startsWith(oldDir.path));
+  // Restore dir.
+  Directory.current = oldDir;
   Directory packageRoot = new Directory(Platform.packageRoot);
   Expect.isTrue(packageRoot.existsSync());
   Expect.isTrue(new Directory("${packageRoot.path}/expect").existsSync());
diff --git a/tests/standalone/issue14236_test.dart b/tests/standalone/issue14236_test.dart
index f52c05a..f720a65 100644
--- a/tests/standalone/issue14236_test.dart
+++ b/tests/standalone/issue14236_test.dart
Binary files differ
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 9311794..b7aeba1 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -13,9 +13,6 @@
 
 javascript_compatibility_errors_test/none: Fail, OK  # Not possible to exclude or annotate with '/// none:'
 
-[ $runtime == vm && ($arch == simarm || $arch == ia32) && $mode == debug]
-int_list_test: Crash # Issue 20190
-
 [ $runtime == vm ]
 package/package_isolate_test: Fail # Issue 12474
 
@@ -150,3 +147,4 @@
 
 [ $system == windows ]
 io/skipping_dart2js_compilations_test: Fail # Issue 19551.
+vmservice/allocations_test: Fail # Issue 20298.
diff --git a/tests/standalone/vmservice/allocations_script.dart b/tests/standalone/vmservice/allocations_script.dart
new file mode 100644
index 0000000..6a44fb7
--- /dev/null
+++ b/tests/standalone/vmservice/allocations_script.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library allocations_script;
+
+import 'dart:io';
+
+class Foo {
+}
+List<Foo> foos;
+
+main() {
+  foos = [new Foo(), new Foo(), new Foo()];
+
+  print(''); // Print blank line to signal that we are ready.
+  // Wait until signaled from spawning test.
+  stdin.first.then((_) => exit(0));
+}
diff --git a/tests/standalone/vmservice/allocations_test.dart b/tests/standalone/vmservice/allocations_test.dart
new file mode 100644
index 0000000..5944310
--- /dev/null
+++ b/tests/standalone/vmservice/allocations_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library allocations_test;
+
+import 'test_helper.dart';
+import 'package:expect/expect.dart';
+import 'package:observatory/service_io.dart';
+
+import 'dart:io';
+
+main() {
+  String script = 'allocations_script.dart';
+  var process = new TestLauncher(script);
+  process.launch().then((port) {
+    String addr = 'ws://localhost:$port/ws';
+    new WebSocketVM(new WebSocketVMTarget(addr)).get('vm')
+        .then((VM vm) => vm.isolates.first.load())
+        .then((Isolate isolate) => isolate.rootLib.load())
+        .then((Library lib) {
+          Expect.isTrue(lib.url.endsWith(script));
+          return lib.classes.first.load();
+        })
+        .then((Class fooClass) {
+          Expect.equals('Foo', fooClass.name);
+          Expect.equals(3,
+                        fooClass.newSpace.accumulated.instances +
+                        fooClass.oldSpace.accumulated.instances);
+          exit(0);
+        });
+  });
+}
diff --git a/tools/VERSION b/tools/VERSION
index 3fb57ac..c565255 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 6
 PATCH 0
-PRERELEASE 6
+PRERELEASE 7
 PRERELEASE_PATCH 0
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index 616fc89..09351ef 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -125,6 +125,9 @@
       arch = 'x64'
     if dart2js_pattern.group(14) == 'batch':
       batch = True
+    # This is temporary, slowly enabling this.
+    if system == 'linux':
+      batch = True
     shard_index = dart2js_pattern.group(15)
     total_shards = dart2js_pattern.group(16)
   elif dartium_pattern:
diff --git a/tools/bots/pub.py b/tools/bots/pub.py
index 8bf9946..dc56e03 100755
--- a/tools/bots/pub.py
+++ b/tools/bots/pub.py
@@ -47,6 +47,8 @@
   if build_info.builder_tag:
     common_args.append('--builder-tag=%s' % build_info.builder_tag)
 
+  # There are a number of big/integration tests in pkg, run with bigger timeout
+  common_args.append('--timeout=120')
 
   opt_threshold = '--vm-options=--optimization-counter-threshold=5'
   if build_info.mode == 'release':
diff --git a/tools/dartium/fetch_dartium.py b/tools/dartium/fetch_dartium.py
new file mode 100755
index 0000000..4f6ed32
--- /dev/null
+++ b/tools/dartium/fetch_dartium.py
@@ -0,0 +1,142 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# A script to fetch and build dartium branches into an empty directory.
+#
+# Main dev directories - src, src/third_party/WebKit, src/dart - are checked out
+# via git.  A custom_deps entry is added to the .gclient file.
+#
+# Note: this checkout is not suitable for git merges across branches
+# (e.g., upstream merges).  It's a shallow checkout without history.
+#
+# Usage:
+# .../fetch_dartium.py --branch=[trunk|bleeding_edge|dartium_integration|1.4|...]
+#    --path=path [--build]
+#
+# Default branch is bleeding_edge.  The path must be created by this script.
+
+import optparse
+import os
+import os.path
+import re
+import shutil
+import subprocess
+import sys
+
+def Run(cmd, path = '.', isPiped = False):
+  print 'Running in ' + path + ': ' + ' '.join(cmd)
+  cwd = os.getcwd()
+  os.chdir(path)
+  if isPiped:
+    p = subprocess.Popen(cmd, stdout = subprocess.PIPE)
+  else:
+    p = subprocess.Popen(cmd)
+  os.chdir(cwd)
+  return p
+
+def RunSync(cmd):
+  print "\n[%s]\n$ %s" % (os.getcwd(), " ".join(cmd))
+  pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+  output = pipe.communicate()
+  if pipe.returncode == 0:
+    return output[0]
+  else:
+    print output[1]
+    print "FAILED. RET_CODE=%d" % pipe.returncode
+    sys.exit(pipe.returncode)
+
+
+def main():
+  option_parser = optparse.OptionParser()
+  option_parser.add_option('', '--branch', help="Checkout a branch of Dartium, e.g., [bleeding_edge|dartium_integration|trunk|1.4]",
+                           action="store", dest="branch", default="bleeding_edge")
+  option_parser.add_option('', '--build', help="Compile",
+                           action="store_true", dest="build")
+  option_parser.add_option('', '--path', help="Path to checkout to",
+                           action="store", dest="path", default=None)
+  options, args = option_parser.parse_args()
+
+  path = options.path
+  if not path:
+    print 'Please set a path'
+    exit(1)
+  path = os.path.expanduser(path)
+  if os.path.isfile(path) or os.path.isdir(path):
+    print 'Path %s already exists' % path
+  os.mkdir(path)
+  os.chdir(path)
+
+  if options.branch != 'trunk':
+    branch = 'branches/' + options.branch
+  else:
+    branch = 'trunk'
+  deps_path = 'https://dart.googlecode.com/svn/%s/deps/dartium.deps' % branch
+
+  Run(['gclient', 'config', deps_path]).wait()
+
+  # Mark chrome, blink, and dart as custom. We'll check them out separately
+  # via git.
+  f = open('.gclient', 'r')
+  lines = f.readlines()
+  f.close()
+  f = open('.gclient', 'w')
+  for line in lines:
+    f.write(line)
+    if 'custom_deps' in line:
+      f.write(
+        '      "src": None,\n'
+        '      "src/third_party/WebKit": None,\n'
+        '      "src/dart": None,\n'
+        )
+  f.close()
+
+  # Find branches from the DEPS file.
+  DEPS = RunSync(['svn', 'cat', deps_path + '/DEPS'])
+  chrome_base = 'svn://svn.chromium.org/'
+  chrome_branch = re.search('dartium_chromium_branch":\s*"(.+)"', DEPS).group(1)
+  blink_branch = re.search('dartium_webkit_branch":\s*"(.+)"', DEPS).group(1)
+  dart_base = 'https://dart.googlecode.com/svn/'
+  dart_branch = re.search('dart_branch":\s*"(.+)"', DEPS).group(1)
+
+  chrome_url = chrome_base + chrome_branch
+  blink_url = chrome_base + blink_branch
+  dart_url =  dart_base + dart_branch + '/dart'
+
+  # Fetch dart, chrome, and blink via git-svn and everything else via
+  # gclient sync.
+  blink_fetch = Run(['git', 'svn', 'clone', '-rHEAD', blink_url, 'blink'])
+  dart_fetch = Run(['git', 'svn', 'clone', '-rHEAD', dart_url, 'dart'])
+  Run(['git', 'svn', 'clone', '-rHEAD', chrome_url, 'src']).wait()
+  sync = Run(['gclient', 'sync', '--nohooks'])
+  ps = [blink_fetch, dart_fetch, sync]
+
+  # Spin until everything is done.
+  while True:
+    ps_status = [p.poll() for p in ps]
+    if all([x is not None for x in ps_status]):
+      break
+
+  # Move blink and dart to the right locations.
+  webkit_relative_path = os.path.join('src', 'third_party', 'WebKit')
+  if os.path.isdir(webkit_relative_path):
+    shutil.rmtree(webkit_relative_path)
+  Run(['mv', 'blink', webkit_relative_path]).wait()
+  dart_relative_path = os.path.join('src', 'dart')
+  if os.path.isdir(dart_relative_path):
+    shutil.rmtree(dart_relative_path)
+  Run(['mv', 'dart', dart_relative_path]).wait()
+  os.chdir('src')
+
+  # Sync again and runhooks.
+  Run(['gclient', 'sync']).wait()
+  Run(['gclient', 'runhooks']).wait()
+
+  # Build if requested.
+  if options.build:
+    Run([os.path.join('.', 'dart', 'tools', 'dartium', 'build.py'), '--mode=Release'])
+
+if '__main__' == __name__:
+  main()
diff --git a/tools/gyp/all.gypi b/tools/gyp/all.gypi
index 1e6b313..59706b1 100644
--- a/tools/gyp/all.gypi
+++ b/tools/gyp/all.gypi
@@ -12,6 +12,8 @@
     'target_arch': 'ia32',
     # Flag that tells us whether to build native support for dart:io.
     'dart_io_support': 1,
+    # Flag controls whether or not frame pointers are enabled.
+    'c_frame_pointers%': 0,
   },
   'conditions': [
     [ 'OS=="linux"', {
diff --git a/tools/gyp/configurations_android.gypi b/tools/gyp/configurations_android.gypi
index 9a0c96d..cadd122 100644
--- a/tools/gyp/configurations_android.gypi
+++ b/tools/gyp/configurations_android.gypi
@@ -55,6 +55,16 @@
         'defines': [
           'DEBUG',
         ],
+        'conditions': [
+          ['c_frame_pointers==1', {
+            'cflags': [
+              '-fno-omit-frame-pointer',
+            ],
+            'defines': [
+              'PROFILE_NATIVE_CODE'
+            ],
+          }],
+        ],
       },
       'Dart_Android_Release': {
         'abstract': 1,
@@ -68,11 +78,18 @@
         'cflags': [
           '-fdata-sections',
           '-ffunction-sections',
-          # Uncomment the following line and pass --profile-vm to enable
-          # profiling of C++ code within Observatory.
-          # '-fno-omit-frame-pointer',
           '-O3',
         ],
+        'conditions': [
+          ['c_frame_pointers==1', {
+            'cflags': [
+              '-fno-omit-frame-pointer',
+            ],
+            'defines': [
+              'PROFILE_NATIVE_CODE'
+            ],
+          }],
+        ],
       },
       'Dart_Android_ia32_Base': {
         'abstract': 1,
diff --git a/tools/gyp/configurations_make.gypi b/tools/gyp/configurations_make.gypi
index 2b2943c..17587f3 100644
--- a/tools/gyp/configurations_make.gypi
+++ b/tools/gyp/configurations_make.gypi
@@ -135,27 +135,41 @@
 
       'Dart_Linux_Debug': {
         'abstract': 1,
+        'conditions': [
+          ['c_frame_pointers==1', {
+            'cflags': [
+              '-fno-omit-frame-pointer',
+              # Clang on Linux will still omit frame pointers from leaf
+              # functions unless told otherwise:
+              # '-mno-omit-leaf-frame-pointer',
+            ],
+            'defines': [
+              'PROFILE_NATIVE_CODE'
+            ],
+          }],
+        ],
         'cflags': [
           '-O<(dart_debug_optimization_level)',
-          # Uncomment the following line and pass --profile-vm to enable
-          # profiling of C++ code within Observatory.
-          # '-fno-omit-frame-pointer',
-          # Clang on Linux will still omit frame pointers from leaf functions
-          # unless told otherwise:
-          # '-mno-omit-leaf-frame-pointer',
         ],
       },
 
       'Dart_Linux_Release': {
         'abstract': 1,
+        'conditions': [
+          ['c_frame_pointers==1', {
+            'cflags': [
+              '-fno-omit-frame-pointer',
+              # Clang on Linux will still omit frame pointers from leaf
+              # functions unless told otherwise:
+              # '-mno-omit-leaf-frame-pointer',
+            ],
+            'defines': [
+              'PROFILE_NATIVE_CODE'
+            ],
+          }],
+        ],
         'cflags': [
           '-O3',
-          # Uncomment the following line and pass --profile-vm to enable
-          # profiling of C++ code within Observatory.
-          # '-fno-omit-frame-pointer',
-          # Clang on Linux will still omit frame pointers from leaf functions
-          # unless told otherwise:
-          # '-mno-omit-leaf-frame-pointer',
         ],
       },
     },
diff --git a/tools/gyp/configurations_msvs.gypi b/tools/gyp/configurations_msvs.gypi
index 4880913..64176f7 100644
--- a/tools/gyp/configurations_msvs.gypi
+++ b/tools/gyp/configurations_msvs.gypi
@@ -39,9 +39,6 @@
             'DebugInformationFormat': '3',
             'ExceptionHandling': '0',
             'RuntimeTypeInfo': 'false',
-            # Uncomment the following line and pass --profile-vm to enable
-            # profiling of C++ code within Observatory.
-            # 'OmitFramePointers': 'false',
             'RuntimeLibrary': '1',  # /MTd - Multi-threaded, static (debug)
           },
           'VCLinkerTool': {
@@ -55,6 +52,18 @@
             ],
           },
         },
+        'conditions': [
+          ['c_frame_pointers==1', {
+            'msvs_settings': {
+              'VCCLCompilerTool': {
+                'OmitFramePointers': 'false',
+              },
+            },
+            'defines': [
+              'PROFILE_NATIVE_CODE'
+            ],
+          }],
+        ],
         # C4351 warns MSVC follows the C++ specification regarding array
         # initialization in member initializers.  Code that expects the
         # specified behavior should silence this warning.
@@ -71,9 +80,6 @@
             'FavorSizeOrSpeed': '0',
             'ExceptionHandling': '0',
             'RuntimeTypeInfo': 'false',
-            # Uncomment the following line and pass --profile-vm to enable
-            # profiling of C++ code within Observatory.
-            # 'OmitFramePointers': 'false',
             'StringPooling': 'true',
             'RuntimeLibrary': '0',  # /MT - Multi-threaded, static
           },
@@ -90,6 +96,18 @@
             ],
           },
         },
+        'conditions': [
+          ['c_frame_pointers==1', {
+            'msvs_settings': {
+              'VCCLCompilerTool': {
+                'OmitFramePointers': 'false',
+              },
+            },
+            'defines': [
+              'PROFILE_NATIVE_CODE'
+            ],
+          }],
+        ],
         # C4351 warns MSVC follows the C++ specification regarding array
         # initialization in member initializers.  Code that expects the
         # specified behavior should silence this warning.
diff --git a/tools/gyp/configurations_xcode.gypi b/tools/gyp/configurations_xcode.gypi
index 916c950..f5ba5c0 100644
--- a/tools/gyp/configurations_xcode.gypi
+++ b/tools/gyp/configurations_xcode.gypi
@@ -54,6 +54,26 @@
           'GCC_ENABLE_TRIGRAPHS': 'NO',
           'COMBINE_HIDPI_IMAGES': 'YES',
         },
+        'conditions': [
+          ['c_frame_pointers==1', {
+            'xcode_settings': {
+              'OTHER_CFLAGS': [
+                '-fno-omit-frame-pointer',
+                '-mno-omit-leaf-frame-pointer',
+              ],
+            },
+            'defines': [
+              'PROFILE_NATIVE_CODE',
+            ],
+          }, {
+            'xcode_settings': {
+              'OTHER_CFLAGS': [
+                '-fomit-frame-pointer',
+                '-momit-leaf-frame-pointer',
+              ],
+            },
+          }],
+        ],
       },
       'Dart_Macos_ia32_Base': {
         'abstract': 1,
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index ee50cfa..a1ac5ab 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -1343,6 +1343,7 @@
         ..add('--test')..add(inputFile)
         ..add('--out')..add(outputDir)
         ..add('--file-filter')..add('.svn');
+    if (configuration['csp']) args.add('--csp');
 
     return CommandBuilder.instance.getProcessCommand(
         'polymer_deploy', dartVmBinaryFileName, args, environmentOverrides);
