Version 1.6.0-dev.7.0

svn merge -r 38606:38828 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@38831 260f80e4-7a28-3924-810f-c04153c831b5
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":";;;;;;;;;;AASA,OAAA,iBACA,cAAA,QAAA,OAAA,oBAEA,gBAAA,KAAA,gBAAA,cAAA,kBAAA,aAAA,SAAA,GAAA,MAAA,ICHA,SAAA,GACA,GAAA,IAAA,EAGA,EAAA,SAAA,cAAA,OACA,KAAA,EAAA,eAAA,EAAA,iBAAA,CACA,GAAA,GAAA,EAAA,mBACA,EAAA,SAAA,cAAA,OACA,GAAA,YAAA,GACA,EAAA,iBAAA,WAAA,SAAA,GACA,EAAA,OAEA,EAAA,EAAA,KAAA,KAAA,GAEA,EAAA,mBAEA,IAAA,GAAA,GAAA,aAAA,YAAA,SAAA,GAEA,UAAA,KAAA,YAAA,GACA,EAAA,cAAA,GACA,EAAA,WAAA,YAAA,GACA,EAAA,EAAA,KAEA,EAAA,IAEA,IAAA,IACA,OAAA,SAAA,GACA,MAAA,GACA,EAAA,YAAA,EAAA,iBADA,QAIA,UAAA,SAAA,GACA,MAAA,IAAA,QAAA,EAAA,mBAEA,gBAAA,SAAA,GACA,GAAA,GAAA,KAAA,OAAA,EACA,OAAA,MAAA,UAAA,GACA,EADA,QAIA,YAAA,SAAA,GACA,GAAA,GAAA,EAAA,eACA,KAAA,EAAA,CACA,GAAA,GAAA,EAAA,cAAA,SACA,KACA,EAAA,EAAA,iBAGA,MAAA,IAEA,WAAA,SAAA,GAEA,IADA,GAAA,MAAA,EAAA,KAAA,OAAA,GACA,GACA,EAAA,KAAA,GACA,EAAA,KAAA,YAAA,EAEA,OAAA,IAEA,WAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,CACA,OAAA,IACA,EAAA,EAAA,iBAAA,EAAA,GACA,EAEA,EAAA,KAAA,gBAAA,GACA,IAAA,WAEA,EAAA,KAAA,YAAA,IAGA,KAAA,WAAA,EAAA,EAAA,IAAA,GAVA,QAaA,MAAA,SAAA,GACA,IAAA,EACA,MAAA,SAIA,KAFA,GAAA,GAAA,EAEA,EAAA,YACA,EAAA,EAAA,UAMA,OAHA,GAAA,UAAA,KAAA,eAAA,EAAA,UAAA,KAAA,yBACA,EAAA,UAEA,GAEA,WAAA,SAAA,GACA,GAAA,GAAA,EAAA,KACA,MAAA,GAAA,KAAA,EAEA,IAAA,GAAA,EAAA,QAAA,EAAA,EAAA,QAEA,EAAA,KAAA,MAAA,EAAA,OAKA,OAHA,GAAA,iBAAA,EAAA,KACA,EAAA,UAEA,KAAA,WAAA,EAAA,EAAA,IAEA,eAAA,SAAA,GACA,GAAA,EACA,IAAA,GAAA,EAAA,MAEA,IAAA,GADA,GAAA,EAAA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,GADA,EAAA,EAAA,GACA,EAAA,YACA,MAAA,GAAA,gBAKA,KADA,EAAA,EAAA,KAAA,EAAA,eACA,GAAA,CACA,GAAA,EAAA,YACA,MAAA,GAAA,WAEA,GAAA,EAAA,YAAA,EAAA,OAIA,IAAA,SAAA,EAAA,GACA,GAAA,IAAA,EACA,MAAA,EAEA,IAAA,IAAA,EACA,MAAA,EAEA,IAAA,IAAA,EACA,MAAA,EAEA,KAAA,IAAA,EACA,MAAA,SAGA,IAAA,EAAA,UAAA,EAAA,SAAA,GACA,MAAA,EAEA,IAAA,EAAA,UAAA,EAAA,SAAA,GACA,MAAA,EAEA,IAAA,GAAA,KAAA,MAAA,GACA,EAAA,KAAA,MAAA,GACA,EAAA,EAAA,CAMA,KALA,GAAA,EACA,EAAA,KAAA,KAAA,EAAA,GAEA,EAAA,KAAA,KAAA,GAAA,GAEA,GAAA,GAAA,IAAA,GACA,EAAA,EAAA,YAAA,EAAA,KACA,EAAA,EAAA,YAAA,EAAA,IAEA,OAAA,IAEA,KAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,GAAA,EAAA,EAAA,IACA,EAAA,EAAA,YAAA,EAAA,IAEA,OAAA,IAEA,MAAA,SAAA,GAEA,IADA,GAAA,GAAA,EACA,GACA,IACA,EAAA,EAAA,YAAA,EAAA,IAEA,OAAA,IAEA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,IAAA,EAAA,EAEA,OAAA,KAAA,GAEA,WAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,uBACA,OAAA,GAAA,MAAA,GAAA,GAAA,EAAA,OAAA,EAAA,KAAA,GAAA,GAAA,EAAA,QAGA,GAAA,cAAA,EAOA,EAAA,WAAA,EAAA,WAAA,KAAA,GASA,EAAA,aAAA,EAAA,aAAA,KAAA,GAqBA,EAAA,WAAA,EAAA,YAEA,OAAA,iBCzNA,WACA,QAAA,GAAA,GACA,MAAA,eAAA,EAAA,GAEA,QAAA,GAAA,GACA,MAAA,kBAAA,EAAA,KAEA,QAAA,GAAA,GACA,MAAA,uBAAA,EAAA,mBAAA,EAAA,KAEA,GAAA,IACA,OACA,OACA,QACA,SAEA,KAAA,cACA,WACA,cACA,gBAGA,gBAEA,EAAA,GAGA,GADA,SAAA,KACA,gBAAA,UAAA,KAAA,MAAA,aAEA,GAAA,OAAA,mBAAA,SAAA,KAAA,gBAEA,IAAA,EAAA,CACA,EAAA,QAAA,SAAA,GACA,OAAA,KAAA,GACA,GAAA,EAAA,GAAA,EAAA,GAAA,KACA,IACA,GAAA,EAAA,GAAA,EAAA,GAAA,QAGA,GAAA,EAAA,UAAA,IAAA,GAAA,EAAA,EAAA,MAAA,KACA,IACA,GAAA,EAAA,UAAA,IAAA,GAAA,EAAA,EAAA,MAAA,QAKA,IAAA,GAAA,SAAA,cAAA,QACA,GAAA,YAAA,EACA,SAAA,KAAA,YAAA,OCnCA,SAAA,GAEA,GAAA,IACA,UACA,aACA,OACA,SACA,UACA,UACA,UACA,UACA,UACA,SACA,WACA,UACA,SACA,gBACA,QACA,SAGA,IACA,GACA,EACA,KACA,KACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,KACA,EACA,GAGA,EAAA,WAAA,MAAA,eAEA,GAEA,WAAA,EACA,cAAA,SAAA,EAAA,GACA,GAAA,GAAA,SAAA,YAAA,QAGA,OAFA,GAAA,UAAA,EAAA,EAAA,UAAA,EAAA,EAAA,aAAA,GACA,EAAA,WAAA,EAAA,WAAA,GACA,GAEA,iBAAA,SAAA,EAAA,GACA,EAAA,GAAA,OAAA,OAAA,KAGA,KAAA,GAAA,GADA,EAAA,KAAA,cAAA,EAAA,GACA,EAAA,EAAA,EAAA,OAAA,KAAA,GAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,GAAA,EAAA,EAEA,OAAA,IAEA,iBAAA,SAAA,EAAA,GACA,EAAA,GAAA,OAAA,OAAA,KAIA,KAAA,GAAA,GAFA,EAAA,KAAA,cAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,GAAA,EAAA,IAAA,EAAA,EAEA,GAAA,QAAA,EAAA,SAAA,CAIA,IAAA,GAAA,CAsBA,OApBA,GADA,EAAA,SACA,EAAA,SAEA,EAAA,QAAA,GAAA,EAIA,EAAA,EAAA,EAAA,QACA,EAAA,EAAA,EAAA,QAGA,EAAA,UAAA,EAAA,WAAA,EACA,EAAA,MAAA,EAAA,OAAA,EACA,EAAA,OAAA,EAAA,QAAA,EACA,EAAA,SAAA,EACA,EAAA,MAAA,EAAA,OAAA,EACA,EAAA,MAAA,EAAA,OAAA,EACA,EAAA,YAAA,EAAA,aAAA,GACA,EAAA,YAAA,EAAA,aAAA,EACA,EAAA,UAAA,EAAA,YAAA,EACA,EAAA,QAAA,EAAA,SAAA,GACA,GAIA,GAAA,aAAA,GACA,OAAA,iBChHA,SAAA,GAGA,QAAA,KACA,GAAA,EAAA,CACA,GAAA,GAAA,GAAA,IAEA,OADA,GAAA,SAAA,EACA,EAEA,KAAA,QACA,KAAA,UATA,GAAA,GAAA,OAAA,KAAA,OAAA,IAAA,UAAA,QACA,EAAA,WAAA,MAAA,MAAA,KAYA,GAAA,WACA,IAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,KAAA,QAAA,EACA,GAAA,GACA,KAAA,OAAA,GAAA,GAEA,KAAA,KAAA,KAAA,GACA,KAAA,OAAA,KAAA,KAGA,IAAA,SAAA,GACA,MAAA,MAAA,KAAA,QAAA,GAAA,IAEA,SAAA,SAAA,GACA,GAAA,GAAA,KAAA,KAAA,QAAA,EACA,GAAA,KACA,KAAA,KAAA,OAAA,EAAA,GACA,KAAA,OAAA,OAAA,EAAA,KAGA,IAAA,SAAA,GACA,GAAA,GAAA,KAAA,KAAA,QAAA,EACA,OAAA,MAAA,OAAA,IAEA,MAAA,WACA,KAAA,KAAA,OAAA,EACA,KAAA,OAAA,OAAA,GAGA,QAAA,SAAA,EAAA,GACA,KAAA,OAAA,QAAA,SAAA,EAAA,GACA,EAAA,KAAA,EAAA,EAAA,KAAA,KAAA,GAAA,OACA,OAEA,SAAA,WACA,MAAA,MAAA,KAAA,SAIA,EAAA,WAAA,GACA,OAAA,iBCzDA,SAAA,GACA,GAAA,IAEA,UACA,aACA,OACA,SACA,UACA,UACA,UACA,UACA,UACA,SACA,WACA,UACA,SACA,gBAEA,UAEA,YACA,QACA,SACA,WACA,QACA,QACA,cACA,cACA,YAEA,OACA,SACA,gBACA,QACA,QACA,QACA,YAEA,aACA,eACA,WAGA,IAEA,GACA,EACA,KACA,KACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,KAEA,EAEA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,EAEA,GACA,KACA,KACA,EACA,EACA,EACA,EACA,cACA,GAGA,EAAA,mBAAA,oBAEA,EAAA,EAAA,aAEA,EAAA,EAAA,cACA,EAAA,EAAA,KAcA,GACA,WAAA,GAAA,GAAA,WACA,SAAA,OAAA,OAAA,MAGA,aAAA,OAAA,OAAA,MACA,mBACA,YACA,gBASA,eAAA,SAAA,EAAA,GACA,GAAA,GAAA,EACA,EAAA,EAAA,MACA,KACA,EAAA,QAAA,SAAA,GACA,EAAA,KACA,KAAA,SAAA,GAAA,EAAA,GAAA,KAAA,KAEA,MACA,KAAA,aAAA,GAAA,EACA,KAAA,gBAAA,KAAA,KAGA,gBAAA,SAAA,EAAA,GACA,KAAA,SAAA,KAAA,IAEA,SAAA,SAAA,GAEA,IAAA,GAAA,GADA,EAAA,KAAA,gBAAA,OACA,EAAA,EAAA,EAAA,IAAA,EAAA,KAAA,gBAAA,IAAA,IAEA,EAAA,SAAA,KAAA,EAAA,IAGA,WAAA,SAAA,GAEA,IAAA,GAAA,GADA,EAAA,KAAA,gBAAA,OACA,EAAA,EAAA,EAAA,IAAA,EAAA,KAAA,gBAAA,IAAA,IAEA,EAAA,WAAA,KAAA,EAAA,IAIA,KAAA,SAAA,GACA,KAAA,UAAA,OAAA,IAEA,KAAA,SAAA,GAEA,EAAA,KAAA,OACA,KAAA,iBAAA,IAEA,GAAA,SAAA,GACA,KAAA,UAAA,KAAA,IAEA,OAAA,SAAA,GACA,EAAA,cAAA,EACA,KAAA,UAAA,KAAA,IAGA,aAAA,SAAA,GAIA,IAAA,EAAA,aAAA,CAGA,GAAA,GAAA,EAAA,KACA,EAAA,KAAA,UAAA,KAAA,SAAA,EACA,IACA,EAAA,GAEA,EAAA,cAAA,IAGA,OAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,SAAA,EAAA,IAIA,SAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,YAAA,EAAA,IAGA,SAAA,SAAA,EAAA,GAEA,EACA,EAAA,kBAAA,EAAA,KAAA,cAEA,EAAA,iBAAA,EAAA,KAAA,eAGA,YAAA,SAAA,EAAA,GAEA,EACA,EAAA,qBAAA,EAAA,KAAA,cAEA,EAAA,oBAAA,EAAA,KAAA,eAYA,UAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBAAA,EAAA,EAIA,OAHA,GAAA,eAAA,EAAA,eACA,EAAA,aAAA,EAAA,aACA,EAAA,QAAA,EAAA,SAAA,EAAA,OACA,GAGA,UAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,UAAA,EAAA,EACA,OAAA,MAAA,cAAA,IASA,WAAA,SAAA,GAEA,IAAA,GADA,GAAA,EAAA,OAAA,OAAA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,GAAA,EAAA,IAAA,EAAA,IAIA,WAAA,GAAA,kBAAA,KACA,GAAA,EAAA,YAAA,sBACA,EAAA,GAAA,EAAA,GAAA,yBAEA,EAAA,GAAA,EAAA,EAAA,IAKA,OADA,GAAA,eAAA,EAAA,eACA,GAQA,cAAA,SAAA,GACA,GAAA,GAAA,EAAA,OACA,IAAA,EAAA,CACA,EAAA,cAAA,EAGA,IAAA,GAAA,KAAA,WAAA,EACA,GAAA,OAAA,EACA,KAAA,iBAAA,KAGA,eAAA,WAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,KAAA,aAAA,OAAA,IAAA,CACA,EAAA,KAAA,aAAA,EACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,KAAA,SAAA,OAAA,IACA,EAAA,KAAA,SAAA,GACA,EAAA,EAAA,EAAA,MACA,GACA,EAAA,KAAA,EAAA,GAIA,KAAA,aAAA,OAAA,GAEA,iBAAA,SAAA,GAEA,KAAA,aAAA,QACA,sBAAA,KAAA,qBAEA,KAAA,aAAA,KAAA,IAGA,GAAA,aAAA,EAAA,aAAA,KAAA,GACA,EAAA,oBAAA,EAAA,eAAA,KAAA,GACA,EAAA,WAAA,EACA,EAAA,SAAA,SAAA,GACA,EAAA,SAAA,IAEA,EAAA,WAAA,EAAA,WAAA,KAAA,GACA,EAAA,KAAA,GACA,OAAA,iBCvSA,SAAA,GAeA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,KAAA,YAAA,EAAA,KAAA,GACA,KAAA,eAAA,EAAA,KAAA,GACA,KAAA,gBAAA,EAAA,KAAA,GACA,IACA,KAAA,SAAA,GAAA,GAAA,KAAA,gBAAA,KAAA,QAnBA,GAAA,GAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,SACA,EAAA,MAAA,UAAA,IAAA,KAAA,KAAA,MAAA,UAAA,KACA,EAAA,MAAA,UAAA,MAAA,KAAA,KAAA,MAAA,UAAA,OACA,EAAA,MAAA,UAAA,OAAA,KAAA,KAAA,MAAA,UAAA,QACA,EAAA,OAAA,kBAAA,OAAA,uBACA,EAAA,iBACA,GACA,SAAA,EACA,WAAA,EACA,YAAA,EACA,mBAAA,EACA,iBAAA,gBAYA,GAAA,WACA,aAAA,SAAA,GAQA,EAAA,cAAA,UAAA,IACA,KAAA,SAAA,QAAA,EAAA,IAGA,gBAAA,SAAA,GACA,KAAA,aAAA,GACA,IAAA,UAAA,aAAA,SAAA,WACA,KAAA,gBAEA,KAAA,kBAAA,IAGA,kBAAA,SAAA,GACA,EAAA,KAAA,aAAA,GAAA,KAAA,WAAA,OAEA,aAAA,SAAA,GACA,MAAA,GAAA,iBACA,EAAA,iBAAA,OAIA,cAAA,SAAA,GACA,KAAA,eAAA,IAEA,WAAA,SAAA,GACA,KAAA,YAAA,IAEA,eAAA,SAAA,EAAA,GACA,KAAA,gBAAA,EAAA,IAEA,YAAA,SAAA,EAAA,GACA,MAAA,GAAA,OAAA,EAAA,KAGA,cAAA,WACA,SAAA,iBAAA,mBAAA,WACA,aAAA,SAAA,YACA,KAAA,kBAAA,WAEA,KAAA,QAEA,UAAA,SAAA,GACA,MAAA,GAAA,WAAA,KAAA,cAEA,oBAAA,SAAA,GAEA,GAAA,GAAA,EAAA,EAAA,KAAA,aAAA,KAIA,OAFA,GAAA,KAAA,EAAA,EAAA,KAAA,YAEA,EAAA,OAAA,KAAA,iBAEA,gBAAA,SAAA,GACA,EAAA,QAAA,KAAA,gBAAA,OAEA,gBAAA,SAAA,GACA,GAAA,cAAA,EAAA,KAAA,CACA,GAAA,GAAA,KAAA,oBAAA,EAAA,WACA,GAAA,QAAA,KAAA,WAAA,KACA,IAAA,GAAA,KAAA,oBAAA,EAAA,aACA,GAAA,QAAA,KAAA,cAAA,UACA,eAAA,EAAA,MACA,KAAA,eAAA,EAAA,OAAA,EAAA,YAKA,IACA,EAAA,UAAA,aAAA,WACA,QAAA,KAAA,iGAIA,EAAA,UAAA,GACA,OAAA,iBClHA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,WAEA,EAAA,GAEA,GAAA,EAAA,EAAA,EAAA,GAEA,GAAA,CACA,KACA,EAAA,IAAA,GAAA,YAAA,QAAA,QAAA,IAAA,QACA,MAAA,IAGA,GAAA,IACA,WAAA,EACA,aAAA,QACA,QACA,YACA,YACA,WAEA,SAAA,SAAA,GACA,IAAA,UAGA,EAAA,OAAA,EAAA,KAAA,SAEA,WAAA,SAAA,GACA,EAAA,SAAA,EAAA,KAAA,SAEA,eAEA,0BAAA,SAAA,GAGA,IAAA,GAAA,GAFA,EAAA,KAAA,YACA,EAAA,EAAA,QAAA,EAAA,EAAA,QACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAAA,CAEA,GAAA,GAAA,KAAA,IAAA,EAAA,EAAA,GAAA,EAAA,KAAA,IAAA,EAAA,EAAA,EACA,IAAA,GAAA,GAAA,GAAA,EACA,OAAA,IAIA,aAAA,SAAA,GACA,GAAA,GAAA,EAAA,WAAA,EAQA,OAPA,GAAA,UAAA,KAAA,WACA,EAAA,WAAA,EACA,EAAA,YAAA,KAAA,aACA,EAAA,QAAA,QACA,IACA,EAAA,QAAA,EAAA,EAAA,QAAA,GAEA,GAEA,UAAA,SAAA,GACA,IAAA,KAAA,0BAAA,GAAA,CACA,GAAA,GAAA,EAAA,IAAA,KAAA,WAGA,IACA,KAAA,QAAA,EAEA,IAAA,GAAA,KAAA,aAAA,EACA,GAAA,OAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,IAAA,KAAA,WAAA,EAAA,QACA,EAAA,KAAA,KAGA,UAAA,SAAA,GACA,IAAA,KAAA,0BAAA,GAAA,CACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,OAAA,EAAA,IAAA,KAAA,YACA,EAAA,KAAA,KAGA,QAAA,SAAA,GACA,IAAA,KAAA,0BAAA,GAAA,CACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,cAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,OAAA,EAAA,IAAA,KAAA,YACA,EAAA,GAAA,GACA,KAAA,iBAGA,aAAA,WACA,EAAA,UAAA,KAAA,aAIA,GAAA,YAAA,GACA,OAAA,iBC3FA,SAAA,GACA,GASA,GATA,EAAA,EAAA,WACA,EAAA,EAAA,cAAA,WAAA,KAAA,EAAA,eACA,EAAA,EAAA,WAGA,GAFA,MAAA,UAAA,IAAA,KAAA,KAAA,MAAA,UAAA,KAEA,MACA,EAAA,IACA,EAAA,GACA,EAAA,eAIA,GAAA,EAGA,GACA,QACA,aACA,YACA,WACA,eAEA,SAAA,SAAA,GACA,EACA,EAAA,OAAA,EAAA,KAAA,QAEA,EAAA,gBAAA,IAGA,WAAA,SAAA,GACA,GACA,EAAA,SAAA,EAAA,KAAA,SAKA,aAAA,SAAA,GACA,GAAA,GAAA,EAAA,aAAA,GACA,EAAA,KAAA,wBAAA,EACA,KACA,EAAA,YAAA,EACA,EAAA,OAAA,EAAA,KAAA,QAEA,EAAA,GAAA,QAAA,SAAA,GACA,EAAA,YAAA,EACA,EAAA,OAAA,EAAA,KAAA,SACA,QAGA,eAAA,SAAA,GACA,EAAA,YAAA,OACA,EAAA,SAAA,EAAA,KAAA,QAEA,EAAA,GAAA,QAAA,SAAA,GACA,EAAA,YAAA,OACA,EAAA,SAAA,EAAA,KAAA,SACA,OAEA,eAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,aAAA,GACA,EAAA,KAAA,wBAAA,GACA,EAAA,KAAA,wBAAA,EAEA,IAAA,GACA,EAAA,YAAA,EACA,EAAA,GAAA,QAAA,SAAA,GACA,EAAA,YAAA,GACA,OACA,EACA,KAAA,eAAA,GACA,GACA,KAAA,aAAA,IAGA,aACA,QAAA,OACA,UAAA,QACA,UAAA,QACA,SAAA,uDAEA,wBAAA,SAAA,GACA,GAAA,GAAA,EACA,EAAA,KAAA,WACA,OAAA,SAAA,EACA,OACA,IAAA,EAAA,UACA,IACA,IAAA,EAAA,UACA,IACA,EAAA,SAAA,KAAA,GACA,KADA,QAIA,aAAA,QACA,WAAA,KACA,eAAA,SAAA,GACA,MAAA,MAAA,aAAA,EAAA,YAEA,gBAAA,SAAA,IAEA,IAAA,EAAA,YAAA,IAAA,EAAA,YAAA,EAAA,IAAA,MACA,KAAA,WAAA,EAAA,WACA,KAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,SACA,KAAA,UAAA,KACA,KAAA,0BAGA,qBAAA,SAAA,GACA,EAAA,YACA,KAAA,WAAA,KACA,KAAA,QAAA,KACA,KAAA,oBAGA,WAAA,EACA,QAAA,KACA,gBAAA,WACA,GAAA,GAAA,WACA,KAAA,WAAA,EACA,KAAA,QAAA,MACA,KAAA,KACA,MAAA,QAAA,WAAA,EAAA,IAEA,sBAAA,WACA,KAAA,SACA,aAAA,KAAA,UAGA,cAAA,SAAA,GACA,GAAA,GAAA,CAIA,QAHA,eAAA,GAAA,cAAA,KACA,EAAA,GAEA,GAEA,WAAA,SAAA,EAAA,GACA,GAAA,eAAA,KAAA,kBAAA,KAAA,CACA,GAAA,KAAA,eAAA,GAAA,CACA,GAAA,IACA,QAAA,EAAA,QACA,QAAA,EAAA,QACA,KAAA,KAAA,kBAAA,KACA,OAAA,EAAA,KAAA,KAAA,kBAAA,QAEA,OAAA,GAAA,WAAA,GAEA,MAAA,GAAA,WAAA,GAIA,MAAA,GAAA,IAAA,IAEA,eAAA,SAAA,GACA,GAAA,GAAA,KAAA,kBACA,EAAA,EAAA,WAAA,GAIA,EAAA,EAAA,UAAA,EAAA,WAAA,CACA,GAAA,OAAA,EAAA,KAAA,KAAA,WAAA,EAAA,IACA,EAAA,SAAA,EACA,EAAA,YAAA,EACA,EAAA,OAAA,KAAA,WACA,EAAA,QAAA,KAAA,cAAA,EAAA,MACA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EACA,EAAA,OAAA,EAAA,eAAA,EAAA,SAAA,EACA,EAAA,SAAA,EAAA,aAAA,EAAA,OAAA,GACA,EAAA,UAAA,KAAA,eAAA,GACA,EAAA,YAAA,KAAA,aACA,EAAA,QAAA,OAEA,IAAA,GAAA,IAMA,OALA,GAAA,eAAA,WACA,EAAA,WAAA,EACA,EAAA,QAAA,KACA,EAAA,kBAEA,GAEA,eAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,cACA,MAAA,kBAAA,CACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,KAAA,eAAA,GACA,eAAA,EAAA,MACA,EAAA,IAAA,EAAA,UAAA,EAAA,QAEA,EAAA,IAAA,EAAA,YACA,EAAA,KAAA,KAAA,IAEA,aAAA,EAAA,MAAA,EAAA,UACA,KAAA,eAAA,IAMA,aAAA,SAAA,GACA,GAAA,KAAA,QAAA,CACA,GAAA,GACA,EAAA,EAAA,cAAA,eAAA,EACA,IAAA,SAAA,EAEA,GAAA,MACA,IAAA,OAAA,EAEA,GAAA,MACA,CACA,GAAA,GAAA,EAAA,eAAA,GAEA,EAAA,EACA,EAAA,MAAA,EAAA,IAAA,IACA,EAAA,KAAA,IAAA,EAAA,SAAA,GAAA,KAAA,QAAA,IACA,EAAA,KAAA,IAAA,EAAA,SAAA,GAAA,KAAA,QAAA,GAGA,GAAA,GAAA,EAEA,MAAA,KAGA,UAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,GAAA,EAAA,aAAA,EACA,OAAA,GAUA,cAAA,SAAA,GACA,GAAA,GAAA,EAAA,OAGA,IAAA,EAAA,YAAA,EAAA,OAAA,CACA,GAAA,KACA,GAAA,QAAA,SAAA,EAAA,GAIA,GAAA,IAAA,IAAA,KAAA,UAAA,EAAA,EAAA,GAAA,CACA,GAAA,GAAA,CACA,GAAA,KAAA,KAEA,MACA,EAAA,QAAA,SAAA,GACA,KAAA,OAAA,GACA,EAAA,OAAA,EAAA,eAIA,WAAA,SAAA,GACA,KAAA,cAAA,GACA,KAAA,gBAAA,EAAA,eAAA,IACA,KAAA,gBAAA,GACA,KAAA,YACA,KAAA,aACA,KAAA,eAAA,EAAA,KAAA,QAGA,KAAA,SAAA,GACA,EAAA,KAAA,IAEA,UAAA,SAAA,GACA,GAAA,EACA,KAAA,eAAA,EAAA,KAAA,UAEA,IAAA,KAAA,WAQA,GAAA,KAAA,QAAA,CACA,GAAA,GAAA,EAAA,eAAA,GACA,EAAA,EAAA,QAAA,KAAA,QAAA,EACA,EAAA,EAAA,QAAA,KAAA,QAAA,EACA,EAAA,KAAA,KAAA,EAAA,EAAA,EAAA,EACA,IAAA,IACA,KAAA,YAAA,GACA,KAAA,WAAA,EACA,KAAA,QAAA,WAfA,QAAA,KAAA,WAAA,KAAA,aAAA,GACA,KAAA,WAAA,GAEA,KAAA,WAAA,EACA,EAAA,iBACA,KAAA,eAAA,EAAA,KAAA,QAeA,KAAA,SAAA,GACA,EAAA,KAAA,IAEA,SAAA,SAAA,GACA,KAAA,gBAAA,GACA,KAAA,eAAA,EAAA,KAAA,KAEA,GAAA,SAAA,GACA,EAAA,cAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,GAAA,IAEA,OAAA,SAAA,GACA,EAAA,OAAA,IAEA,YAAA,SAAA,GACA,EAAA,SAAA,EACA,KAAA,eAAA,EAAA,KAAA,SAEA,eAAA,SAAA,GACA,EAAA,UAAA,EAAA,WACA,KAAA,qBAAA,IAGA,gBAAA,SAAA,GACA,GAAA,GAAA,EAAA,YAAA,YACA,EAAA,EAAA,eAAA,EAEA,IAAA,KAAA,eAAA,GAAA,CAEA,GAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,QACA,GAAA,KAAA,EACA,IAAA,GAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,EACA,GAAA,IACA,EAAA,OAAA,EAAA,IAEA,KAAA,KAAA,EAAA,EACA,YAAA,EAAA,KAKA,KACA,EAAA,GAAA,GAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,IAGA,EAAA,YAAA,GACA,OAAA,iBCrVA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,WACA,EAAA,OAAA,gBAAA,gBAAA,QAAA,eAAA,qBACA,GACA,QACA,gBACA,gBACA,cACA,mBAEA,SAAA,SAAA,GACA,IAAA,UAGA,EAAA,OAAA,EAAA,KAAA,SAEA,WAAA,SAAA,GACA,EAAA,SAAA,EAAA,KAAA,SAEA,eACA,GACA,cACA,QACA,MACA,SAEA,aAAA,SAAA,GACA,GAAA,GAAA,CAMA,OALA,GAAA,EAAA,WAAA,GACA,IACA,EAAA,YAAA,KAAA,cAAA,EAAA,cAEA,EAAA,QAAA,KACA,GAEA,QAAA,SAAA,GACA,EAAA,UAAA,IAEA,cAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,OAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,IAAA,EAAA,UAAA,EAAA,QACA,EAAA,KAAA,IAEA,cAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,OAAA,EAAA,IAAA,EAAA,WACA,EAAA,KAAA,IAEA,YAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,cAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,OAAA,EAAA,IAAA,EAAA,WACA,EAAA,GAAA,GACA,KAAA,QAAA,EAAA,YAEA,gBAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,cAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,OAAA,EAAA,IAAA,EAAA,WACA,EAAA,OAAA,GACA,KAAA,QAAA,EAAA,YAIA,GAAA,SAAA,GACA,OAAA,iBCnEA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,WACA,GACA,QACA,cACA,cACA,YACA,iBAEA,aAAA,SAAA,GACA,GAAA,GAAA,EAAA,WAAA,EAEA,OADA,GAAA,QAAA,UACA,GAEA,SAAA,SAAA,GACA,IAAA,UAGA,EAAA,OAAA,EAAA,KAAA,SAEA,WAAA,SAAA,GACA,EAAA,SAAA,EAAA,KAAA,SAEA,QAAA,SAAA,GACA,EAAA,UAAA,IAEA,YAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,OAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,IAAA,EAAA,UAAA,EAAA,QACA,EAAA,KAAA,IAEA,YAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,OAAA,EAAA,IAAA,EAAA,WACA,EAAA,KAAA,IAEA,UAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,cAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,OAAA,EAAA,IAAA,EAAA,WACA,EAAA,GAAA,GACA,KAAA,QAAA,EAAA,YAEA,cAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,cAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,OAAA,EAAA,IAAA,EAAA,WACA,EAAA,OAAA,GACA,KAAA,QAAA,EAAA,YAIA,GAAA,cAAA,GACA,OAAA,iBClDA,SAAA,GACA,GAAA,GAAA,EAAA,UAEA,QAAA,aACA,EAAA,eAAA,UAAA,EAAA,eACA,OAAA,UAAA,iBACA,EAAA,eAAA,KAAA,EAAA,WAEA,EAAA,eAAA,QAAA,EAAA,aACA,SAAA,OAAA,cACA,EAAA,eAAA,QAAA,EAAA,cAIA,EAAA,SAAA,WACA,OAAA,iBC4EA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,aACA,EAAA,GAAA,GAAA,WACA,GACA,QACA,OACA,OACA,MAEA,iBAAA,EACA,SAAA,SAAA,GACA,MAAA,GAAA,EAAA,EAAA,IAEA,kBAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,CAKA,OAJA,IAAA,IACA,EAAA,EAAA,MAAA,EAAA,MACA,EAAA,EAAA,MAAA,EAAA,QAEA,EAAA,EAAA,EAAA,IAEA,UAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EACA,EAAA,KAAA,kBAAA,EAAA,UAAA,GACA,EAAA,KAAA,kBAAA,EAAA,cAAA,EACA,GAAA,IACA,EAAA,WAAA,KAAA,SAAA,EAAA,IAEA,EAAA,IACA,EAAA,WAAA,KAAA,SAAA,EAAA,GAEA,IAAA,GAAA,EAAA,iBAAA,GACA,SAAA,EACA,YAAA,EACA,GAAA,EAAA,EACA,GAAA,EAAA,EACA,IAAA,EAAA,EACA,IAAA,EAAA,EACA,EAAA,EAAA,EACA,EAAA,EAAA,EACA,QAAA,EAAA,QACA,QAAA,EAAA,QACA,MAAA,EAAA,MACA,MAAA,EAAA,MACA,QAAA,EAAA,QACA,QAAA,EAAA,QACA,WAAA,EAAA,WACA,WAAA,EAAA,WACA,UAAA,EAAA,UACA,cAAA,EAAA,cACA,YAAA,EAAA,YACA,UAAA,EAAA,UACA,QAAA,SAEA,GAAA,WAAA,cAAA,IAEA,KAAA,SAAA,GACA,GAAA,EAAA,YAAA,UAAA,EAAA,YAAA,IAAA,EAAA,SAAA,GAAA,CACA,GAAA,IACA,UAAA,EACA,WAAA,EAAA,OACA,aACA,cAAA,KACA,WAAA,EACA,WAAA,EACA,UAAA,EAEA,GAAA,IAAA,EAAA,UAAA,KAGA,KAAA,SAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAAA,UACA,IAAA,EAAA,CACA,GAAA,EAAA,SAUA,KAAA,UAAA,QAAA,EAAA,OAVA,CACA,GAAA,GAAA,KAAA,kBAAA,EAAA,UAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAEA,GAAA,KAAA,mBACA,EAAA,UAAA,EACA,KAAA,UAAA,aAAA,EAAA,UAAA,GACA,KAAA,UAAA,QAAA,EAAA,IAKA,EAAA,cAAA,IAGA,GAAA,SAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAAA,UACA,KACA,EAAA,UACA,KAAA,UAAA,WAAA,EAAA,GAEA,EAAA,OAAA,EAAA,aAIA,GAAA,gBAAA,QAAA,IACA,OAAA,iBCxJA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,aACA,GAEA,WAAA,IAEA,iBAAA,GACA,QACA,OACA,OACA,MAEA,YAAA,KACA,QAAA,KACA,MAAA,WACA,GAAA,GAAA,KAAA,MAAA,KAAA,YAAA,UACA,EAAA,KAAA,KAAA,YAAA,MACA,MAAA,SAAA,EAAA,GACA,KAAA,MAAA,GAEA,OAAA,WACA,cAAA,KAAA,SACA,KAAA,MACA,KAAA,SAAA,WAEA,KAAA,MAAA,EACA,KAAA,YAAA,KACA,KAAA,OAAA,KACA,KAAA,QAAA,MAEA,KAAA,SAAA,GACA,EAAA,YAAA,KAAA,cACA,KAAA,YAAA,EACA,KAAA,OAAA,EAAA,OACA,KAAA,QAAA,YAAA,KAAA,MAAA,KAAA,MAAA,KAAA,cAGA,GAAA,SAAA,GACA,KAAA,aAAA,KAAA,YAAA,YAAA,EAAA,WACA,KAAA,UAGA,KAAA,SAAA,GACA,GAAA,KAAA,aAAA,KAAA,YAAA,YAAA,EAAA,UAAA,CACA,GAAA,GAAA,EAAA,QAAA,KAAA,YAAA,QACA,EAAA,EAAA,QAAA,KAAA,YAAA,OACA,GAAA,EAAA,EAAA,EAAA,KAAA,kBACA,KAAA,WAIA,SAAA,SAAA,EAAA,GACA,GAAA,IACA,SAAA,EACA,YAAA,EACA,YAAA,KAAA,YAAA,YACA,UAAA,KAAA,YAAA,UACA,EAAA,KAAA,YAAA,QACA,EAAA,KAAA,YAAA,QACA,QAAA,OAEA,KACA,EAAA,SAAA,EAEA,IAAA,GAAA,EAAA,iBAAA,EAAA,EACA,MAAA,OAAA,cAAA,IAGA,GAAA,gBAAA,OAAA,IACA,OAAA,iBCrFA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,aACA,EAAA,GAAA,GAAA,WACA,GACA,QACA,OACA,MAEA,KAAA,SAAA,GACA,EAAA,YAAA,EAAA,cACA,EAAA,IAAA,EAAA,WACA,OAAA,EAAA,OACA,QAAA,EAAA,QACA,EAAA,EAAA,QACA,EAAA,EAAA,WAIA,UAAA,SAAA,EAAA,GACA,MAAA,UAAA,EAAA,YAEA,IAAA,EAAA,SAEA,EAAA,cAEA,GAAA,SAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAAA,UACA,IAAA,GAAA,KAAA,UAAA,EAAA,GAAA,CAEA,GAAA,GAAA,EAAA,cAAA,IAAA,EAAA,OAAA,EAAA,cACA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,iBAAA,OACA,SAAA,EACA,YAAA,EACA,EAAA,EAAA,QACA,EAAA,EAAA,QACA,OAAA,EAAA,OACA,YAAA,EAAA,YACA,UAAA,EAAA,UACA,OAAA,EAAA,OACA,QAAA,EAAA,QACA,QAAA,EAAA,QACA,SAAA,EAAA,SACA,QAAA,OAEA,GAAA,cAAA,IAGA,EAAA,OAAA,EAAA,YAIA,GAAA,WAAA,SAAA,GACA,MAAA,YACA,EAAA,cAAA,EACA,EAAA,OAAA,EAAA,aAGA,EAAA,gBAAA,MAAA,IACA,OAAA,iBClEA,SAAA,GACA,YAiEA,SAAA,GAAA,EAAA,GACA,IAAA,EACA,KAAA,IAAA,OAAA,WAAA,GAIA,QAAA,GAAA,GACA,MAAA,IAAA,IAAA,IAAA,EAMA,QAAA,GAAA,GACA,MAAA,MAAA,GACA,IAAA,GACA,KAAA,GACA,KAAA,GACA,MAAA,GACA,GAAA,MAAA,yGAAA,QAAA,OAAA,aAAA,IAAA,EAKA,QAAA,GAAA,GACA,MAAA,MAAA,GAAA,KAAA,GAAA,OAAA,GAAA,OAAA,EAKA,QAAA,GAAA,GACA,MAAA,MAAA,GAAA,KAAA,GACA,GAAA,IAAA,IAAA,GACA,GAAA,IAAA,KAAA,EAGA,QAAA,GAAA,GACA,MAAA,MAAA,GAAA,KAAA,GACA,GAAA,IAAA,IAAA,GACA,GAAA,IAAA,KAAA,GACA,GAAA,IAAA,IAAA,EAKA,QAAA,GAAA,GACA,MAAA,SAAA,EAKA,QAAA,KACA,KAAA,EAAA,GAAA,EAAA,EAAA,WAAA,OACA,EAIA,QAAA,KACA,GAAA,GAAA,CAGA,KADA,EAAA,IACA,EAAA,IACA,EAAA,EAAA,WAAA,GACA,EAAA,OACA,CAMA,OAAA,GAAA,MAAA,EAAA,GAGA,QAAA,KACA,GAAA,GAAA,EAAA,CAoBA,OAlBA,GAAA,EAEA,EAAA,IAKA,EADA,IAAA,EAAA,OACA,EAAA,WACA,EAAA,GACA,EAAA,QACA,SAAA,EACA,EAAA,YACA,SAAA,GAAA,UAAA,EACA,EAAA,eAEA,EAAA,YAIA,KAAA,EACA,MAAA,EACA,OAAA,EAAA,IAOA,QAAA,KACA,GAEA,GAEA,EAJA,EAAA,EACA,EAAA,EAAA,WAAA,GAEA,EAAA,EAAA,EAGA,QAAA,GAGA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,KACA,IAAA,KACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IAEA,QADA,GAEA,KAAA,EAAA,WACA,MAAA,OAAA,aAAA,GACA,OAAA,EAAA,GAGA,SAIA,GAHA,EAAA,EAAA,WAAA,EAAA,GAGA,KAAA,EACA,OAAA,GACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,KAEA,MADA,IAAA,GAEA,KAAA,EAAA,WACA,MAAA,OAAA,aAAA,GAAA,OAAA,aAAA,GACA,OAAA,EAAA,GAGA,KAAA,IACA,IAAA,IAOA,MANA,IAAA,EAGA,KAAA,EAAA,WAAA,MACA,GAGA,KAAA,EAAA,WACA,MAAA,EAAA,MAAA,EAAA,GACA,OAAA,EAAA,KAeA,MAJA,GAAA,EAAA,EAAA,GAIA,IAAA,GAAA,KAAA,QAAA,IAAA,GACA,GAAA,GAEA,KAAA,EAAA,WACA,MAAA,EAAA,EACA,OAAA,EAAA,KAIA,eAAA,QAAA,IAAA,KACA,GAEA,KAAA,EAAA,WACA,MAAA,EACA,OAAA,EAAA,SAIA,MAAA,EAAA,gBAAA,WAIA,QAAA,KACA,GAAA,GAAA,EAAA,CAQA,IANA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,WAAA,KAAA,MAAA,EACA,sEAEA,EAAA,EACA,EAAA,GACA,MAAA,EAAA,CAaA,IAZA,EAAA,EAAA,KACA,EAAA,EAAA,GAIA,MAAA,GAEA,GAAA,EAAA,EAAA,WAAA,KACA,KAAA,EAAA,gBAAA,WAIA,EAAA,EAAA,WAAA,KACA,GAAA,EAAA,IAEA,GAAA,EAAA,GAGA,GAAA,MAAA,EAAA,CAEA,IADA,GAAA,EAAA,KACA,EAAA,EAAA,WAAA,KACA,GAAA,EAAA,IAEA,GAAA,EAAA,GAGA,GAAA,MAAA,GAAA,MAAA,EAOA,GANA,GAAA,EAAA,KAEA,EAAA,EAAA,IACA,MAAA,GAAA,MAAA,KACA,GAAA,EAAA,MAEA,EAAA,EAAA,WAAA,IACA,KAAA,EAAA,EAAA,WAAA,KACA,GAAA,EAAA,SAGA,MAAA,EAAA,gBAAA,UAQA,OAJA,GAAA,EAAA,WAAA,KACA,KAAA,EAAA,gBAAA,YAIA,KAAA,EAAA,eACA,MAAA,WAAA,GACA,OAAA,EAAA,IAMA,QAAA,KACA,GAAA,GAAA,EAAA,EAAA,EAAA,GAAA,GAAA,CASA,KAPA,EAAA,EAAA,GACA,EAAA,MAAA,GAAA,MAAA,EACA,2CAEA,EAAA,IACA,EAEA,EAAA,GAAA,CAGA,GAFA,EAAA,EAAA,KAEA,IAAA,EAAA,CACA,EAAA,EACA,OACA,GAAA,OAAA,EAEA,GADA,EAAA,EAAA,KACA,GAAA,EAAA,EAAA,WAAA,IA0BA,OAAA,GAAA,OAAA,EAAA,MACA,MA1BA,QAAA,GACA,IAAA,IACA,GAAA,IACA,MACA,KAAA,IACA,GAAA,IACA,MACA,KAAA,IACA,GAAA,GACA,MACA,KAAA,IACA,GAAA,IACA,MACA,KAAA,IACA,GAAA,IACA,MACA,KAAA,IACA,GAAA,GACA,MAEA,SACA,GAAA,MAQA,CAAA,GAAA,EAAA,EAAA,WAAA,IACA,KAEA,IAAA,GAQA,MAJA,KAAA,GACA,KAAA,EAAA,gBAAA,YAIA,KAAA,EAAA,cACA,MAAA,EACA,MAAA,EACA,OAAA,EAAA,IAIA,QAAA,GAAA,GACA,MAAA,GAAA,OAAA,EAAA,YACA,EAAA,OAAA,EAAA,SACA,EAAA,OAAA,EAAA,gBACA,EAAA,OAAA,EAAA,YAGA,QAAA,KACA,GAAA,EAIA,OAFA,KAEA,GAAA,GAEA,KAAA,EAAA,IACA,OAAA,EAAA,KAIA,EAAA,EAAA,WAAA,GAGA,KAAA,GAAA,KAAA,GAAA,KAAA,EACA,IAIA,KAAA,GAAA,KAAA,EACA,IAGA,EAAA,GACA,IAKA,KAAA,EACA,EAAA,EAAA,WAAA,EAAA,IACA,IAEA,IAGA,EAAA,GACA,IAGA,KAGA,QAAA,KACA,GAAA,EASA,OAPA,GAAA,EACA,EAAA,EAAA,MAAA,GAEA,EAAA,IAEA,EAAA,EAAA,MAAA,GAEA,EAGA,QAAA,KACA,GAAA,EAEA,GAAA,EACA,EAAA,IACA,EAAA,EAKA,QAAA,GAAA,EAAA,GACA,GAAA,GACA,EAAA,MAAA,UAAA,MAAA,KAAA,UAAA,GACA,EAAA,EAAA,QACA,SACA,SAAA,EAAA,GAEA,MADA,GAAA,EAAA,EAAA,OAAA,sCACA,EAAA,IAOA,MAHA,GAAA,GAAA,OAAA,GACA,EAAA,MAAA,EACA,EAAA,YAAA,EACA,EAKA,QAAA,GAAA,GACA,EAAA,EAAA,EAAA,gBAAA,EAAA,OAMA,QAAA,GAAA,GACA,GAAA,GAAA,KACA,EAAA,OAAA,EAAA,YAAA,EAAA,QAAA,IACA,EAAA,GAMA,QAAA,GAAA,GACA,MAAA,GAAA,OAAA,EAAA,YAAA,EAAA,QAAA,EAKA,QAAA,GAAA,GACA,MAAA,GAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAwBA,QAAA,KACA,GAAA,KAIA,KAFA,EAAA,MAEA,EAAA,MACA,EAAA,MACA,IACA,EAAA,KAAA,QAEA,EAAA,KAAA,MAEA,EAAA,MACA,EAAA,KAOA,OAFA,GAAA,KAEA,EAAA,sBAAA,GAKA,QAAA,KACA,GAAA,EAOA,OALA,KACA,EAAA,IAIA,EAAA,OAAA,EAAA,eAAA,EAAA,OAAA,EAAA,eACA,EAAA,cAAA,GAGA,EAAA,iBAAA,EAAA,OAGA,QAAA,KACA,GAAA,GAAA,CAWA,OATA,GAAA,EACA,KAEA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,aACA,EAAA,GAGA,EAAA,IACA,EAAA,KACA,EAAA,eAAA,OAAA,EAAA,MAGA,QAAA,KACA,GAAA,KAIA,KAFA,EAAA,MAEA,EAAA,MACA,EAAA,KAAA,KAEA,EAAA,MACA,EAAA,IAMA,OAFA,GAAA,KAEA,EAAA,uBAAA,GAKA,QAAA,KACA,GAAA,EAQA,OANA,GAAA,KAEA,EAAA,KAEA,EAAA,KAEA,EAMA,QAAA,KACA,GAAA,GAAA,EAAA,CAEA,OAAA,GAAA,KACA,KAGA,EAAA,EAAA,KAEA,IAAA,EAAA,WACA,EAAA,EAAA,iBAAA,IAAA,OACA,IAAA,EAAA,eAAA,IAAA,EAAA,eACA,EAAA,EAAA,cAAA,KACA,IAAA,EAAA,QACA,EAAA,UACA,IACA,EAAA,EAAA,wBAEA,IAAA,EAAA,gBACA,EAAA,IACA,EAAA,MAAA,SAAA,EAAA,MACA,EAAA,EAAA,cAAA,IACA,IAAA,EAAA,aACA,EAAA,IACA,EAAA,MAAA,KACA,EAAA,EAAA,cAAA,IACA,EAAA,KACA,EAAA,IACA,EAAA,OACA,EAAA,KAGA,EACA,MAGA,GAAA,MAKA,QAAA,KACA,GAAA,KAIA,IAFA,EAAA,MAEA,EAAA,KACA,KAAA,EAAA,IACA,EAAA,KAAA,OACA,EAAA,OAGA,EAAA,IAMA,OAFA,GAAA,KAEA,EAGA,QAAA,KACA,GAAA,EAQA,OANA,GAAA,IAEA,EAAA,IACA,EAAA,GAGA,EAAA,iBAAA,EAAA,OAGA,QAAA,KAGA,MAFA,GAAA,KAEA,IAGA,QAAA,KACA,GAAA,EAQA,OANA,GAAA,KAEA,EAAA,KAEA,EAAA,KAEA,EAGA,QAAA,KACA,GAAA,GAAA,EAAA,CAIA,KAFA,EAAA,MAGA,GAAA,EAAA,KACA,EAAA,IACA,EAAA,EAAA,uBAAA,IAAA,EAAA,OACA,IAAA,EAAA,KACA,EAAA,IACA,EAAA,EAAA,uBAAA,IAAA,EAAA,OACA,CAAA,IAAA,EAAA,KAIA,KAHA,GAAA,IACA,EAAA,EAAA,qBAAA,EAAA,GAMA,MAAA,GASA,QAAA,KACA,GAAA,GAAA,CAcA,OAZA,GAAA,OAAA,EAAA,YAAA,EAAA,OAAA,EAAA,QACA,EAAA,KACA,EAAA,MAAA,EAAA,MAAA,EAAA,MACA,EAAA,IACA,EAAA,IACA,EAAA,EAAA,sBAAA,EAAA,MAAA,IACA,EAAA,WAAA,EAAA,SAAA,EAAA,UACA,KAAA,EAAA,iBAEA,EAAA,KAGA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,CAEA,IAAA,EAAA,OAAA,EAAA,YAAA,EAAA,OAAA,EAAA,QACA,MAAA,EAGA,QAAA,EAAA,OACA,IAAA,KACA,EAAA,CACA,MAEA,KAAA,KACA,EAAA,CACA,MAEA,KAAA,KACA,IAAA,KACA,IAAA,MACA,IAAA,MACA,EAAA,CACA,MAEA,KAAA,IACA,IAAA,IACA,IAAA,KACA,IAAA,KACA,IAAA,aACA,EAAA,CACA,MAEA,KAAA,KACA,EAAA,CACA,MAEA,KAAA,IACA,IAAA,IACA,EAAA,CACA,MAEA,KAAA,IACA,IAAA,IACA,IAAA,IACA,EAAA,GAOA,MAAA,GAWA,QAAA,KACA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAMA,IAJA,EAAA,IAEA,EAAA,EACA,EAAA,EAAA,GACA,IAAA,EACA,MAAA,EASA,KAPA,EAAA,KAAA,EACA,IAEA,EAAA,IAEA,GAAA,EAAA,EAAA,IAEA,EAAA,EAAA,IAAA,GAAA,CAGA,KAAA,EAAA,OAAA,GAAA,GAAA,EAAA,EAAA,OAAA,GAAA,MACA,EAAA,EAAA,MACA,EAAA,EAAA,MAAA,MACA,EAAA,EAAA,MACA,EAAA,EAAA,uBAAA,EAAA,EAAA,GACA,EAAA,KAAA,EAIA,GAAA,IACA,EAAA,KAAA,EACA,EAAA,KAAA,GACA,EAAA,IACA,EAAA,KAAA,GAMA,IAFA,EAAA,EAAA,OAAA,EACA,EAAA,EAAA,GACA,EAAA,GACA,EAAA,EAAA,uBAAA,EAAA,EAAA,GAAA,MAAA,EAAA,EAAA,GAAA,GACA,GAAA,CAGA,OAAA,GAMA,QAAA,KACA,GAAA,GAAA,EAAA,CAaA,OAXA,GAAA,IAEA,EAAA,OACA,IACA,EAAA,IACA,EAAA,KACA,EAAA,IAEA,EAAA,EAAA,4BAAA,EAAA,EAAA,IAGA,EAaA,QAAA,KACA,GAAA,GAAA,CAUA,OARA,GAAA,IAEA,EAAA,OAAA,EAAA,YACA,EAAA,GAGA,EAAA,EAAA,KAAA,OAEA,EAAA,aAAA,EAAA,MAAA,GAOA,QAAA,KACA,KAAA,EAAA,MACA,IACA,IAqBA,QAAA,KACA,IACA,GAEA,IAAA,GAAA,IACA,KACA,MAAA,EAAA,OAAA,MAAA,EAAA,OACA,EAAA,OAAA,EAAA,WACA,EAAA,IAEA,IACA,OAAA,EAAA,MACA,EAAA,GAEA,EAAA,eAAA,KAKA,EAAA,OAAA,EAAA,KACA,EAAA,GAIA,QAAA,GAAA,GACA,GACA,IAAA,GAAA,IAAA,KACA,GAAA,mBAAA,EAAA,GAGA,QAAA,GAAA,GACA,GAAA,EACA,OAAA,EAAA,QACA,IACA,EAAA,OAAA,EAAA,YACA,EAAA,GACA,EAAA,IAAA,OAGA,GACA,IAAA,GAAA,IACA,KACA,EAAA,mBAAA,EAAA,KAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GAUA,MATA,GAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAAA,OACA,EAAA,KACA,GACA,aAGA,IAx+BA,GAAA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CAEA,IACA,eAAA,EACA,IAAA,EACA,WAAA,EACA,QAAA,EACA,YAAA,EACA,eAAA,EACA,WAAA,EACA,cAAA,GAGA,KACA,EAAA,EAAA,gBAAA,UACA,EAAA,EAAA,KAAA,QACA,EAAA,EAAA,YAAA,aACA,EAAA,EAAA,SAAA,UACA,EAAA,EAAA,aAAA,OACA,EAAA,EAAA,gBAAA,UACA,EAAA,EAAA,YAAA,aACA,EAAA,EAAA,eAAA,SAEA,GACA,gBAAA,kBACA,iBAAA,mBACA,eAAA,iBACA,sBAAA,wBACA,eAAA,iBACA,oBAAA,sBACA,WAAA,aACA,QAAA,UACA,iBAAA,mBACA,kBAAA,oBACA,iBAAA,mBACA,iBAAA,mBACA,QAAA,UACA,SAAA,WACA,eAAA,iBACA,gBAAA,mBAIA,GACA,gBAAA,sBACA,aAAA,uBACA,cAAA,oCAgrBA,IAAA,IAAA,EAuJA,GAAA,CA6GA,GAAA,SACA,MAAA,IAEA,MC1gCA,SAAA,GACA,YAEA,SAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,EACA,KAEA,GADA,EAAA,EAAA,GACA,EAAA,aACA,EAAA,WAAA,KAAA,cACA,aAAA,EAAA,SACA,SAAA,GAAA,WAAA,GACA,KAAA,OAAA,4DAEA,MAAA,GAEA,WADA,SAAA,MAAA,8BAAA,EAAA,GAIA,MAAA,UAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAOA,OANA,GAAA,YAAA,IACA,EAAA,6BAAA,EAAA,WACA,EAAA,aACA,EAAA,6BAAA,EAAA,aAGA,GAOA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,EACA,KAAA,EAAA,CACA,GAAA,GAAA,GAAA,EACA,SAAA,MAAA,EAAA,GACA,EAAA,GAAA,GAAA,GACA,EAAA,GAAA,EAEA,MAAA,GAGA,QAAA,GAAA,GACA,KAAA,MAAA,EACA,KAAA,SAAA,OAgBA,QAAA,GAAA,GACA,KAAA,KAAA,EACA,KAAA,KAAA,KAAA,IAAA,GA2BA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,SAAA,KAAA,EAEA,KAAA,YAAA,kBAAA,IACA,EAAA,aACA,KAAA,YAAA,YAAA,IAEA,KAAA,YACA,KAAA,cACA,YAAA,IAAA,YAAA,MACA,YAAA,IAAA,YAAA,IAEA,KAAA,OAAA,KAAA,WAAA,EAAA,EAAA,GACA,KAAA,UAAA,KAAA,UAAA,KAAA,WACA,EAAA,EAAA,GAuEA,QAAA,GAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,OACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,KAAA,KAAA,GAAA,EAAA,EAAA,IA0CA,QAAA,KAAA,KAAA,OAAA,mBA0BA,QAAA,GAAA,GACA,MAAA,kBAAA,GAAA,EAAA,EAAA,UAGA,QAAA,KACA,KAAA,WAAA,KACA,KAAA,WACA,KAAA,QACA,KAAA,YAAA,OACA,KAAA,WAAA,OACA,KAAA,WAAA,OACA,KAAA,aAAA,EA0HA,QAAA,GAAA,GACA,KAAA,OAAA,EAUA,QAAA,GAAA,GAIA,GAHA,KAAA,WAAA,EAAA,WACA,KAAA,WAAA,EAAA,YAEA,EAAA,WACA,KAAA,OAAA,uBAEA,MAAA,WAAA,EAAA,WACA,EAAA,KAAA,YAEA,KAAA,QAAA,EAAA,QACA,KAAA,YAAA,EAAA,YAmEA,QAAA,GAAA,GACA,MAAA,QAAA,GAAA,QAAA,SAAA,SAAA,GACA,MAAA,IAAA,EAAA,gBASA,QAAA,GAAA,EAAA,GACA,KAAA,EAAA,KACA,OAAA,UAAA,eAAA,KAAA,EAAA,IACA,EAAA,EAAA,EAGA,OAAA,GAGA,QAAA,GAAA,GACA,OAAA,GACA,IAAA,GACA,OAAA,CAEA,KAAA,QACA,IAAA,OACA,IAAA,OACA,OAAA,EAGA,MAAA,OAAA,OAAA,KAGA,GAFA,EAKA,QAAA,MA5dA,GAAA,GAAA,OAAA,OAAA,KAkBA;EAAA,WACA,QAAA,WACA,IAAA,KAAA,SAAA,CACA,GAAA,GAAA,KAAA,KACA,MAAA,SAAA,WACA,MAAA,IAIA,MAAA,MAAA,WASA,EAAA,WACA,QAAA,WACA,IAAA,KAAA,SAAA,CACA,GACA,IADA,KAAA,KACA,KAAA,KACA,MAAA,SAAA,SAAA,EAAA,GAIA,MAHA,IACA,EAAA,QAAA,EAAA,GAEA,EAAA,aAAA,IAIA,MAAA,MAAA,UAGA,SAAA,SAAA,EAAA,GAIA,MAHA,IAAA,KAAA,KAAA,OACA,EAAA,EAAA,EAAA,KAAA,KAAA,IAEA,KAAA,KAAA,aAAA,EAAA,KAqBA,EAAA,WACA,GAAA,YACA,IAAA,KAAA,UAAA,CAEA,GAAA,GAAA,KAAA,iBAAA,GACA,KAAA,OAAA,SAAA,SAAA,KAAA,OAAA,KACA,GAAA,KAAA,KAAA,mBAAA,GACA,KAAA,SAAA,KAAA,KAAA,SAAA,OACA,KAAA,UAAA,KAAA,IAAA,GAGA,MAAA,MAAA,WAGA,QAAA,WACA,IAAA,KAAA,SAAA,CACA,GAAA,GAAA,KAAA,MAEA,IAAA,KAAA,WAAA,CACA,GAAA,GAAA,KAAA,QAEA,MAAA,SAAA,SAAA,EAAA,GAIA,MAHA,IACA,EAAA,QAAA,EAAA,GAEA,EAAA,aAAA,QAEA,IAAA,KAAA,SAWA,CAEA,GAAA,GAAA,KAAA,QAEA,MAAA,SAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAIA,OAHA,IACA,EAAA,QAAA,GAAA,IAEA,EAAA,EAAA,GAAA,YArBA,CACA,GAAA,GAAA,KAAA,IAAA,KAAA,SAAA,KAEA,MAAA,SAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,EAAA,EAKA,OAHA,IACA,EAAA,QAAA,EAAA,GAEA,EAAA,aAAA,KAgBA,MAAA,MAAA,UAGA,SAAA,SAAA,EAAA,GACA,GAAA,KAAA,WAEA,MADA,MAAA,SAAA,aAAA,EAAA,GACA,CAGA,IAAA,GAAA,KAAA,OAAA,GACA,EAAA,KAAA,mBAAA,GAAA,KAAA,SAAA,KACA,KAAA,SAAA,EACA,OAAA,GAAA,GAAA,IAYA,EAAA,WACA,UAAA,SAAA,EAAA,EAAA,EAAA,EACA,GACA,GAAA,GAAA,EAAA,KAAA,MACA,EAAA,CACA,IAAA,EACA,EAAA,WAGA,IADA,EAAA,EAAA,KAAA,OACA,EAEA,WADA,SAAA,MAAA,mCAAA,KAAA,KAcA,IANA,EACA,EAAA,EAAA,QACA,kBAAA,GAAA,QACA,EAAA,EAAA,OAGA,kBAAA,GAEA,WADA,SAAA,MAAA,mCAAA,KAAA,KAKA,KAAA,GADA,GAAA,MACA,EAAA,EAAA,EAAA,KAAA,KAAA,OAAA,IACA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,EAAA,GAGA,OAAA,GAAA,MAAA,EAAA,IAMA,IAAA,IACA,IAAA,SAAA,GAAA,OAAA,GACA,IAAA,SAAA,GAAA,OAAA,GACA,IAAA,SAAA,GAAA,OAAA,IAGA,GACA,IAAA,SAAA,EAAA,GAAA,MAAA,GAAA,GACA,IAAA,SAAA,EAAA,GAAA,MAAA,GAAA,GACA,IAAA,SAAA,EAAA,GAAA,MAAA,GAAA,GACA,IAAA,SAAA,EAAA,GAAA,MAAA,GAAA,GACA,IAAA,SAAA,EAAA,GAAA,MAAA,GAAA,GACA,IAAA,SAAA,EAAA,GAAA,MAAA,GAAA,GACA,IAAA,SAAA,EAAA,GAAA,MAAA,GAAA,GACA,KAAA,SAAA,EAAA,GAAA,MAAA,IAAA,GACA,KAAA,SAAA,EAAA,GAAA,MAAA,IAAA,GACA,KAAA,SAAA,EAAA,GAAA,MAAA,IAAA,GACA,KAAA,SAAA,EAAA,GAAA,MAAA,IAAA,GACA,MAAA,SAAA,EAAA,GAAA,MAAA,KAAA,GACA,MAAA,SAAA,EAAA,GAAA,MAAA,KAAA,GACA,KAAA,SAAA,EAAA,GAAA,MAAA,IAAA,GACA,KAAA,SAAA,EAAA,GAAA,MAAA,IAAA,GAiBA,GAAA,WACA,sBAAA,SAAA,EAAA,GACA,IAAA,EAAA,GACA,KAAA,OAAA,wBAAA,EAIA,OAFA,GAAA,EAAA,GAEA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,GAAA,EAAA,EAAA,EAAA,MAIA,uBAAA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,GACA,KAAA,OAAA,wBAAA,EAKA,OAHA,GAAA,EAAA,GACA,EAAA,EAAA,GAEA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,MAIA,4BAAA,SAAA,EAAA,EAAA,GAKA,MAJA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,GAEA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,KAIA,iBAAA,SAAA,GACA,GAAA,GAAA,GAAA,GAAA,EAEA,OADA,GAAA,KAAA,aACA,GAGA,uBAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,GAAA,EAAA,EAAA,EAGA,OAFA,GAAA,cACA,KAAA,aAAA,GACA,GAGA,qBAAA,SAAA,EAAA,GACA,KAAA,YAAA,IACA,KAAA,OAAA,mDAEA,IAAA,GAAA,GAAA,GAAA,EAAA,KAAA,EAEA,OAAA,UAAA,EAAA,EAAA,GACA,MAAA,GAAA,UAAA,EAAA,EAAA,GAAA,KAIA,cAAA,SAAA,GACA,MAAA,IAAA,GAAA,EAAA,QAGA,sBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,EAAA,EAAA,GAEA,OAAA,UAAA,EAAA,EAAA,GAEA,IAAA,GADA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,KAAA,EAAA,GAAA,EAAA,EAAA,GACA,OAAA,KAIA,eAAA,SAAA,EAAA,EAAA,GACA,OACA,IAAA,YAAA,GAAA,EAAA,KAAA,EAAA,MACA,MAAA,IAIA,uBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,MAAA,EAAA,EAAA,GAAA,MAEA,OAAA,UAAA,EAAA,EAAA,GAEA,IAAA,GADA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GAAA,KACA,EAAA,GAAA,MAAA,EAAA,EAAA,EACA,OAAA,KAIA,aAAA,SAAA,EAAA,GACA,KAAA,QAAA,KAAA,GAAA,GAAA,EAAA,KAGA,mBAAA,SAAA,EAAA,GACA,KAAA,WAAA,EACA,KAAA,WAAA,GAGA,mBAAA,SAAA,EAAA,EAAA,GACA,KAAA,WAAA,EACA,KAAA,WAAA,EACA,KAAA,WAAA,GAGA,eAAA,SAAA,GACA,KAAA,WAAA,GAGA,qBAAA,GAOA,EAAA,WACA,KAAA,WAAA,MAAA,MAAA,QACA,eAAA,WAAA,MAAA,MAAA,QACA,QAAA,aACA,MAAA,cAiBA,EAAA,WACA,WAAA,SAAA,EAAA,EAAA,GAUA,QAAA,KAEA,GAAA,EAEA,MADA,IAAA,EACA,CAGA,GAAA,aACA,EAAA,YAEA,IAAA,GAAA,EAAA,SAAA,EACA,EAAA,YAAA,EAAA,OACA,EAIA,OAHA,GAAA,aACA,EAAA,cAEA,EAGA,QAAA,GAAA,GAEA,MADA,GAAA,SAAA,EAAA,EAAA,GACA,EA9BA,GAAA,EACA,MAAA,MAAA,SAAA,EAAA,OAAA,EAEA,IAAA,GAAA,GAAA,kBAEA,EAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,EACA,EAAA,IA0BA,OAAA,IAAA,mBAAA,EAAA,EAAA,GAAA,IAGA,SAAA,SAAA,EAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,KAAA,YAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,KAAA,QAAA,OAAA,IACA,EAAA,KAAA,QAAA,GAAA,UAAA,EAAA,EAAA,GACA,GAAA,GAGA,OAAA,IAGA,SAAA,SAAA,EAAA,EAAA,GAEA,IADA,GAAA,GAAA,KAAA,QAAA,KAAA,QAAA,OAAA,EACA,IAAA,GACA,EAAA,KAAA,QAAA,GAAA,UAAA,EAAA,OACA,GAAA,GAAA,GAGA,OAAA,MAAA,WAAA,SACA,KAAA,WAAA,SAAA,EAAA,GADA,QAeA,IAAA,GAAA,IAAA,KAAA,SAAA,SAAA,IAAA,MAAA,EAiCA,GAAA,WAEA,YAAA,SAAA,GACA,GAAA,KACA,KAAA,GAAA,KAAA,GACA,EAAA,KAAA,EAAA,GAAA,KAAA,EAAA,GAEA,OAAA,GAAA,KAAA,OAGA,UAAA,SAAA,GACA,GAAA,KACA,KAAA,GAAA,KAAA,GACA,EAAA,IACA,EAAA,KAAA,EAEA,OAAA,GAAA,KAAA,MAIA,+BAAA,SAAA,GACA,GAAA,GAAA,EAAA,4BACA,IAAA,EAGA,MAAA,UAAA,EAAA,GACA,EAAA,MAAA,GAAA,IAIA,eAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,IAAA,EAEA,EAAA,GAAA,EAAA,KAAA,EAAA,MAaA,MAAA,GAAA,EAAA,EAAA,EAAA,KAZA,IAAA,GAAA,EAAA,OACA,MAAA,UAAA,EAAA,EAAA,GACA,GAAA,EACA,MAAA,GAAA,aAAA,EAEA,IAAA,GAAA,EAAA,EAAA,EAAA,GACA,OAAA,IAAA,cAAA,EAAA,MASA,qBAAA,SAAA,GACA,GAAA,GAAA,EAAA,4BACA,IAAA,EAAA,CAGA,GAAA,GAAA,EAAA,iBACA,EAAA,iBAAA,MACA,EAAA,MAEA,EAAA,EAAA,4BAEA,OAAA,UAAA,GACA,MAAA,GAAA,EAAA,EAAA,EAAA,MAKA,IAAA,GAAA,gBACA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,KAKA,OAJA,GAAA,GAAA,EACA,EAAA,GAAA,OACA,EAAA,GAAA,EACA,EAAA,UAAA,EACA,GAEA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,OAAA,OAAA,EAOA,OANA,QAAA,eAAA,EAAA,GACA,MAAA,EAAA,cAAA,EAAA,UAAA,IACA,OAAA,eAAA,EAAA,GACA,MAAA,OAAA,cAAA,EAAA,UAAA,IACA,OAAA,eAAA,EAAA,GACA,MAAA,EAAA,cAAA,EAAA,UAAA,IACA,EAGA,GAAA,mBAAA,EACA,EAAA,cAAA,GACA,MChlBA,kBAAA,QAAA,UACA,YCJA,SAAA,GAGA,QAAA,GAAA,EAAA,GAiBA,MAhBA,IAAA,GAEA,OAAA,oBAAA,GAAA,QAAA,SAAA,GAEA,GAAA,GAAA,OAAA,yBAAA,EAAA,EACA,KAEA,OAAA,eAAA,EAAA,EAAA,GAEA,kBAAA,GAAA,QAEA,EAAA,MAAA,IAAA,MAKA,EAKA,EAAA,OAAA,GAEA,SC3BA,SAAA,GA6CA,QAAA,GAAA,EAAA,EAAA,GAOA,MANA,GACA,EAAA,OAEA,EAAA,GAAA,GAAA,MAEA,EAAA,GAAA,EAAA,GACA,EAzCA,GAAA,GAAA,SAAA,GACA,KAAA,QAAA,EACA,KAAA,cAAA,KAAA,SAAA,KAAA,MAEA,GAAA,WACA,GAAA,SAAA,EAAA,GACA,KAAA,SAAA,CACA,IAAA,EACA,IAMA,EAAA,WAAA,KAAA,cAAA,GACA,KAAA,OAAA,WACA,aAAA,MAPA,EAAA,sBAAA,KAAA,eACA,KAAA,OAAA,WACA,qBAAA,MASA,KAAA,WACA,KAAA,SACA,KAAA,SACA,KAAA,OAAA,OAGA,SAAA,WACA,KAAA,SACA,KAAA,OACA,KAAA,SAAA,KAAA,KAAA,YAiBA,EAAA,IAAA,GAEA,SC3DA,WAEA,GAAA,KAEA,aAAA,SAAA,SAAA,EAAA,GACA,EAAA,GAAA,GAIA,YAAA,mBAAA,SAAA,GACA,GAAA,GAAA,EAAA,EAAA,GAAA,YAAA,SAEA,OAAA,IAAA,OAAA,eAAA,SAAA,cAAA,IAIA,IAAA,GAAA,MAAA,UAAA,eACA,OAAA,UAAA,gBAAA,WACA,KAAA,cAAA,EACA,EAAA,MAAA,KAAA,aASA,SC5BA,SAAA,GAgBA,QAAA,GAAA,GAMA,GAAA,GAAA,EAAA,OAEA,EAAA,EAAA,IAEA,EAAA,EAAA,MACA,KACA,IACA,EAAA,EAAA,IAAA,EAAA,KAAA,KAAA,IAEA,GACA,QAAA,KAAA,iFAQA,EAAA,EAAA,EAAA,EAAA,EAAA,OAGA,IAAA,GAAA,EAAA,EACA,OAAA,IAEA,EAAA,QAEA,EAAA,EAAA,EAAA,GAIA,EAAA,MAAA,KAAA,QARA,OAYA,QAAA,GAAA,GAEA,IADA,GAAA,GAAA,KAAA,UACA,GAAA,IAAA,YAAA,WAAA,CAGA,IAAA,GAAA,GADA,EAAA,OAAA,oBAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAAA,CACA,GAAA,GAAA,OAAA,yBAAA,EAAA,EACA,IAAA,kBAAA,GAAA,OAAA,EAAA,QAAA,EACA,MAAA,GAGA,EAAA,EAAA,WAIA,QAAA,GAAA,EAAA,EAAA,GAIA,GAAA,GAAA,EAAA,EAAA,EAAA,EAMA,OALA,GAAA,KAGA,EAAA,GAAA,IAAA,GAEA,EAAA,OAAA,EAGA,QAAA,GAAA,EAAA,EAAA,GAEA,KAAA,GAAA,CACA,GAAA,EAAA,KAAA,GAAA,EAAA,GACA,MAAA,EAEA,GAAA,EAAA,GAMA,MAAA,QAMA,QAAA,GAAA,GACA,MAAA,GAAA,UAkBA,EAAA,MAAA,GAEA,SC3HA,SAAA,GA8CA,QAAA,GAAA,EAAA,GAEA,GAAA,SAAA,EAMA,OAJA,aAAA,QACA,EAAA,QAGA,EAAA,GAAA,EAAA,GApDA,GAAA,IACA,OAAA,SAAA,GACA,MAAA,IAEA,KAAA,SAAA,GACA,MAAA,IAAA,MAAA,KAAA,MAAA,IAAA,KAAA,QAEA,UAAA,SAAA,GACA,MAAA,KAAA,GACA,EAEA,UAAA,GAAA,IAAA,GAEA,OAAA,SAAA,GACA,GAAA,GAAA,WAAA,EAKA,OAHA,KAAA,IACA,EAAA,SAAA,IAEA,MAAA,GAAA,EAAA,GAKA,OAAA,SAAA,EAAA,GACA,GAAA,OAAA,EACA,MAAA,EAEA,KAIA,MAAA,MAAA,MAAA,EAAA,QAAA,KAAA,MACA,MAAA,GAEA,MAAA,KAIA,WAAA,SAAA,EAAA,GACA,MAAA,IAiBA,GAAA,iBAAA,GAEA,SC9DA,SAAA,GAIA,GAAA,GAAA,EAAA,OAIA,IAEA,GAAA,eACA,EAAA,YAEA,EAAA,QAAA,SAAA,EAAA,GACA,IAAA,GAAA,KAAA,GACA,EAAA,EAAA,EAAA,KAMA,EAAA,IAAA,GAEA,SCtBA,SAAA,GAEA,GAAA,IASA,MAAA,SAAA,EAAA,EAAA,GAGA,SAAA,QAEA,EAAA,GAAA,EAAA,OAAA,GAAA,EAEA,IAAA,GAAA,YACA,KAAA,IAAA,GAAA,MAAA,KAAA,IACA,KAAA,MAEA,EAAA,EAAA,WAAA,EAAA,GACA,sBAAA,EAEA,OAAA,GAAA,GAAA,GAEA,YAAA,SAAA,GACA,EAAA,EACA,sBAAA,GAEA,aAAA,IAWA,KAAA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,KACA,EAAA,MACA,EAAA,GAAA,aAAA,GACA,QAAA,SAAA,EAAA,GAAA,EACA,WAAA,SAAA,EAAA,GAAA,EACA,OAAA,GAGA,OADA,GAAA,cAAA,GACA,GASA,UAAA,WACA,KAAA,MAAA,OAAA,YASA,aAAA,SAAA,EAAA,EAAA,GACA,GACA,EAAA,UAAA,OAAA,GAEA,GACA,EAAA,UAAA,IAAA,IASA,gBAAA,SAAA,EAAA,GACA,GAAA,GAAA,SAAA,cAAA,WACA,GAAA,UAAA,CACA,IAAA,GAAA,KAAA,iBAAA,EAKA,OAJA,KACA,EAAA,YAAA,GACA,EAAA,YAAA,IAEA,IAKA,EAAA,aAGA,IAIA,GAAA,YAAA,EAAA,MAIA,EAAA,IAAA,SAAA,MAAA,EACA,EAAA,IAAA,EACA,EAAA,IAAA,GAEA,SChHA,SAAA,GAIA,GAAA,GAAA,OAAA,aACA,EAAA,MAGA,GAEA,aAAA,EAEA,iBAAA,WACA,GAAA,GAAA,KAAA,cACA,GAAA,QAAA,OAAA,KAAA,GAAA,OAAA,GAAA,QAAA,IAAA,yBAAA,KAAA,UAAA,EAKA,KAAA,GAAA,KAAA,GAAA,CACA,GAAA,GAAA,EAAA,EACA,MAAA,iBAAA,EAAA,KAAA,QAAA,gBAAA,KAAA,KACA,MAIA,eAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,CACA,EAAA,QAAA,QAAA,MAAA,qBAAA,EAAA,UAAA,EACA,IAAA,GAAA,kBAAA,GAAA,EAAA,EAAA,EACA,IACA,EAAA,EAAA,QAAA,QAAA,EAAA,GAEA,EAAA,QAAA,QAAA,WACA,SAAA,UAOA,GAAA,IAAA,SAAA,OAAA,GAEA,SC3CA,SAAA,GAIA,GAAA,IACA,uBAAA,WACA,GAAA,GAAA,KAAA,mBACA,KAAA,GAAA,KAAA,GACA,KAAA,aAAA,IACA,KAAA,aAAA,EAAA,EAAA,KAKA,eAAA,WAGA,GAAA,KAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,KAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,KAAA,EAAA,EAAA,IACA,KAAA,oBAAA,EAAA,KAAA,EAAA,QAMA,oBAAA,SAAA,EAAA,GAGA,GAAA,GAAA,KAAA,qBAAA,EACA,IAAA,EAAA,CAIA,GAAA,GAAA,EAAA,OAAA,EAAA,cAAA,EACA,MAGA,IAAA,GAAA,KAAA,GAEA,EAAA,KAAA,iBAAA,EAAA,EAEA,KAAA,IAEA,KAAA,GAAA,KAKA,qBAAA,SAAA,GACA,GAAA,GAAA,KAAA,YAAA,KAAA,WAAA,EAEA,OAAA,IAGA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,iBAAA,EAAA,IAEA,eAAA,SAAA,EAAA,GACA,MAAA,YAAA,EACA,EAAA,GAAA,OACA,WAAA,GAAA,aAAA,GACA,SAAA,EACA,EAFA,QAKA,2BAAA,SAAA,GACA,GAAA,SAAA,MAAA,GAEA,EAAA,KAAA,eAAA,KAAA,GAAA,EAEA,UAAA,EACA,KAAA,aAAA,EAAA,GAMA,YAAA,GACA,KAAA,gBAAA,IAOA,GAAA,IAAA,SAAA,WAAA,GAEA,SCvFA,SAAA,GAyBA,QAAA,GAAA,EAAA,GACA,MAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EAAA,EACA,EAAA,IAAA,EAAA,IACA,EAEA,IAAA,GAAA,IAAA,EAKA,QAAA,GAAA,EAAA,GACA,MAAA,UAAA,GAAA,OAAA,EACA,EAEA,OAAA,GAAA,SAAA,EAAA,EAAA,EApCA,GAAA,GAAA,OAAA,aAUA,GACA,OAAA,OACA,KAAA,SACA,KAAA,OACA,SAAA,QAGA,EAAA,OAAA,OAAA,SAAA,GACA,MAAA,gBAAA,IAAA,MAAA,IAqBA,GACA,uBAAA,WACA,GAAA,GAAA,KAAA,aACA,IAAA,GAAA,EAAA,OAAA,CACA,GAAA,GAAA,KAAA,kBAAA,GAAA,mBAAA,EACA,MAAA,iBAAA,EAKA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,QAAA,KAAA,GACA,KAAA,kBAAA,EAAA,KAAA,GAAA,QAIA,qBAAA,WACA,KAAA,mBACA,KAAA,kBAAA,KAAA,KAAA,sBAAA,OAGA,sBAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,IACA,KAAA,GAAA,KAAA,GAIA,GAFA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,KAAA,QAAA,GACA,CACA,GAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAEA,MAAA,kBAAA,EAAA,EAAA,GACA,EAAA,KAEA,SAAA,GAAA,OAAA,GAAA,SAAA,GAAA,OAAA,KACA,EAAA,IAAA,EAKA,KAAA,aAAA,GAAA,EAAA,EAAA,eAMA,eAAA,WACA,KAAA,mBACA,KAAA,kBAAA,WAGA,iBAAA,SAAA,GACA,KAAA,QAAA,IACA,KAAA,2BAAA,IAGA,kBAAA,SAAA,EAAA,EAAA,GAEA,GAAA,GAAA,KAAA,QAAA,EACA,IAAA,IAEA,MAAA,QAAA,KACA,EAAA,SAAA,QAAA,IAAA,mDAAA,KAAA,UAAA,GACA,KAAA,mBAAA,EAAA,YAGA,MAAA,QAAA,IAAA,CACA,EAAA,SAAA,QAAA,IAAA,iDAAA,KAAA,UAAA,EAAA,EACA,IAAA,GAAA,GAAA,eAAA,EACA,GAAA,KAAA,SAAA,EAAA,GACA,KAAA,aAAA,GAAA,KACA,MACA,KAAA,sBAAA,EAAA,UAAA,KAIA,yBAAA,SAAA,EAAA,EAAA,GAEA,IAAA,EAAA,EAAA,KAGA,KAAA,iBAAA,EAAA,EAAA,GAEA,SAAA,kBAAA,CAGA,GAAA,GAAA,KAAA,SACA,KACA,EAAA,KAAA,UAAA,OAAA,YAAA,OAEA,EAAA,OAAA,KACA,EAAA,KAAA,EACA,EAAA,SAAA,EAEA,EAAA,OAAA,KAEA,eAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,IACA,EAAA,EAAA,aAEA,MAAA,GAAA,CACA,IAAA,GAAA,KAAA,GAEA,EAAA,KACA,EAAA,EAAA,KAAA,SAAA,EAAA,GACA,EAAA,GAAA,EACA,EAAA,yBAAA,EAAA,EAAA,IAGA,IAAA,IAAA,EAAA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,EAAA,EACA,GAAA,EAAA,KACA,EAAA,EACA,EAAA,UACA,EAAA,SAAA,IAIA,KAAA,GAAA,EACA,KAAA,yBAAA,EAAA,EAAA,EAEA,IAAA,IACA,MAAA,WACA,EAAA,QACA,EAAA,GAAA,QAIA,OADA,MAAA,iBAAA,GACA,GAEA,yBAAA,WACA,GAAA,KAAA,eAIA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,eAAA,OAAA,IAAA,CACA,GAAA,GAAA,KAAA,eAAA,GACA,EAAA,KAAA,SAAA,EACA,KACA,GAAA,GAAA,mBAAA,cAAA,GACA,EAAA,EAAA,WAAA,KAAA,KAAA,QAAA,OACA,MAAA,eAAA,EAAA,GACA,MAAA,GACA,QAAA,MAAA,qCAAA,MAIA,aAAA,SAAA,EAAA,EAAA,GACA,MAAA,QACA,KAAA,GAAA,GAGA,KAAA,eAAA,EAAA,EAAA,IAEA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,IAAA,CACA,mBAAA,IACA,EAAA,MAAA,KAAA,IAGA,iBAAA,SAAA,GACA,MAAA,MAAA,eAKA,MAAA,WAAA,KAAA,QAJA,KAAA,YAAA,KAOA,eAAA,WACA,GAAA,KAAA,WAAA,CAKA,IAAA,GADA,GAAA,KAAA,WACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,kBAAA,GAAA,OACA,EAAA,QAIA,KAAA,gBAGA,sBAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,kBAAA,KAAA,mBACA,GAAA,GAAA,GAEA,mBAAA,SAAA,GACA,GAAA,GAAA,KAAA,eACA,OAAA,IAAA,EAAA,IACA,EAAA,GAAA,QACA,EAAA,GAAA,MACA,GAHA,QAMA,oBAAA,WACA,GAAA,KAAA,gBAAA,CACA,IAAA,GAAA,KAAA,MAAA,gBACA,KAAA,mBAAA,EAEA,MAAA,qBAYA,GAAA,IAAA,SAAA,WAAA,GAEA,SClQA,SAAA,GAIA,GAAA,GAAA,OAAA,UAAA,EAGA,GACA,iBAAA,SAAA,GAMA,IAAA,GAJA,GAAA,KAAA,SAAA,EAAA,iBACA,KAAA,QAAA,OACA,EAAA,EAAA,eAAA,KAAA,GACA,EAAA,EAAA,UACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,KAAA,iBAAA,EAAA,GAEA,OAAA,IAEA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,qBAAA,EACA,IAAA,EAIA,CAEA,GAAA,GAAA,KAAA,aAAA,EAAA,EAAA,EAUA,OAPA,UAAA,0BAAA,IACA,EAAA,KAAA,EAAA,MACA,KAAA,eAAA,EAAA,IAEA,KAAA,QAAA,IACA,KAAA,2BAAA,GAEA,EAbA,MAAA,MAAA,WAAA,YAgBA,aAAA,WACA,KAAA,oBAEA,eAAA,SAAA,EAAA,GACA,KAAA,UAAA,KAAA,cACA,KAAA,UAAA,GAAA,GAKA,eAAA,WACA,KAAA,WACA,EAAA,QAAA,QAAA,IAAA,sBAAA,KAAA,WACA,KAAA,cAAA,KAAA,IAAA,KAAA,cAAA,KAAA,UAAA,KAGA,UAAA,WACA,KAAA,WACA,KAAA,iBACA,KAAA,sBACA,KAAA,UAAA,IAGA,gBAAA,WACA,MAAA,MAAA,cACA,EAAA,QAAA,QAAA,KAAA,gDAAA,KAAA,aAGA,EAAA,QAAA,QAAA,IAAA,uBAAA,KAAA,gBACA,KAAA,gBACA,KAAA,cAAA,KAAA,cAAA,YAsBA,EAAA,gBAIA,GAAA,YAAA,EACA,EAAA,IAAA,SAAA,IAAA,GAEA,SCnGA,SAAA,GA+NA,QAAA,GAAA,GACA,MAAA,GAAA,eAAA,eAKA,QAAA,MAnOA,GAAA,IACA,aAAA,EACA,IAAA,SAAA,EAAA,EAAA,GACA,GAAA,gBAAA,GAIA,MAAA,SAAA,IAAA,KAAA,KAAA,EAAA,EAAA,EAHA,IAAA,GAAA,MAAA,CACA,MAAA,GAAA,QAAA,IAAA,KAAA,KAAA,KAAA,GAAA,EAAA,IAKA,QAAA,QAAA,MAEA,QAAA,aAIA,MAAA,aAEA,gBAAA,WACA,KAAA,kBAAA,KAAA,iBAAA,OACA,QAAA,KAAA,iBAAA,KAAA,UAAA,wGAIA,KAAA,UACA,KAAA,mBAGA,KAAA,cAAA,mBAAA,OAAA,oBACA,KAAA,oBAIA,eAAA,WACA,MAAA,MAAA,qBACA,SAAA,KAAA,2BAAA,KAAA,YAGA,KAAA,kBAAA,EAEA,KAAA,eAEA,KAAA,yBAEA,KAAA,uBAEA,KAAA,yBAEA,KAAA,qBAEA,MAAA,qBAEA,iBAAA,WACA,KAAA,WAGA,KAAA,UAAA,EACA,KAAA,2BAIA,KAAA,kBAAA,KAAA,WAIA,KAAA,gBAAA,cAEA,KAAA,UAKA,iBAAA,WACA,KAAA,kBAEA,KAAA,UACA,KAAA,WAGA,KAAA,aACA,KAAA,cAMA,KAAA,kBACA,KAAA,iBAAA,EACA,KAAA,UACA,KAAA,MAAA,cAIA,iBAAA,WACA,KAAA,gBACA,KAAA,iBAGA,KAAA,UACA,KAAA,WAGA,KAAA,UACA,KAAA,YAIA,oBAAA,WACA,KAAA,oBAGA,iBAAA,WACA,KAAA,oBAGA,wBAAA,WACA,KAAA,oBAGA,qBAAA,WACA,KAAA,oBAGA,kBAAA,SAAA,GACA,GAAA,EAAA,UACA,KAAA,kBAAA,EAAA,WACA,EAAA,iBAAA,KAAA,KAAA,EAAA,WAIA,iBAAA,SAAA,GACA,GAAA,GAAA,KAAA,cAAA,EACA,IAAA,EAAA,CACA,GAAA,GAAA,KAAA,mBAAA,EACA,MAAA,YAAA,EAAA,MAAA,IAIA,cAAA,SAAA,GACA,MAAA,GAAA,cAAA,aAGA,mBAAA,SAAA,GACA,GAAA,EAAA,CAEA,GAAA,GAAA,KAAA,mBAKA,EAAA,KAAA,iBAAA,EAMA,OAJA,GAAA,YAAA,GAEA,KAAA,gBAAA,EAAA,GAEA,IAIA,kBAAA,SAAA,EAAA,GACA,GAAA,EAAA,CAKA,KAAA,gBAAA,IAKA,IAAA,GAAA,KAAA,iBAAA,EAUA,OARA,GACA,KAAA,aAAA,EAAA,GAEA,KAAA,YAAA,GAGA,KAAA,gBAAA,MAEA,IAGA,gBAAA,SAAA,GAEA,KAAA,sBAAA,GAEA,gBAAA,SAAA,IAGA,sBAAA,SAAA,GAEA,GAAA,GAAA,KAAA,EAAA,KAAA,KAEA,IAAA,EAEA,IAAA,GAAA,GADA,EAAA,EAAA,iBAAA,QACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,EAAA,IAAA,GAIA,yBAAA,SAAA,GAEA,UAAA,GAAA,UAAA,GACA,KAAA,oBAAA,EAAA,KAAA,aAAA,IAEA,KAAA,kBACA,KAAA,iBAAA,MAAA,KAAA,YAGA,WAAA,SAAA,EAAA,GACA,GAAA,GAAA,GAAA,kBAAA,SAAA,GACA,EAAA,KAAA,KAAA,EAAA,GACA,EAAA,cACA,KAAA,MACA,GAAA,QAAA,GAAA,WAAA,EAAA,SAAA,KAYA,GAAA,UAAA,EACA,EAAA,YAAA,EAIA,EAAA,KAAA,EACA,EAAA,OAAA,EACA,EAAA,IAAA,SAAA,KAAA,GAEA,SC/OA,SAAA,GAwFA,QAAA,GAAA,GACA,MAAA,GAAA,UAGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,GAAA,GAAA,CACA,KACA,EAAA,EAAA,UACA,EAAA,EAAA,aAAA,MAEA,IAAA,GAAA,SAAA,UAAA,kBAAA,EAAA,EACA,OAAA,UAAA,UAAA,YAAA,EAAA,GA/FA,GAIA,IAJA,OAAA,aAIA,WACA,EAAA,aAEA,GACA,sBAAA,EAMA,wBAAA,WAEA,GAAA,GAAA,KAAA,gBACA,IAAA,IAAA,KAAA,mBAAA,EAAA,KAAA,WAAA,CAGA,IADA,GAAA,GAAA,EAAA,MAAA,EAAA,GACA,GAAA,EAAA,SACA,GAAA,EAAA,QAAA,gBAAA,GACA,EAAA,EAAA,EAEA,IACA,KAAA,oBAAA,EAAA,KAIA,kBAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,KAAA,iBAAA,EAAA,GAAA,EACA,IAAA,IAAA,KAAA,mBAAA,EAAA,KAAA,UAAA,GAAA,CACA,GAAA,GAAA,EACA,IAAA,YAAA,OACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,GAAA,EAAA,YAAA,WAGA,GAAA,EAAA,WAEA,MAAA,oBAAA,EAAA,EAAA,KAGA,oBAAA,SAAA,EAAA,EAAA,GAGA,GAFA,EAAA,GAAA,KAAA,iBACA,EAAA,GAAA,GACA,EAAA,CAGA,OAAA,oBACA,EAAA,EAAA,EAAA,EAAA,MAEA,IAAA,GAAA,KAAA,QAAA,oBAAA,EACA,EACA,SAAA,kBAAA,EAAA,GAEA,KAAA,mBAAA,GAAA,KAAA,UAAA,IAAA,IAEA,eAAA,SAAA,GAGA,IADA,GAAA,GAAA,GAAA,KACA,EAAA,YACA,EAAA,EAAA,UAEA,OAAA,IAEA,mBAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,mBAAA,EACA,OAAA,GAAA,IAEA,mBAAA,SAAA,GACA,GAAA,OAAA,kBAAA,CACA,GAAA,GAAA,EAAA,KAAA,EAAA,KAAA,UAAA,EAAA,SACA,OAAA,GAAA,KAAA,EAAA,OAEA,MAAA,GAAA,aAAA,EAAA,mBAKA,IAoBA,GAAA,IAAA,SAAA,OAAA,GAEA,SC1GA,SAAA,GAUA,QAAA,GAAA,EAAA,GACA,GAAA,IAAA,UAAA,QAAA,gBAAA,WAAA,GAAA,CACA,EAAA,CACA,IAAA,GAAA,SAAA,cAGA,IAFA,EAAA,GAAA,EAAA,YAAA,EAAA,WAAA,aACA,EAAA,WAAA,aAAA,QAAA,IACA,EACA,KAAA,sCAGA,GAAA,EAAA,GACA,KAAA,sDAAA,CAGA,GAAA,EAAA,GAEA,EAAA,GAKA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,EAKA,QAAA,GAAA,GACA,EAAA,KACA,EAAA,GAAA,0BACA,GAAA,IAgBA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,GAAA,MAGA,QAAA,GAAA,GACA,MAAA,GAAA,GAzDA,GAAA,GAAA,EAAA,OA+BA,GA9BA,EAAA,QAiDA,IAYA,GAAA,uBAAA,EACA,EAAA,oBAAA,EAOA,OAAA,QAAA,EAKA,EAAA,QAAA,EAOA,IAAA,GAAA,SAAA,qBACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,MAAA,KAAA,IAIA,SC7FA,SAAA,GAEA,GAAA,IACA,oBAAA,SAAA,GACA,SAAA,YAAA,WAAA,IAEA,kBAAA,WAEA,GAAA,GAAA,KAAA,aAAA,cAAA,GACA,EAAA,GAAA,KAAA,EAAA,KAAA,cAAA,QACA,MAAA,UAAA,YAAA,SAAA,EAAA,GACA,GAAA,GAAA,GAAA,KAAA,EAAA,GAAA,EACA,OAAA,GAAA,OAMA,GAAA,IAAA,YAAA,KAAA,GAEA,SCpBA,SAAA,GA0KA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,GAAA,KAAA,EAAA,aAAA,QAAA,GAAA,IACA,OAAA,YAAA,EAAA,KAGA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CACA,IAAA,WACA,EAAA,SAAA,MAEA,OAAA,oBACA,EAAA,SAAA,KAOA,IAAA,GAAA,EAAA,EAAA,aACA,EAAA,EAAA,aAAA,EACA,IACA,EAAA,aAAA,EAAA,EAIA,IAAA,GAAA,EAAA,iBACA,IAAA,IAAA,SAAA,KAAA,CACA,GAAA,GAAA,SAAA,EAAA,IACA,EAAA,SAAA,KAAA,iBAAA,EACA,GAAA,SACA,EAAA,EAAA,EAAA,OAAA,GAAA,oBAGA,EAAA,aAAA,EAAA,IAIA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,SACA,EAAA,EAAA,cAAA,EAAA,EAAA,aACA,IAAA,GAAA,EAAA,cAAA,QAEA,OADA,GAAA,YAAA,EACA,EAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,YAAA,GAGA,QAAA,GAAA,EAAA,GACA,MAAA,GACA,EAAA,KAAA,EAAA,GADA,OAxNA,GACA,IADA,OAAA,aACA,EAAA,IAAA,SAAA,QACA,EAAA,EAAA,sBAIA,EAAA,QACA,EAAA,UACA,EAAA,uBACA,EAAA,SACA,EAAA,gBAEA,GAEA,WAAA,SAAA,GACA,GAAA,GAAA,KAAA,gBACA,EAAA,GAAA,KAAA,iBACA,IAAA,EAAA,CACA,KAAA,sBAAA,EACA,IAAA,GAAA,KAAA,mBAAA,EACA,IAAA,EAAA,OAAA,CACA,GAAA,GAAA,EAAA,cAAA,OACA,OAAA,UAAA,cAAA,WAAA,EAAA,EAAA,IAGA,GACA,KAGA,sBAAA,SAAA,GAEA,IAAA,GAAA,GAAA,EADA,EAAA,EAAA,iBAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,EAAA,EAAA,EAAA,KAAA,cAAA,SACA,KAAA,eACA,KAAA,oBAAA,EAAA,GACA,EAAA,WAAA,aAAA,EAAA,IAGA,oBAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,KAAA,EAAA,EAAA,IACA,QAAA,EAAA,MAAA,SAAA,EAAA,MACA,EAAA,aAAA,EAAA,KAAA,EAAA,QAIA,mBAAA,SAAA,GACA,GAAA,KACA,IAAA,EAEA,IAAA,GAAA,GADA,EAAA,EAAA,iBAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,YAAA,MAAA,IACA,EAAA,KAAA,EAIA,OAAA,IAOA,cAAA,WACA,KAAA,cACA,KAAA,cACA,KAAA,qBACA,KAAA,uBAKA,YAAA,WACA,KAAA,OAAA,KAAA,UAAA,GACA,KAAA,OAAA,QAAA,SAAA,GACA,EAAA,YACA,EAAA,WAAA,YAAA,MAIA,YAAA,WACA,KAAA,OAAA,KAAA,UAAA,EAAA,IAAA,EAAA,KACA,KAAA,OAAA,QAAA,SAAA,GACA,EAAA,YACA,EAAA,WAAA,YAAA,MAaA,mBAAA,WACA,GAAA,GAAA,KAAA,OAAA,OAAA,SAAA,GACA,OAAA,EAAA,aAAA,KAEA,EAAA,KAAA,iBACA,IAAA,EAAA,CACA,GAAA,GAAA,EAIA,IAHA,EAAA,QAAA,SAAA,GACA,GAAA,EAAA,GAAA,OAEA,EAAA,CACA,GAAA,GAAA,EAAA,EAAA,KAAA,cACA,GAAA,aAAA,EAAA,EAAA,eAIA,UAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,iBAAA,GAAA,QACA,EAAA,KAAA,iBACA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,iBAAA,GAAA,OACA,GAAA,EAAA,OAAA,GAEA,MAAA,GAAA,EAAA,OAAA,GAAA,GAWA,oBAAA,WACA,GAAA,GAAA,KAAA,cAAA,EACA,GAAA,EAAA,SAAA,OAEA,gBAAA,SAAA,GACA,GAAA,GAAA,GAEA,EAAA,IAAA,EAAA,IAAA,EAAA,IACA,EAAA,SAAA,GACA,MAAA,GAAA,EAAA,IAEA,EAAA,KAAA,OAAA,OAAA,EACA,GAAA,QAAA,SAAA,GACA,GAAA,EAAA,GAAA,QAGA,IAAA,GAAA,KAAA,OAAA,OAAA,EAIA,OAHA,GAAA,QAAA,SAAA,GACA,GAAA,EAAA,YAAA,SAEA,GAEA,cAAA,SAAA,GACA,GAAA,GAAA,KAAA,gBAAA,EACA,OAAA,MAAA,oBAAA,EAAA,IAEA,oBAAA,SAAA,EAAA,GACA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAGA,OAFA,GAAA,aAAA,EAAA,KAAA,aAAA,QACA,IAAA,GACA,KA2DA,EAAA,YAAA,UACA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,uBACA,EAAA,kBAIA,GAAA,IAAA,YAAA,OAAA,EACA,EAAA,kBAAA,GAEA,SCzOA,SAAA,GAIA,GACA,IADA,OAAA,aACA,EAAA,IAAA,SAAA,QACA,EAAA,EAAA,aAGA,MAEA,uBACA,qBACA,sBACA,cACA,aACA,kBACA,QAAA,SAAA,GACA,EAAA,EAAA,eAAA,GAGA,IAAA,IACA,gBAAA,WAEA,GAAA,GAAA,KAAA,UAAA,cAEA,MAAA,sBAAA,IAEA,sBAAA,SAAA,GAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,KAAA,WAAA,GAAA,IAEA,KAAA,eAAA,EAAA,QAEA,EAAA,KAAA,kBAAA,EAAA,OAAA,EAAA,MAAA,QAAA,KAAA,IACA,QAAA,KAAA,IAAA,SAKA,eAAA,SAAA,GACA,MAAA,IAAA,MAAA,EAAA,IAAA,MAAA,EAAA,IAAA,MAAA,EAAA,IAEA,kBAAA,SAAA,GACA,MAAA,GAAA,MAAA,IAEA,eAAA,SAAA,GACA,KAAA,EAAA,YAAA,CACA,GAAA,EAAA,gBACA,MAAA,GAAA,eAEA,GAAA,EAAA,WAEA,MAAA,GAAA,MAEA,gBAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,IACA,OAAA,UAAA,GACA,GAAA,EAAA,cACA,EAAA,EAAA,eAAA,GAGA,IAAA,IAAA,EAAA,EAAA,OAAA,EAAA,cACA,GAAA,eAAA,EAAA,EAAA,KAGA,oBAAA,SAAA,EAAA,GACA,GAAA,KAAA,eAAA,GAAA,CAGA,GAAA,GAAA,KAAA,kBAAA,EACA,GAAA,EAAA,IAAA,CAEA,IAAA,GAAA,IAEA,OAAA,UAAA,EAAA,EAAA,GAWA,QAAA,KACA,MAAA,MAAA,EAAA,MAXA,GAAA,GAAA,EAAA,gBAAA,OAAA,EAAA,EAGA,OAFA,GAAA,iBAAA,EAAA,GAEA,EAAA,QAYA,KAAA,EACA,eAAA,EACA,MAAA,WACA,EAAA,oBAAA,EAAA,SAOA,EAAA,EAAA,MAGA,GAAA,IAAA,YAAA,OAAA,GAEA,SC1GA,SAAA,GAIA,GAAA,IACA,eAAA,SAAA,GAEA,GAAA,GAAA,EAAA,EAAA,OACA,KAAA,GAAA,KAAA,GACA,YAAA,EAAA,MAAA,MACA,IACA,EAAA,EAAA,YAEA,EAAA,EAAA,MAAA,EAAA,IACA,EAAA,GAAA,EAAA,IAAA,IAIA,iBAAA,SAAA,GAEA,GAAA,GAAA,EAAA,OACA,IAAA,EAAA,CACA,GAAA,KACA,KAAA,GAAA,KAAA,GAEA,IAAA,GAAA,GADA,EAAA,EAAA,MAAA,KACA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,EAAA,GAAA,EAAA,EAGA,GAAA,QAAA,IAGA,qBAAA,SAAA,GACA,GAAA,EAAA,QAAA,CAEA,GAAA,GAAA,EAAA,gBACA,KAAA,GAAA,KAAA,GAAA,QAEA,IAAA,GAAA,GADA,EAAA,EAAA,MAAA,KACA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,EAAA,KAAA,GAIA,GAAA,EAAA,QAAA,CAEA,GAAA,GAAA,EAAA,gBACA,KAAA,GAAA,KAAA,GAAA,QACA,EAAA,KAAA,GAGA,GAAA,EAAA,SAAA,CAEA,GAAA,GAAA,EAAA,iBACA,KAAA,GAAA,KAAA,GAAA,SACA,EAAA,KAAA,KAIA,kBAAA,SAAA,EAAA,GAEA,GAAA,GAAA,EAAA,OACA,KAEA,KAAA,kBAAA,EAAA,EAAA,GAEA,EAAA,WAAA,KAAA,aAAA,KASA,kBAAA,SAAA,EAAA,GAEA,EAAA,QAAA,EAAA,WAGA,KAAA,GAAA,KAAA,GAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,KAAA,yBAAA,EACA,UAAA,EAAA,QAAA,IAAA,SAAA,IACA,EAAA,QAAA,GAAA,GAEA,SAAA,EAAA,KACA,EAAA,GAAA,KAAA,mBAAA,MAIA,mBAAA,SAAA,GACA,GAAA,GAAA,gBAAA,IACA,EAAA,EAAA,MAAA,CACA,OAAA,UAAA,EAAA,EAAA,MAGA,yBAAA,SAAA,GACA,MAAA,gBAAA,IACA,GAAA,SAAA,EAAA,QACA,EAAA,QAFA,QAKA,aAAA,SAAA,GACA,GAAA,KACA,KAAA,GAAA,KAAA,GACA,EAAA,EAAA,eAAA,CAEA,OAAA,IAEA,uBAAA,SAAA,GACA,GAAA,GAAA,KAAA,UAEA,EAAA,EAAA,IACA,EAAA,EAAA,aACA,GAAA,GAAA,EAAA,GAEA,OAAA,eAAA,EAAA,GACA,IAAA,WACA,GAAA,GAAA,KAAA,EAIA,OAHA,IACA,EAAA,UAEA,KAAA,IAEA,IAAA,SAAA,GACA,GAAA,GAAA,KAAA,EACA,IAAA,EAEA,WADA,GAAA,SAAA,EAIA,IAAA,GAAA,KAAA,EAIA,OAHA,MAAA,GAAA,EACA,KAAA,yBAAA,EAAA,EAAA,GAEA,GAEA,cAAA,KAGA,wBAAA,SAAA,GACA,GAAA,GAAA,EAAA,aACA,IAAA,GAAA,EAAA,OACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,uBAAA,EAIA,IAAA,GAAA,EAAA,cACA,IAAA,GAAA,EAAA,OACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,uBAAA,IASA,GAAA,IAAA,YAAA,WAAA,GAEA,SCnKA,SAAA,GAIA,GAAA,GAAA,aACA,EAAA,OAIA,GAEA,yBAAA,SAAA,GAEA,KAAA,cAAA,EAAA,aAEA,KAAA,cAAA,EAAA,wBAGA,kBAAA,SAAA,EAAA,GAEA,GAAA,GAAA,KAAA,aAAA,EACA,IAAA,EAMA,IAAA,GAAA,GAJA,EAAA,EAAA,UAAA,EAAA,YAEA,EAAA,EAAA,MAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAKA,GAHA,EAAA,EAAA,GAAA,OAGA,GAAA,SAAA,EAAA,GAAA,CAMA,IACA,GAAA,GAAA,SAAA,EAAA,GACA,MAAA,GACA,GAAA,EAIA,IACA,EAAA,GAAA,QAAA,OAQA,6BAAA,WAKA,IAAA,GAAA,GAHA,EAAA,KAAA,UAAA,oBAEA,EAAA,KAAA,WACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,oBAAA,EAAA,QACA,EAAA,EAAA,MAAA,EAAA,QAKA,oBAAA,SAAA,GACA,OAAA,KAAA,UAAA,IAAA,QAAA,EAAA,MAAA,EAAA,IAIA,WACA,KAAA,EACA,UAAA,EACA,YAAA,EACA,SAAA,EACA,UAAA,EACA,gBAAA,GAMA,GAAA,UAAA,GAAA,EAIA,EAAA,IAAA,YAAA,WAAA,GAEA,SCxFA,SAAA,GAGA,GAAA,GAAA,EAAA,IAAA,YAAA,OAEA,EAAA,GAAA,oBACA,EAAA,EAAA,cAIA,GAAA,eAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,oBAAA,EAAA,EAAA,IACA,EAAA,KAAA,EAAA,EAAA,EAAA,GAIA,IAAA,IACA,OAAA,EACA,cAAA,WACA,MAAA,MAAA,cAAA,aAEA,gBAAA,WACA,GAAA,GAAA,KAAA,eACA,OAAA,IAAA,SAAA,gBAAA,IAEA,uBAAA,SAAA,GACA,IACA,EAAA,gBAAA,KAAA,SAMA,GAAA,IAAA,YAAA,IAAA,GAEA,SCnCA,SAAA,GAoOA,QAAA,GAAA,GACA,IAAA,OAAA,UAAA,CACA,GAAA,GAAA,OAAA,eAAA,EACA,GAAA,UAAA,EACA,EAAA,KACA,EAAA,UAAA,OAAA,eAAA,KArOA,GAAA,GAAA,EAAA,IACA,EAAA,EAAA,OACA,EAAA,EAAA,OAIA,GAEA,SAAA,SAAA,EAAA,GAEA,KAAA,eAAA,EAAA,GAEA,KAAA,kBAAA,EAAA,GAEA,KAAA,sBAGA,eAAA,SAAA,EAAA,GAEA,GAAA,GAAA,EAAA,uBAAA,GAEA,EAAA,KAAA,sBAAA,EAEA,MAAA,sBAAA,EAAA,GAEA,KAAA,UAAA,KAAA,gBAAA,EAAA,GAEA,KAAA,qBAAA,EAAA,IAGA,sBAAA,SAAA,EAAA,GAGA,EAAA,QAAA,KAEA,KAAA,kBAAA,EAAA,GAEA,KAAA,kBAAA,EAAA,GAEA,KAAA,eAAA,GAEA,KAAA,iBAAA,IAGA,gBAAA,SAAA,EAAA,GAEA,KAAA,gBAAA,EAAA,EAEA,IAAA,GAAA,KAAA,YAAA,EAAA,EAGA,OADA,GAAA,GACA,GAGA,gBAAA,SAAA,EAAA,GAEA,KAAA,cAAA,UAAA,EAAA,GAEA,KAAA,cAAA,UAAA,EAAA,GAEA,KAAA,cAAA,UAAA,EAAA,GAEA,KAAA,cAAA,aAAA,EAAA,GAEA,KAAA,cAAA,sBAAA,EAAA,GAEA,KAAA,cAAA,iBAAA,EAAA,IAIA,qBAAA,SAAA,EAAA,GAEA,KAAA,qBAAA,KAAA,WACA,KAAA,wBAAA,KAAA,WAEA,KAAA,uBAAA,KAAA,iBAEA,KAAA,gBAEA,KAAA,oBAAA,MAEA,KAAA,+BAEA,KAAA,kBAKA,KAAA,oBAEA,OAAA,mBACA,SAAA,UAAA,YAAA,KAAA,kBAAA,EAAA,GAGA,KAAA,UAAA,kBACA,KAAA,UAAA,iBAAA,OAMA,mBAAA,WACA,GAAA,GAAA,KAAA,aAAA,cACA,KACA,OAAA,GAAA,KAAA,OAKA,sBAAA,SAAA,GACA,GAAA,GAAA,KAAA,kBAAA,EACA,KAAA,EAAA,CAEA,GAAA,GAAA,YAAA,mBAAA,EAEA,GAAA,KAAA,cAAA,GAEA,EAAA,GAAA,EAEA,MAAA,IAGA,kBAAA,SAAA,GACA,MAAA,GAAA,IAIA,cAAA,SAAA,GACA,GAAA,EAAA,YACA,MAAA,EAEA,IAAA,GAAA,OAAA,OAAA,EAkBA,OAfA,GAAA,QAAA,EAAA,SAAA,GAaA,KAAA,YAAA,EAAA,EAAA,EAAA,SAAA,IAAA,QAEA,GAGA,YAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,SAAA,GACA,MAAA,GAAA,GAAA,MAAA,KAAA,GAEA,GAAA,GAAA,WAEA,MADA,MAAA,WAAA,EACA,EAAA,GAAA,MAAA,KAAA,aAKA,cAAA,SAAA,EAAA,EAAA,GAEA,GAAA,GAAA,EAAA,MAEA,GAAA,GAAA,KAAA,YAAA,EAAA,EAAA,KAIA,kBAAA,SAAA,EAAA,GACA,GAAA,IACA,UAAA,KAAA,WAGA,EAAA,KAAA,kBAAA,EACA,KACA,EAAA,QAAA,GAGA,YAAA,SAAA,EAAA,KAAA,WAEA,KAAA,KAAA,SAAA,gBAAA,EAAA,IAGA,kBAAA,SAAA,GACA,GAAA,GAAA,EAAA,QAAA,KAAA,EACA,MAAA,EAEA,IAAA,GAAA,KAAA,kBAAA,EACA,OAAA,GAAA,QACA,KAAA,kBAAA,EAAA,QAAA,SADA,SASA,IAIA,GAAA,YADA,OAAA,UACA,SAAA,EAAA,GAIA,MAHA,IAAA,GAAA,IAAA,IACA,EAAA,UAAA,GAEA,GAGA,SAAA,EAAA,GACA,GAAA,GAAA,GAAA,IAAA,EAAA,CACA,GAAA,GAAA,OAAA,OAAA,EACA,GAAA,EAAA,EAAA,GAEA,MAAA,IAoBA,EAAA,YAAA,UAAA,GAEA,SClPA,SAAA,GAsKA,QAAA,GAAA,GACA,MAAA,UAAA,SAAA,GAAA,EAAA,EAGA,QAAA,KACA,MAAA,GAAA,OAAA,EAAA,GAAA,EAAA,GASA,QAAA,GAAA,GACA,EAAA,aAAA,EACA,eAAA,OAAA,EACA,YAAA,iBAAA,WACA,EAAA,iBAAA,GACA,EAAA,aAAA,EACA,EAAA,UAnKA,GAAA,IAGA,KAAA,SAAA,GACA,EAAA,UACA,EAAA,WACA,EAAA,KAAA,KAKA,QAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,UAAA,EAAA,QAAA,KAMA,OALA,KACA,EAAA,GAAA,KAAA,GACA,EAAA,QAAA,MAAA,EACA,EAAA,QAAA,GAAA,GAEA,IAAA,KAAA,QAAA,IAGA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,GAAA,QAAA,EAKA,OAJA,IAAA,GAAA,SAAA,SAAA,KACA,GAAA,YAAA,WAAA,YAAA,MACA,EAAA,OAAA,KAEA,GAIA,GAAA,SAAA,GACA,GAAA,GAAA,KAAA,OAAA,EACA,KACA,EAAA,QAAA,WAAA,EACA,KAAA,gBAAA,GACA,KAAA,UAIA,OAAA,SAAA,GACA,GAAA,GAAA,KAAA,QAAA,EACA,IAAA,IAAA,EAIA,MAAA,GAAA,GAAA,SAGA,MAAA,WAEA,GAAA,GAAA,KAAA,aAIA,OAHA,IACA,EAAA,QAAA,MAAA,KAAA,GAEA,KAAA,YACA,KAAA,SACA,GAFA,QAMA,YAAA,WACA,MAAA,MAGA,SAAA,WACA,OAAA,KAAA,aAAA,KAAA,WAGA,QAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IACA,EAAA,EAAA,IAAA,IACA,GAAA,EAAA,UAAA,EAAA,QAAA,UACA,MAGA,QAAA,GAGA,gBAAA,SAAA,GACA,EAAA,KAAA,IAGA,MAAA,WAEA,IAAA,KAAA,SAAA,CAGA,EAAA,QACA,QAAA,KAAA,uBAAA,EAAA,QAEA,KAAA,UAAA,CAEA,KADA,GAAA,GACA,EAAA,QACA,EAAA,EAAA,QACA,EAAA,QAAA,GAAA,KAAA,GACA,EAAA,QAAA,IAEA;KAAA,UAAA,IAGA,MAAA,WACA,KAAA,QAOA,eAAA,SAAA,IACA,eAAA,oBAAA,UACA,eAAA,OAAA,GAEA,SAAA,QACA,sBAAA,KAAA,sBAGA,iBAAA,SAAA,GACA,GACA,EAAA,KAAA,IAIA,oBAAA,WACA,GAAA,EAEA,IADA,GAAA,GACA,EAAA,SACA,EAAA,EAAA,YAMA,aAAA,GAIA,KACA,KACA,KACA,KACA,IAYA,UAAA,iBAAA,qBAAA,WACA,eAAA,OAAA,IAcA,EAAA,SAAA,EACA,EAAA,MAAA,EACA,EAAA,UAAA,EAAA,iBAAA,GACA,SClMA,SAAA,GAIA,QAAA,GAAA,EAAA,GACA,GACA,SAAA,KAAA,YAAA,GACA,EAAA,IACA,GACA,IAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,OAAA,CAEA,IAAA,GAAA,GAAA,EADA,EAAA,SAAA,yBACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,SAAA,cAAA,QACA,EAAA,IAAA,SACA,EAAA,KAAA,EACA,EAAA,YAAA,EAEA,GAAA,EAAA,OACA,IACA,IAtBA,GAAA,GAAA,EAAA,gBA2BA,GAAA,OAAA,EACA,EAAA,eAAA,GAEA,SChCA,SAAA,GA2GA,QAAA,GAAA,GACA,MAAA,SAAA,YAAA,mBAAA,IAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,QAAA,MAAA,EA5GA,GAAA,GAAA,EAAA,OACA,EAAA,EAAA,IACA,EAAA,EAAA,MACA,EAAA,EAAA,iBACA,EAAA,EAAA,uBACA,EAAA,EAAA,oBAIA,EAAA,EAAA,OAAA,OAAA,YAAA,YAEA,gBAAA,WACA,KAAA,aAAA,SACA,KAAA,QAIA,KAAA,WAEA,KAAA,KAAA,KAAA,aAAA,QACA,KAAA,QAAA,KAAA,aAAA,WACA,EAAA,KAAA,MAEA,KAAA,gBAEA,KAAA,qBAOA,kBAAA,WACA,KAAA,YACA,KAAA,oBAAA,KAAA,OACA,KAAA,mBACA,KAAA,uBAGA,EAAA,GAAA,OAGA,UAAA,WAGA,EAAA,KAAA,WAAA,EAAA,KAAA,UACA,QAAA,KAAA,sGACA,KAAA,KACA,KAAA,SAEA,KAAA,SAAA,KAAA,KAAA,KAAA,SACA,KAAA,YAAA,GAGA,oBAAA,SAAA,GACA,MAAA,GAAA,GAAA,QAEA,EAAA,EAAA,MAEA,KAAA,eAAA,IAEA,IAIA,eAAA,SAAA,GAEA,KAAA,aAAA,cAAA,KAAA,WACA,KAAA,UAAA,EAEA,QAAA,KAIA,oBAAA,WACA,MAAA,MAAA,iBAMA,gBAAA,WACA,MAAA,GAAA,QAAA,KAAA,KAAA,kBAAA,KAAA,YAGA,cAAA,WACA,KAAA,iBAAA,EACA,KAAA,WAAA,WACA,KAAA,iBAAA,EACA,KAAA,qBACA,KAAA,SASA,GAAA,QAAA,EAAA,YAAA,GAcA,EAAA,WACA,SAAA,KAAA,gBAAA,cACA,SAAA,cACA,GAAA,aAAA,iBAAA,SAAA,OAMA,SAAA,gBAAA,mBAAA,UAAA,KAEA,SCnGA,WAEA,GAAA,GAAA,SAAA,cAAA,kBACA,GAAA,aAAA,OAAA,gBACA,EAAA,aAAA,UAAA,YACA,EAAA,OAEA,QAAA,gBAEA,gBAAA,WACA,KAAA,OAAA,KAAA,gBAAA,KAAA,aAGA,QAAA,iBAAA,WACA,KAAA,MAAA,KACA,KAAA,aAAA,OAAA,IAGA,KAAA,MAAA,WAIA,KAAA,sBAAA,KAAA,YAGA,KAAA,KAAA,qBAEA,KAAA,QAGA,WAAA,WACA,GAAA,GAAA,OAAA,OAAA,QAAA,IAAA,YAAA,QACA,EAAA,IACA,GAAA,eAAA,WAAA,MAAA,GAAA,MAEA,IAAA,GAAA,GAAA,oBACA,EAAA,EAAA,cAKA,OAJA,GAAA,eAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,oBAAA,EAAA,EAAA,IACA,EAAA,KAAA,EAAA,EAAA,EAAA,IAEA","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);