anchor.diff:    Uri uri;
     bool isHashPath = false;
   
  +  /// hash for routing for this uri ('...#/...?...#XXX')
     String get hash {
       if (uri.fragment.length == 0) return '';
       return '#' + uri.fragment;
     }
   
  +  /// path for routing for this uri ('...#/XXX?...#...')
     String get path {
       return uri.path;
     }
   
  +  /// query string for routing for this uri ('...#/...?XXX#...')
     String get search {
       if (uri.query.length == 0) return '';
       return '?' + uri.query;
  
positive.code:     return map;
    }
  
    Uri replacePathAndQuery(Uri uri, String pathAndQuery) {
      String path = pathAndQuery;
      String query = "";
      int index = pathAndQuery.indexOf("?");
      if (index != -1) {
        path = pathAndQuery.substring(0, index); // get rid of query
        query = pathAndQuery.substring(index + 1); // just the query
      }
      uri = uri.replace(path: path, query: query);
      return uri;
    }
  
    /// parseUrl(location, mode) - Augment the native URL() constructor to get info about hash paths
    /// mode = "auto|hash|pushstate"
    ///
    /// Example parseUrl('http://domain.com/other/path?queryParam3=false#/example/path?queryParam1=true&queryParam2=example%20string#middle', 'auto')
    ///
    /// returns {
    ///   path: '/example/path',
  
negative.code:         // '#/'
          // hash path
          isHashPath = true;
          uri = _replacePathAndQuery(uri, uri.fragment);
        } else if (uri.fragment.startsWith('!/')) {
          // '#!/'
          // hashbang path
          isHashPath = true;
          uri = _replacePathAndQuery(uri, uri.fragment.substring(1));
        } else if (isHashPath) {
          // still use the hash if mode="hash"
          if (uri.fragment.length == 0) {
            uri = uri.replace(path: '/', query: '');
          } else {
            uri = _replacePathAndQuery(uri, uri.fragment);
          }
        }
  
  