anchor.diff:      return _leaveCurrentRoute(startingFrom, event);
     }
   
  -  Iterable<Route> _matchingTreePath(String path, Route baseRoute) {
  -    List<Route> treePath = <Route>[];
  +  Iterable<_Match> _matchingTreePath(String path, Route baseRoute) {
  +    List<_Match> treePath = <_Match>[];
       Route matchedRoute;
       do {
         matchedRoute = null;
  
positive.code:     Route cmpBase = baseRoute;
      var tail = path;
      // Skip all routes that are unaffected by this path.
      treePath = treePath.skipWhile((Route matchedRoute) {
        var match = _getMatch(matchedRoute, tail);
        var skip = cmpBase._currentRoute == matchedRoute &&
            !_paramsChanged(cmpBase, match);
        if (skip) {
          cmpBase = matchedRoute;
          tail = match.tail;
        }
        return skip;
      });
  
negative.code:     });
    }
  
    List<Future<bool>> _preEnter(String tail, Iterable<_Match> treePath) {
      List<Future<bool>> preEnterFutures = <Future<bool>>[];
      treePath.forEach((_Match matchedRoute) {
        tail = matchedRoute.urlMatch.tail;
        var preEnterEvent = new RoutePreEnterEvent(tail, matchedRoute.urlMatch.parameters, matchedRoute.route);
        matchedRoute.route._onPreEnterController.add(preEnterEvent);
        preEnterFutures.addAll(preEnterEvent._allowEnterFutures);
      });
      return preEnterFutures;
    }
  
    Future<bool> _processNewRoute(Route startingFrom, Iterable<_Match> treePath, String path) {
      return _leaveOldRoutes(startingFrom, treePath).then((bool allowed) {
        if (allowed) {
          var base = startingFrom;
          var tail = path;
          treePath.forEach((_Match matchedRoute) {
            tail = matchedRoute.urlMatch.tail;
            var event = new RouteEnterEvent(matchedRoute.urlMatch.match,
                matchedRoute.urlMatch.parameters, matchedRoute.route);
            _unsetAllCurrentRoutes(base);
            base._currentRoute = matchedRoute.route;
            base._currentRoute._lastEvent = event;
            matchedRoute.route._onEnterController.add(event);
            base = matchedRoute.route;
          });
          return true;
        }
  