code: public static Props resolveProps(final Props props) {
      if (props == null) {
        return null;
      }
  
      final Props resolvedProps = new Props();
  
      final LinkedHashSet<String> visitedVariables = new LinkedHashSet<>();
      for (final String key : props.getKeySet()) {
        String value = props.get(key);
        if (value == null) {
          logger.warn("Null value in props for key '" + key + "'. Replacing with empty string.");
          value = "";
        }
  
        visitedVariables.add(key);
        final String replacedValue =
            resolveVariableReplacement(value, props, visitedVariables);
        visitedVariables.clear();
  
        resolvedProps.put(key, replacedValue);
      }
  
      for (final String key : resolvedProps.getKeySet()) {
        final String value = resolvedProps.get(key);
        final String expressedValue = resolveVariableExpression(value);
        resolvedProps.put(key, expressedValue);
      }
  
      return resolvedProps;
    }
docs: Resolve Props
  
  @param props props
  @return resolved props