anchor.diff:        result[baseAsset] = variants;
   
         // Find asset variants
  -      String assetPath = path.join(baseAsset.base, baseAsset.key);
  +      String assetPath = path.join(baseAsset.base, baseAsset.relativePath);
         String assetFilename = path.basename(assetPath);
         Directory assetDir = new Directory(path.dirname(assetPath));
   
  
positive.code: }
  
  ZipEntry _createAssetEntry(_Asset asset) {
    String source = asset.source ?? asset.key;
    File file = new File('${asset.base}/$source');
    if (!file.existsSync()) {
      printError('Cannot find asset "$source" in directory "${path.absolute(asset.base)}".');
      return null;
    }
    return new ZipEntry.fromFile(asset.key, file);
  }
  
  ZipEntry _createAssetManifest(Map<_Asset, List<_Asset>> assets) {
  
negative.code: const String _kFontSetRoboto = 'roboto';
  
  class _Asset {
    _Asset({ this.base, String assetEntry, this.relativePath, this.source }) {
      this._assetEntry = assetEntry;
    }
  
    String _assetEntry;
  
    final String base;
  
    /// The entry to list in the generated asset manifest.
    String get assetEntry => _assetEntry ?? relativePath;
  
    /// Where the resource is on disk realtive to [base].
    final String relativePath;
  
    final String source;
  
    /// The delta between what the assetEntry is and the relativePath (e.g.,
    /// packages/material_gallery).
    String get symbolicPrefix {
      if (_assetEntry == null || _assetEntry == relativePath)
        return null;
      int index = _assetEntry.indexOf(relativePath);
      return index == -1 ? null : _assetEntry.substring(0, index);
    }
  
    @override
    String toString() => 'asset: $assetEntry';
  }
  
  Map<String, dynamic> _readMaterialFontsManifest() {
  