@NotNull
    @Override
    public Iterable<JavaFileObject> list(final String relPath, Set<JavaFileObject.Kind> kinds, boolean recurse) throws IOException{
      final Collection<ZipEntry> entries = myPaths.get(relPath);
      if (entries == null || entries.isEmpty()) {
        return Collections.emptyList();
      }
      Iterable<ZipEntry> entriesIterable = entries;
      if (recurse) {
        if (relPath.isEmpty()) {
          entriesIterable = Iterators.flat(myPaths.values());
        }
        else {
          final Iterable<Map.Entry<String, Collection<ZipEntry>>> baseIterable = Iterators.filter(myPaths.entrySet(), new BooleanFunction<Map.Entry<String, Collection<ZipEntry>>>() {
            @Override
            public boolean fun(Map.Entry<String, Collection<ZipEntry>> e) {
              final String dir = e.getKey();
              return dir.startsWith(relPath) && (dir.length() == relPath.length() || dir.charAt(relPath.length()) == '/');
            }
          });
          entriesIterable = Iterators.flat(Iterators.map(baseIterable, new Function<Map.Entry<String, Collection<ZipEntry>>, Iterable<ZipEntry>>() {
            @Override
            public Iterable<ZipEntry> fun(Map.Entry<String, Collection<ZipEntry>> e) {
              return e.getValue();
            }
          }));
        }
      }
      return Iterators.map(Iterators.filter(entriesIterable, ourEntryFilter.getFor(kinds)), myToFileObjectConverter);
    }
@NotNull
    @Override
    public Iterable<JavaFileObject> list(final String relPath, Set<JavaFileObject.Kind> kinds, boolean recurse)