docs: def _evaluate_expressions(self, expression_engine, step_id, values, context):
          """Recursively evaluate expressions in a dictionary of values."""
          if expression_engine is None:
              return values
  
          processed = {}
          for name, value in values.items():
              if isinstance(value, str):
                  value = value.strip()
                  try:
                      expression = expression_engine.get_inline_expression(value)
                      if expression is not None:
                          # Inline expression.
                          value = expression_engine.evaluate_inline(expression, context)
                      else:
                          # Block expression.
                          value = expression_engine.evaluate_block(value, context)
                  except EvaluationError as error:
                      raise ExecutionError('Error while evaluating expression for step "{}":\n{}'.format(
                          step_id, error
                      ))
              elif isinstance(value, dict):
                  value = self._evaluate_expressions(expression_engine, step_id, value, context)
  
              processed[name] = value
  
          return processed