Fix validation for listeners to validate with nested inputs

CPP wasn't validating for nested input for state machine listeners. I'm not sure why this didn't rear its ugly head earlier through all my testing.

Diffs=
252100f48 Fix validation for listeners to validate with nested inputs (#6220)

Co-authored-by: Philip Chung <philterdesign@gmail.com>
diff --git a/.rive_head b/.rive_head
index c9622a7..9266ff8 100644
--- a/.rive_head
+++ b/.rive_head
@@ -1 +1 @@
-f21ebc98ccb32677eae36f23f89391f93767ca51
+252100f48a796caa0199b65339e0def4d2eb676c
diff --git a/include/rive/animation/listener_bool_change.hpp b/include/rive/animation/listener_bool_change.hpp
index 060a886..df0b762 100644
--- a/include/rive/animation/listener_bool_change.hpp
+++ b/include/rive/animation/listener_bool_change.hpp
@@ -4,10 +4,12 @@
 
 namespace rive
 {
+class NestedInput;
 class ListenerBoolChange : public ListenerBoolChangeBase
 {
 public:
     bool validateInputType(const StateMachineInput* input) const override;
+    bool validateNestedInputType(const NestedInput* input) const override;
     void perform(StateMachineInstance* stateMachineInstance, Vec2D position) const override;
 };
 } // namespace rive
diff --git a/include/rive/animation/listener_input_change.hpp b/include/rive/animation/listener_input_change.hpp
index 713fa99..584b43a 100644
--- a/include/rive/animation/listener_input_change.hpp
+++ b/include/rive/animation/listener_input_change.hpp
@@ -4,12 +4,14 @@
 
 namespace rive
 {
+class NestedInput;
 class StateMachineInput;
 class ListenerInputChange : public ListenerInputChangeBase
 {
 public:
     StatusCode import(ImportStack& importStack) override;
     virtual bool validateInputType(const StateMachineInput* input) const { return true; }
+    virtual bool validateNestedInputType(const NestedInput* input) const { return true; }
 };
 } // namespace rive
 
diff --git a/include/rive/animation/listener_number_change.hpp b/include/rive/animation/listener_number_change.hpp
index 75cf223..d76cc0e 100644
--- a/include/rive/animation/listener_number_change.hpp
+++ b/include/rive/animation/listener_number_change.hpp
@@ -4,10 +4,12 @@
 
 namespace rive
 {
+class NestedInput;
 class ListenerNumberChange : public ListenerNumberChangeBase
 {
 public:
     bool validateInputType(const StateMachineInput* input) const override;
+    bool validateNestedInputType(const NestedInput* input) const override;
     void perform(StateMachineInstance* stateMachineInstance, Vec2D position) const override;
 };
 } // namespace rive
diff --git a/include/rive/animation/listener_trigger_change.hpp b/include/rive/animation/listener_trigger_change.hpp
index ecd4261..7a9c595 100644
--- a/include/rive/animation/listener_trigger_change.hpp
+++ b/include/rive/animation/listener_trigger_change.hpp
@@ -4,10 +4,12 @@
 
 namespace rive
 {
+class NestedInput;
 class ListenerTriggerChange : public ListenerTriggerChangeBase
 {
 public:
     bool validateInputType(const StateMachineInput* input) const override;
+    bool validateNestedInputType(const NestedInput* input) const override;
     void perform(StateMachineInstance* stateMachineInstance, Vec2D position) const override;
 };
 } // namespace rive
diff --git a/src/animation/listener_bool_change.cpp b/src/animation/listener_bool_change.cpp
index b497585..b86e0f8 100644
--- a/src/animation/listener_bool_change.cpp
+++ b/src/animation/listener_bool_change.cpp
@@ -15,6 +15,14 @@
     return input == nullptr || input->is<StateMachineBool>();
 }
 
+bool ListenerBoolChange::validateNestedInputType(const NestedInput* input) const
+{
+    // A null nested input is valid as the StateMachine can attempt to limp along if we
+    // introduce new input types that old conditions are expected to handle in
+    // newer runtimes. The older runtimes will just evaluate them to true.
+    return input == nullptr || input->is<NestedBool>();
+}
+
 void ListenerBoolChange::perform(StateMachineInstance* stateMachineInstance, Vec2D position) const
 {
     if (nestedInputId() != Core::emptyId)
diff --git a/src/animation/listener_input_change.cpp b/src/animation/listener_input_change.cpp
index c9307a0..c721674 100644
--- a/src/animation/listener_input_change.cpp
+++ b/src/animation/listener_input_change.cpp
@@ -1,9 +1,12 @@
+#include "rive/animation/listener_input_change.hpp"
+#include "rive/animation/nested_input.hpp"
+#include "rive/animation/state_machine.hpp"
 #include "rive/animation/state_machine_listener.hpp"
+#include "rive/artboard.hpp"
+#include "rive/importers/artboard_importer.hpp"
 #include "rive/importers/import_stack.hpp"
 #include "rive/importers/state_machine_listener_importer.hpp"
 #include "rive/importers/state_machine_importer.hpp"
-#include "rive/animation/listener_input_change.hpp"
-#include "rive/animation/state_machine.hpp"
 
 using namespace rive;
 
@@ -15,7 +18,17 @@
         return StatusCode::MissingObject;
     }
 
-    if (!validateInputType(stateMachineImporter->stateMachine()->input((size_t)inputId())))
+    auto artboardImporter = importStack.latest<ArtboardImporter>(ArtboardBase::typeKey);
+    if (artboardImporter == nullptr)
+    {
+        return StatusCode::MissingObject;
+    }
+    auto input = stateMachineImporter->stateMachine()->input((size_t)inputId());
+    auto nested = artboardImporter->artboard()->resolve(nestedInputId());
+    auto nestedInput = nested != nullptr ? nested->as<NestedInput>() : nullptr;
+
+    // The listener should validate either an input or a nested input
+    if (!validateInputType(input) && !validateNestedInputType(nestedInput))
     {
         return StatusCode::InvalidObject;
     }
diff --git a/src/animation/listener_number_change.cpp b/src/animation/listener_number_change.cpp
index 6dfaec9..ca1d5c2 100644
--- a/src/animation/listener_number_change.cpp
+++ b/src/animation/listener_number_change.cpp
@@ -1,4 +1,5 @@
 #include "rive/animation/listener_number_change.hpp"
+#include "rive/animation/nested_input.hpp"
 #include "rive/animation/nested_number.hpp"
 #include "rive/animation/nested_state_machine.hpp"
 #include "rive/animation/state_machine_instance.hpp"
@@ -15,6 +16,14 @@
     return input == nullptr || input->is<StateMachineNumber>();
 }
 
+bool ListenerNumberChange::validateNestedInputType(const NestedInput* input) const
+{
+    // A null nested input is valid as the StateMachine can attempt to limp along if we
+    // introduce new input types that old conditions are expected to handle in
+    // newer runtimes. The older runtimes will just evaluate them to true.
+    return input == nullptr || input->is<NestedNumber>();
+}
+
 void ListenerNumberChange::perform(StateMachineInstance* stateMachineInstance, Vec2D position) const
 {
     if (nestedInputId() != Core::emptyId)
diff --git a/src/animation/listener_trigger_change.cpp b/src/animation/listener_trigger_change.cpp
index 9e3e988..a7b0579 100644
--- a/src/animation/listener_trigger_change.cpp
+++ b/src/animation/listener_trigger_change.cpp
@@ -1,4 +1,5 @@
 #include "rive/animation/listener_trigger_change.hpp"
+#include "rive/animation/nested_input.hpp"
 #include "rive/animation/nested_trigger.hpp"
 #include "rive/animation/nested_state_machine.hpp"
 #include "rive/animation/state_machine_instance.hpp"
@@ -16,6 +17,14 @@
     return input == nullptr || input->is<StateMachineTrigger>();
 }
 
+bool ListenerTriggerChange::validateNestedInputType(const NestedInput* input) const
+{
+    // A null nested input is valid as the StateMachine can attempt to limp along if we
+    // introduce new input types that old conditions are expected to handle in
+    // newer runtimes. The older runtimes will just evaluate them to true.
+    return input == nullptr || input->is<NestedTrigger>();
+}
+
 void ListenerTriggerChange::perform(StateMachineInstance* stateMachineInstance,
                                     Vec2D position) const
 {