// Path: src/main/java/net/nandgr/cba/cli/CliHelper.java
// public class CliHelper {
// 
//   private static CommandLineParser commandLineParser = new DefaultParser();
//   private static CommandLine commandLine;
//   private static Rules rules;
// 
//   private CliHelper() {
//     throw new IllegalAccessError("Cannot instantiate this utility class.");
//   }
// 
//   public static void parseCliArguments(String[] args) throws ParseException {
//     commandLine = commandLineParser.parse(CliArguments.getOptions(), args);
//   }
// 
//   public static String getPathToAnalyze() {
//     return commandLine.getOptionValue("a");
//   }
// 
//   public static int getMaxThreads() {
//     return Integer.parseInt(commandLine.getOptionValue("t", CliArguments.MAX_THREADS_DEFAULT));
//   }
// 
//   public static boolean hasOutputDir() {
//     return commandLine.hasOption("o");
//   }
// 
//   public static String getOutputDir() {
//     return commandLine.getOptionValue("o", CliArguments.OUTPUT_DEFAULT);
//   }
// 
//   public static boolean hasMaxItemsInReport() {
//     return commandLine.hasOption("i");
//   }
// 
//   public static int getMaxItemsInReport() {
//     return Integer.parseInt(commandLine.getOptionValue("i", CliArguments.MAX_ITEMS_IN_REPORT_DEFAULT));
//   }
// 
//   public static boolean hasChecks() {
//     return commandLine.hasOption("c");
//   }
// 
//   public static String[] getChecks() {
//     return commandLine.getOptionValues("c");
//   }
// 
//   public static boolean hasCustomFile() {
//     return commandLine.hasOption("f");
//   }
// 
//   public static String getCustomFile() {
//     return commandLine.getOptionValue("f");
//   }
// 
//   public static void printHelp() {
//     HelpFormatter helpFormatter = new HelpFormatter();
//     helpFormatter.printHelp("java -jar cba-cli.jar [OPTIONS] -a DIRECTORY_TO_ANALYZE", CliArguments.getOptions());
//   }
// 
//   public static boolean hasHelp() {
//     return commandLine.hasOption("h");
//   }
// 
//   public static boolean hasVerboseDebug() {
//     return commandLine.hasOption("v");
//   }
// 
//   public static boolean hasVerboseTrace() {
//     return commandLine.hasOption("vv");
//   }
// 
//   public static Rules getRules() {
//     return rules;
//   }
// 
//   public static void setRules(Rules rules) {
//     CliHelper.rules = rules;
//   }
// }


import com.strobel.decompiler.PlainTextOutput;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import net.nandgr.cba.cli.CliHelper;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
    File decompiledFile = new File(decompiledFileName);
    decompiledFile.getParentFile().mkdirs();

    StringWriter pw = new StringWriter();
    try {
      com.strobel.decompiler.Decompiler.decompile(tempFile.getAbsolutePath(), new PlainTextOutput(pw));
    } catch (Exception e) {
      logger.info("Error while decompiling {}. " , entryName);
      throw e;
    }
    pw.flush();

    String decompiledFileContent = pw.toString();
    FileUtils.writeStringToFile(decompiledFile, decompiledFileContent);
    return decompiledFileContent;
  }

  private static File createTempFile(String entryName, InputStream inputStream) throws IOException {
    byte[] inputStreamBytes = IOUtils.toByteArray(inputStream);
    InputStream byteArrayInputStream = new ByteArrayInputStream(inputStreamBytes);

    String prefix = entryName.replaceAll(File.separator, ".");
    final File tempFile = File.createTempFile(prefix, ".class");
    FileOutputStream outputStream = new FileOutputStream(tempFile);
    int copiedBytes = IOUtils.copy(byteArrayInputStream, outputStream);
    logger.debug("Copied {} bytes to a temp file.", copiedBytes);
    return tempFile;
  }

  private static String getDecompiledFileName(String entryName) {
// Path: src/main/java/net/nandgr/cba/cli/CliHelper.java
// public class CliHelper {
// 
//   private static CommandLineParser commandLineParser = new DefaultParser();
//   private static CommandLine commandLine;
//   private static Rules rules;
// 
//   private CliHelper() {
//     throw new IllegalAccessError("Cannot instantiate this utility class.");
//   }
// 
//   public static void parseCliArguments(String[] args) throws ParseException {
//     commandLine = commandLineParser.parse(CliArguments.getOptions(), args);
//   }
// 
//   public static String getPathToAnalyze() {
//     return commandLine.getOptionValue("a");
//   }
// 
//   public static int getMaxThreads() {
//     return Integer.parseInt(commandLine.getOptionValue("t", CliArguments.MAX_THREADS_DEFAULT));
//   }
// 
//   public static boolean hasOutputDir() {
//     return commandLine.hasOption("o");
//   }
// 
//   public static String getOutputDir() {
//     return commandLine.getOptionValue("o", CliArguments.OUTPUT_DEFAULT);
//   }
// 
//   public static boolean hasMaxItemsInReport() {
//     return commandLine.hasOption("i");
//   }
// 
//   public static int getMaxItemsInReport() {
//     return Integer.parseInt(commandLine.getOptionValue("i", CliArguments.MAX_ITEMS_IN_REPORT_DEFAULT));
//   }
// 
//   public static boolean hasChecks() {
//     return commandLine.hasOption("c");
//   }
// 
//   public static String[] getChecks() {
//     return commandLine.getOptionValues("c");
//   }
// 
//   public static boolean hasCustomFile() {
//     return commandLine.hasOption("f");
//   }
// 
//   public static String getCustomFile() {
//     return commandLine.getOptionValue("f");
//   }
// 
//   public static void printHelp() {
//     HelpFormatter helpFormatter = new HelpFormatter();
//     helpFormatter.printHelp("java -jar cba-cli.jar [OPTIONS] -a DIRECTORY_TO_ANALYZE", CliArguments.getOptions());
//   }
// 
//   public static boolean hasHelp() {
//     return commandLine.hasOption("h");
//   }
// 
//   public static boolean hasVerboseDebug() {
//     return commandLine.hasOption("v");
//   }
// 
//   public static boolean hasVerboseTrace() {
//     return commandLine.hasOption("vv");
//   }
// 
//   public static Rules getRules() {
//     return rules;
//   }
// 
//   public static void setRules(Rules rules) {
//     CliHelper.rules = rules;
//   }
// }


// Path: src/main/java/net/nandgr/cba/decompile/ZipEntryDecompiler.java
import com.strobel.decompiler.PlainTextOutput;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import net.nandgr.cba.cli.CliHelper;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

    File decompiledFile = new File(decompiledFileName);
    decompiledFile.getParentFile().mkdirs();

    StringWriter pw = new StringWriter();
    try {
      com.strobel.decompiler.Decompiler.decompile(tempFile.getAbsolutePath(), new PlainTextOutput(pw));
    } catch (Exception e) {
      logger.info("Error while decompiling {}. " , entryName);
      throw e;
    }
    pw.flush();

    String decompiledFileContent = pw.toString();
    FileUtils.writeStringToFile(decompiledFile, decompiledFileContent);
    return decompiledFileContent;
  }

  private static File createTempFile(String entryName, InputStream inputStream) throws IOException {
    byte[] inputStreamBytes = IOUtils.toByteArray(inputStream);
    InputStream byteArrayInputStream = new ByteArrayInputStream(inputStreamBytes);

    String prefix = entryName.replaceAll(File.separator, ".");
    final File tempFile = File.createTempFile(prefix, ".class");
    FileOutputStream outputStream = new FileOutputStream(tempFile);
    int copiedBytes = IOUtils.copy(byteArrayInputStream, outputStream);
    logger.debug("Copied {} bytes to a temp file.", copiedBytes);
    return tempFile;
  }

  private static String getDecompiledFileName(String entryName) {
    String outputDir = CliHelper.getOutputDir();