@SuppressWarnings("UseOfSystemOutOrSystemErr")
  private static void printUsage() {
    System.err.println(
      "Usage:\n" +
      "  Runner create <old_version> <new_version> <old_folder> <new_folder> <patch_file> [<file_set>=file1;file2;...] [<flags>]\n" +
      "  Runner install <folder>\n" +
      "\n" +
      "Where:\n" +
      "  <old_version>: A description of the version to generate the patch from.\n" +
      "  <new_version>: A description of the version to generate the patch to.\n" +
      "  <old_folder>: The folder where to find the old version.\n" +
      "  <new_folder>: The folder where to find the new version.\n" +
      "  <patch_file>: The .jar patch file to create, which will contain the patch and the patcher.\n" +
      "  <file_set>: Can be one of:\n" +
      "    ignored: The set of files that will not be included in the patch.\n" +
      "    critical: Fully included in the patch, so they can be replaced at the destination even if they have changed.\n" +
      "    strictfiles: A set of files for which conflicts can't be ignored (a mismatch forbids patch installation).\n" +
      "    optional: A set of files that is okay for them not to exist when applying the patch.\n" +
      "    delete: A set of regular expressions for paths that is safe to delete without user confirmation.\n" +
      "  <flags>: Can be:\n" +
      "    --strict:     The created patch will contain extra information to fully validate an installation. A strict\n" +
      "                  patch will only be applied if it is guaranteed that the patched version will match exactly\n" +
      "                  the source of the patch. This means that unexpected files will be deleted and all existing files\n" +
      "                  will be validated\n" +
      "    --cache-dir=<dir>: Sets directory where diffs can be cached.\n" +
      "                  Useful when building several patches on folders with common files.\n" +
      "    --root=<dir>: Sets dir as the root directory of the patch. The root directory is the directory where the patch should be\n" +
      "                  applied to. For example on Mac, you can diff the two .app folders and set Contents as the root.\n" +
      "                  The root directory is relative to <old_folder> and uses forwards-slashes as separators.\n" +
      "    --timeout=<T> A time budget for building a 'bsdiff' patch between a pair of files, in seconds.\n" +
      "                  If exceeded, the new version is included into the patch as a whole.\n" +
      "  <folder>: The folder where product was installed. For example: c:/Program Files/JetBrains/IntelliJ IDEA 2017.3.4");
  }
@SuppressWarnings("UseOfSystemOutOrSystemErr")
  private static void printUsage()