docs: SecurityUtilityReturnCodes runProgram(String[] args) {
          if (stdin == null) {
              stderr.println(CommandUtils.getMessage("error.missingIO", "stdin"));
  
              return SecurityUtilityReturnCodes.ERR_GENERIC;
          }
          if (stdout == null) {
              stderr.println(CommandUtils.getMessage("error.missingIO", "stdout"));
  
              return SecurityUtilityReturnCodes.ERR_GENERIC;
          }
          if (stderr == null) {
              stdout.println(CommandUtils.getMessage("error.missingIO", "stderr"));
  
              return SecurityUtilityReturnCodes.ERR_GENERIC;
          }
  
          // Help is always available
          HelpTask help = new HelpTask(SCRIPT_NAME, tasks);
          registerTask(help);
  
          if (args.length == 0) {
              stdout.println(help.getScriptUsage());
              return SecurityUtilityReturnCodes.OK;
          }
  
          // Convenience: If the first argument can reasonably be interpreted as "help", do so.
          // Note NLS issue and presumption that none of the other commands rhyme with help...
          // which is part of why I'm checking starts/ends rather than contains.
          if (args[0].toLowerCase().endsWith(help.getTaskName().toLowerCase())) {
              args[0] = help.getTaskName();
          }
  
          SecurityUtilityTask task = getTask(args[0]);
          if (task == null) {
              stderr.println(CommandUtils.getMessage("task.unknown", args[0]));
              stderr.println(help.getScriptUsage());
              // It is unfortunate that this returns 0 (OK) but that's what it used to do,
              // so don't break anything.
              return SecurityUtilityReturnCodes.OK;
          } else {
              try {
                  return task.handleTask(stdin, stdout, stderr, args);
              } catch (IllegalArgumentException e) {
                  stderr.println("");
                  stderr.println(CommandUtils.getMessage("error", e.getMessage()));
                  stderr.println(help.getTaskUsage(task));
                  return SecurityUtilityReturnCodes.ERR_GENERIC;
              } catch (Exception e) {
                  stderr.println("");
                  stderr.println(CommandUtils.getMessage("error", e.toString()));
                  stderr.println(help.getTaskUsage(task));
                  return SecurityUtilityReturnCodes.ERR_GENERIC;
              }
          }
      }