QUESTION 3: We expect the "get_output_value()" function to be called multiple times with varying "step_declarations" and "value_for_output_name"s. As some of the "actions" might be expensive to call, we should cache the output of "action" calls. That way, if an "action" is called multiple times with the same input values, the output value can be reused without recomputing. An "action" function may be re-used multiple in many "StepDeclarations" within one system, or within different systems sharing a cache. Implement get_output_value_with_caching() below to use the global "cache" variable. "actions" are pure functions, where the output value of each function only depends on the values of the inputs. In a real system, some inputs are accessing external data (eg, reading logs off a filesystem) rather than just fixed strings like the examples given. We can simulate this by having one of the steps that takes no inputs return a variable result.