// Path: backport/src/java/util/function/Consumer.java
// public interface Consumer<T> {
//   public void accept(T element);
// }
// 
// Path: backport/src/java/util/function/Function.java
// public interface Function<T, U> {
//   public U apply(T element);
// }
// 
// Path: backport/src/java/util/stream/Collectors.java
// public class Collectors {
//   public static <T, K, V> Collector<T, ?, Map<K,V>> toMap(Function<? super T, ? extends K> keyMapper,
//                                                           Function<? super T, ? extends V> valueMapper) {
//     return stream -> {
//       HashMap<K, V> map = new HashMap<>();
//       stream.forEach(element -> {
//         map.put(keyMapper.apply(element), valueMapper.apply(element));
//       });
//       return map;
//     };
//   }
// 
//   public static <T> Collector<T, ?, Set<T>> toSet() {
//     return toCollection(HashSet::new);
//   }
//   
//   public static <T> Collector<T, ?, List<T>> toList() {
//     return toCollection(ArrayList::new);
//   }
//   
//   private static <T, C extends Collection<T>> Collector<T, ?, C> toCollection(Supplier<C> collectionFactory) {
//     return stream -> {
//       C collection = collectionFactory.get();
//       stream.forEach(collection::add);
//       return collection;
//     };
//   }
// }
// 
// Path: src/jdk/internal/jimage/ImageModules.java
// enum Loader {
//     BOOT_LOADER(0, "bootmodules"),
//     EXT_LOADER(1, "extmodules"),
//     APP_LOADER(2, "appmodules");  // ## may be more than 1 loader
// 
//     final int id;
//     final String name;
//     Loader(int id, String name) {
//         this.id = id;
//         this.name = name;
//     }
// 
//     String getName() {
//         return name;
//     }
//     static Loader get(int id) {
//         switch (id) {
//             case 0: return BOOT_LOADER;
//             case 1: return EXT_LOADER;
//             case 2: return APP_LOADER;
//             default:
//                 throw new IllegalArgumentException("invalid loader id: " + id);
//         }
//     }
//     public int id() { return id; }
// }
// 
// Path: src/jdk/internal/jimage/ImageModules.java
// public class ModuleIndex {
//     final Map<String, Integer> moduleOffsets = new LinkedHashMap<>();
//     final Map<String, List<Integer>> packageOffsets = new HashMap<>();
//     final int size;
//     public ModuleIndex(Set<String> mods, BasicImageWriter writer) {
//         // module name offsets
//         writer.addLocation(MODULES_ENTRY, 0, 0, mods.size() * 4);
//         long offset = mods.size() * 4;
//         for (String mn : mods) {
//             moduleOffsets.put(mn, writer.addString(mn));
//             List<Integer> poffsets = localPkgs.get(mn).stream()
//                     .map(pn -> pn.replace('.', '/'))
//                     .map(writer::addString)
//                     .collect(Collectors.toList());
//             // package name offsets per module
//             String entry = mn + "/" + PACKAGES_ENTRY;
//             int bytes = poffsets.size() * 4;
//             writer.addLocation(entry, offset, 0, bytes);
//             offset += bytes;
//             packageOffsets.put(mn, poffsets);
//         }
//         this.size = (int) offset;
//     }
// 
//     void writeTo(DataOutputStream out) throws IOException {
//         for (int moffset : moduleOffsets.values()) {
//             out.writeInt(moffset);
//         }
//         for (String mn : moduleOffsets.keySet()) {
//             for (int poffset : packageOffsets.get(mn)) {
//                 out.writeInt(poffset);
//             }
//         }
//     }
// 
//     int size() {
//         return size;
//     }
// }


import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteOrder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
import jdk.internal.jimage.ImageModules.Loader;
import jdk.internal.jimage.ImageModules.ModuleIndex;
                    .map(this::toPackage)
                    .distinct()
                    .collect(Collectors.toSet());
            modules.setPackages(mn, pkgs);
        }
    }

    private String toPackage(String name) {
        int index = name.lastIndexOf('/');
        if (index > 0) {
            return name.substring(0, index).replace('/', '.');
        } else {
            // ## unnamed package
            System.err.format("Warning: %s in unnamed package%n", name);
            return "";
        }
    }

    private void writeModule(Archive archive,
                             OutputStream out)
        throws IOException
    {
          Consumer<Archive.Entry> consumer = archive.defaultImageWriter(root, out);
          archive.visitEntries(consumer);
    }


    static class Compressor {
        public static byte[] compress(byte[] bytesIn) {
            Deflater deflater = new Deflater();
// Path: backport/src/java/util/function/Consumer.java
// public interface Consumer<T> {
//   public void accept(T element);
// }
// 
// Path: backport/src/java/util/function/Function.java
// public interface Function<T, U> {
//   public U apply(T element);
// }
// 
// Path: backport/src/java/util/stream/Collectors.java
// public class Collectors {
//   public static <T, K, V> Collector<T, ?, Map<K,V>> toMap(Function<? super T, ? extends K> keyMapper,
//                                                           Function<? super T, ? extends V> valueMapper) {
//     return stream -> {
//       HashMap<K, V> map = new HashMap<>();
//       stream.forEach(element -> {
//         map.put(keyMapper.apply(element), valueMapper.apply(element));
//       });
//       return map;
//     };
//   }
// 
//   public static <T> Collector<T, ?, Set<T>> toSet() {
//     return toCollection(HashSet::new);
//   }
//   
//   public static <T> Collector<T, ?, List<T>> toList() {
//     return toCollection(ArrayList::new);
//   }
//   
//   private static <T, C extends Collection<T>> Collector<T, ?, C> toCollection(Supplier<C> collectionFactory) {
//     return stream -> {
//       C collection = collectionFactory.get();
//       stream.forEach(collection::add);
//       return collection;
//     };
//   }
// }
// 
// Path: src/jdk/internal/jimage/ImageModules.java
// enum Loader {
//     BOOT_LOADER(0, "bootmodules"),
//     EXT_LOADER(1, "extmodules"),
//     APP_LOADER(2, "appmodules");  // ## may be more than 1 loader
// 
//     final int id;
//     final String name;
//     Loader(int id, String name) {
//         this.id = id;
//         this.name = name;
//     }
// 
//     String getName() {
//         return name;
//     }
//     static Loader get(int id) {
//         switch (id) {
//             case 0: return BOOT_LOADER;
//             case 1: return EXT_LOADER;
//             case 2: return APP_LOADER;
//             default:
//                 throw new IllegalArgumentException("invalid loader id: " + id);
//         }
//     }
//     public int id() { return id; }
// }
// 
// Path: src/jdk/internal/jimage/ImageModules.java
// public class ModuleIndex {
//     final Map<String, Integer> moduleOffsets = new LinkedHashMap<>();
//     final Map<String, List<Integer>> packageOffsets = new HashMap<>();
//     final int size;
//     public ModuleIndex(Set<String> mods, BasicImageWriter writer) {
//         // module name offsets
//         writer.addLocation(MODULES_ENTRY, 0, 0, mods.size() * 4);
//         long offset = mods.size() * 4;
//         for (String mn : mods) {
//             moduleOffsets.put(mn, writer.addString(mn));
//             List<Integer> poffsets = localPkgs.get(mn).stream()
//                     .map(pn -> pn.replace('.', '/'))
//                     .map(writer::addString)
//                     .collect(Collectors.toList());
//             // package name offsets per module
//             String entry = mn + "/" + PACKAGES_ENTRY;
//             int bytes = poffsets.size() * 4;
//             writer.addLocation(entry, offset, 0, bytes);
//             offset += bytes;
//             packageOffsets.put(mn, poffsets);
//         }
//         this.size = (int) offset;
//     }
// 
//     void writeTo(DataOutputStream out) throws IOException {
//         for (int moffset : moduleOffsets.values()) {
//             out.writeInt(moffset);
//         }
//         for (String mn : moduleOffsets.keySet()) {
//             for (int poffset : packageOffsets.get(mn)) {
//                 out.writeInt(poffset);
//             }
//         }
//     }
// 
//     int size() {
//         return size;
//     }
// }


// Path: src/jdk/internal/jimage/ImageFile.java
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteOrder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
import jdk.internal.jimage.ImageModules.Loader;
import jdk.internal.jimage.ImageModules.ModuleIndex;

                    .map(this::toPackage)
                    .distinct()
                    .collect(Collectors.toSet());
            modules.setPackages(mn, pkgs);
        }
    }

    private String toPackage(String name) {
        int index = name.lastIndexOf('/');
        if (index > 0) {
            return name.substring(0, index).replace('/', '.');
        } else {
            // ## unnamed package
            System.err.format("Warning: %s in unnamed package%n", name);
            return "";
        }
    }

    private void writeModule(Archive archive,
                             OutputStream out)
        throws IOException
    {
          Consumer<Archive.Entry> consumer = archive.defaultImageWriter(root, out);
          archive.visitEntries(consumer);
    }


    static class Compressor {
        public static byte[] compress(byte[] bytesIn) {
            Deflater deflater = new Deflater();
            deflater.setInput(bytesIn);