private static EventLogExternalSendConfig parseSendConfiguration(@NotNull String recorderId, @NotNull Map<String, String> options)
    throws ParseSendConfigurationException {
    String recorderLowerCase = recorderId.toLowerCase(Locale.ENGLISH);

    String deviceOption = options.get(EventLogUploaderOptions.DEVICE_OPTION + recorderLowerCase);
    if (deviceOption == null) {
      throw new ParseSendConfigurationException(ParseErrorType.NO_DEVICE_ID);
    }
    String machineIdOption = options.get(EventLogUploaderOptions.MACHINE_ID_OPTION + recorderLowerCase);
    if (machineIdOption == null) {
      throw new ParseSendConfigurationException(ParseErrorType.NO_MACHINE_ID);
    }

    int bucket = getIntOption(EventLogUploaderOptions.BUCKET_OPTION + recorderLowerCase, options);
    if (bucket < 0 || bucket >= 256) {
      throw new ParseSendConfigurationException(ParseErrorType.INVALID_BUCKET);
    }

    int idRevisionOption = getIntOption(EventLogUploaderOptions.ID_REVISION_OPTION + recorderLowerCase, options);
    if (idRevisionOption < 0) {
      throw new ParseSendConfigurationException(ParseErrorType.INVALID_REVISION);
    }

    String logs = options.get(EventLogUploaderOptions.LOGS_OPTION + recorderLowerCase);
    if (logs == null) {
      throw new ParseSendConfigurationException(ParseErrorType.NO_LOG_FILES);
    }

    Boolean escape = getBooleanOption(EventLogUploaderOptions.ESCAPING_OPTION + recorderLowerCase, options);
    if (escape == null) {
      escape = true;
    }

    List<String> files = StatisticsStringUtil.split(logs, File.pathSeparatorChar);
    return new EventLogExternalSendConfig(
      recorderId, deviceOption, bucket, new MachineId(machineIdOption, idRevisionOption), files, true, escape);
  }
private static EventLogExternalSendConfig parseSendConfiguration(@NotNull String recorderId, @NotNull Map<String, String> options)