#pragma once
/**
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0.
 */

/* This file is generated. */

#include <aws/eventstreamrpc/EventStreamClient.h>

#include <aws/crt/DateTime.h>
#include <aws/greengrass/Exports.h>

#include <memory>

using namespace Aws::Eventstreamrpc;

namespace Aws
{
    namespace Greengrass
    {
        class GreengrassCoreIpcClient;
        class GreengrassCoreIpcServiceModel;
        class SystemResourceLimits : public AbstractShapeBase
        {
          public:
            SystemResourceLimits() noexcept {}
            SystemResourceLimits(const SystemResourceLimits &) = default;
            void SetMemory(const int64_t &memory) noexcept { m_memory = memory; }
            Aws::Crt::Optional<int64_t> GetMemory() noexcept { return m_memory; }
            void SetCpus(const double &cpus) noexcept { m_cpus = cpus; }
            Aws::Crt::Optional<double> GetCpus() noexcept { return m_cpus; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(SystemResourceLimits &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(SystemResourceLimits *) noexcept;
            /* This needs to be defined so that `SystemResourceLimits` can be used as a
             * key in maps. */
            bool operator<(const SystemResourceLimits &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<int64_t> m_memory;
            Aws::Crt::Optional<double> m_cpus;
        };

        class ValidateConfigurationUpdateEvent : public AbstractShapeBase
        {
          public:
            ValidateConfigurationUpdateEvent() noexcept {}
            ValidateConfigurationUpdateEvent(const ValidateConfigurationUpdateEvent &) = default;
            void SetConfiguration(const Aws::Crt::JsonObject &configuration) noexcept
            {
                m_configuration = configuration;
            }
            Aws::Crt::Optional<Aws::Crt::JsonObject> GetConfiguration() noexcept { return m_configuration; }
            void SetDeploymentId(const Aws::Crt::String &deploymentId) noexcept { m_deploymentId = deploymentId; }
            Aws::Crt::Optional<Aws::Crt::String> GetDeploymentId() noexcept { return m_deploymentId; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ValidateConfigurationUpdateEvent &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ValidateConfigurationUpdateEvent *) noexcept;
            /* This needs to be defined so that `ValidateConfigurationUpdateEvent` can be
             * used as a key in maps. */
            bool operator<(const ValidateConfigurationUpdateEvent &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::JsonObject> m_configuration;
            Aws::Crt::Optional<Aws::Crt::String> m_deploymentId;
        };

        class MQTTMessage : public AbstractShapeBase
        {
          public:
            MQTTMessage() noexcept {}
            MQTTMessage(const MQTTMessage &) = default;
            void SetTopicName(const Aws::Crt::String &topicName) noexcept { m_topicName = topicName; }
            Aws::Crt::Optional<Aws::Crt::String> GetTopicName() noexcept { return m_topicName; }
            void SetPayload(const Aws::Crt::Vector<uint8_t> &payload) noexcept { m_payload = payload; }
            Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>> GetPayload() noexcept { return m_payload; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(MQTTMessage &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(MQTTMessage *) noexcept;
            /* This needs to be defined so that `MQTTMessage` can be used as a key in
             * maps. */
            bool operator<(const MQTTMessage &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_topicName;
            Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>> m_payload;
        };

        class ConfigurationUpdateEvent : public AbstractShapeBase
        {
          public:
            ConfigurationUpdateEvent() noexcept {}
            ConfigurationUpdateEvent(const ConfigurationUpdateEvent &) = default;
            void SetComponentName(const Aws::Crt::String &componentName) noexcept { m_componentName = componentName; }
            Aws::Crt::Optional<Aws::Crt::String> GetComponentName() noexcept { return m_componentName; }
            void SetKeyPath(const Aws::Crt::Vector<Aws::Crt::String> &keyPath) noexcept { m_keyPath = keyPath; }
            Aws::Crt::Optional<Aws::Crt::Vector<Aws::Crt::String>> GetKeyPath() noexcept { return m_keyPath; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ConfigurationUpdateEvent &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ConfigurationUpdateEvent *) noexcept;
            /* This needs to be defined so that `ConfigurationUpdateEvent` can be used as
             * a key in maps. */
            bool operator<(const ConfigurationUpdateEvent &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_componentName;
            Aws::Crt::Optional<Aws::Crt::Vector<Aws::Crt::String>> m_keyPath;
        };

        class PostComponentUpdateEvent : public AbstractShapeBase
        {
          public:
            PostComponentUpdateEvent() noexcept {}
            PostComponentUpdateEvent(const PostComponentUpdateEvent &) = default;
            void SetDeploymentId(const Aws::Crt::String &deploymentId) noexcept { m_deploymentId = deploymentId; }
            Aws::Crt::Optional<Aws::Crt::String> GetDeploymentId() noexcept { return m_deploymentId; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(PostComponentUpdateEvent &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(PostComponentUpdateEvent *) noexcept;
            /* This needs to be defined so that `PostComponentUpdateEvent` can be used as
             * a key in maps. */
            bool operator<(const PostComponentUpdateEvent &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_deploymentId;
        };

        class PreComponentUpdateEvent : public AbstractShapeBase
        {
          public:
            PreComponentUpdateEvent() noexcept {}
            PreComponentUpdateEvent(const PreComponentUpdateEvent &) = default;
            void SetDeploymentId(const Aws::Crt::String &deploymentId) noexcept { m_deploymentId = deploymentId; }
            Aws::Crt::Optional<Aws::Crt::String> GetDeploymentId() noexcept { return m_deploymentId; }
            void SetIsGgcRestarting(const bool &isGgcRestarting) noexcept { m_isGgcRestarting = isGgcRestarting; }
            Aws::Crt::Optional<bool> GetIsGgcRestarting() noexcept { return m_isGgcRestarting; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(PreComponentUpdateEvent &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(PreComponentUpdateEvent *) noexcept;
            /* This needs to be defined so that `PreComponentUpdateEvent` can be used as a
             * key in maps. */
            bool operator<(const PreComponentUpdateEvent &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_deploymentId;
            Aws::Crt::Optional<bool> m_isGgcRestarting;
        };

        enum ConfigurationValidityStatus
        {
            CONFIGURATION_VALIDITY_STATUS_ACCEPTED,
            CONFIGURATION_VALIDITY_STATUS_REJECTED
        };

        class BinaryMessage : public AbstractShapeBase
        {
          public:
            BinaryMessage() noexcept {}
            BinaryMessage(const BinaryMessage &) = default;
            void SetMessage(const Aws::Crt::Vector<uint8_t> &message) noexcept { m_message = message; }
            Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>> GetMessage() noexcept { return m_message; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(BinaryMessage &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(BinaryMessage *) noexcept;
            /* This needs to be defined so that `BinaryMessage` can be used as a key in
             * maps. */
            bool operator<(const BinaryMessage &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>> m_message;
        };

        class JsonMessage : public AbstractShapeBase
        {
          public:
            JsonMessage() noexcept {}
            JsonMessage(const JsonMessage &) = default;
            void SetMessage(const Aws::Crt::JsonObject &message) noexcept { m_message = message; }
            Aws::Crt::Optional<Aws::Crt::JsonObject> GetMessage() noexcept { return m_message; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(JsonMessage &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(JsonMessage *) noexcept;
            /* This needs to be defined so that `JsonMessage` can be used as a key in
             * maps. */
            bool operator<(const JsonMessage &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::JsonObject> m_message;
        };

        enum DeploymentStatus
        {
            DEPLOYMENT_STATUS_QUEUED,
            DEPLOYMENT_STATUS_IN_PROGRESS,
            DEPLOYMENT_STATUS_SUCCEEDED,
            DEPLOYMENT_STATUS_FAILED
        };

        enum LifecycleState
        {
            LIFECYCLE_STATE_RUNNING,
            LIFECYCLE_STATE_ERRORED,
            LIFECYCLE_STATE_NEW,
            LIFECYCLE_STATE_FINISHED,
            LIFECYCLE_STATE_INSTALLED,
            LIFECYCLE_STATE_BROKEN,
            LIFECYCLE_STATE_STARTING,
            LIFECYCLE_STATE_STOPPING
        };

        class RunWithInfo : public AbstractShapeBase
        {
          public:
            RunWithInfo() noexcept {}
            RunWithInfo(const RunWithInfo &) = default;
            void SetPosixUser(const Aws::Crt::String &posixUser) noexcept { m_posixUser = posixUser; }
            Aws::Crt::Optional<Aws::Crt::String> GetPosixUser() noexcept { return m_posixUser; }
            void SetWindowsUser(const Aws::Crt::String &windowsUser) noexcept { m_windowsUser = windowsUser; }
            Aws::Crt::Optional<Aws::Crt::String> GetWindowsUser() noexcept { return m_windowsUser; }
            void SetSystemResourceLimits(const SystemResourceLimits &systemResourceLimits) noexcept
            {
                m_systemResourceLimits = systemResourceLimits;
            }
            Aws::Crt::Optional<SystemResourceLimits> GetSystemResourceLimits() noexcept
            {
                return m_systemResourceLimits;
            }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(RunWithInfo &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(RunWithInfo *) noexcept;
            /* This needs to be defined so that `RunWithInfo` can be used as a key in
             * maps. */
            bool operator<(const RunWithInfo &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_posixUser;
            Aws::Crt::Optional<Aws::Crt::String> m_windowsUser;
            Aws::Crt::Optional<SystemResourceLimits> m_systemResourceLimits;
        };

        enum ReportedLifecycleState
        {
            REPORTED_LIFECYCLE_STATE_RUNNING,
            REPORTED_LIFECYCLE_STATE_ERRORED
        };

        class ValidateConfigurationUpdateEvents : public AbstractShapeBase
        {
          public:
            ValidateConfigurationUpdateEvents() noexcept {}
            ValidateConfigurationUpdateEvents &operator=(const ValidateConfigurationUpdateEvents &) noexcept;
            ValidateConfigurationUpdateEvents(const ValidateConfigurationUpdateEvents &objectToCopy)
            {
                *this = objectToCopy;
            }
            void SetValidateConfigurationUpdateEvent(
                const ValidateConfigurationUpdateEvent &validateConfigurationUpdateEvent) noexcept
            {
                m_validateConfigurationUpdateEvent = validateConfigurationUpdateEvent;
                m_chosenMember = TAG_VALIDATE_CONFIGURATION_UPDATE_EVENT;
            }
            Aws::Crt::Optional<ValidateConfigurationUpdateEvent> GetValidateConfigurationUpdateEvent() noexcept
            {
                if (m_chosenMember == TAG_VALIDATE_CONFIGURATION_UPDATE_EVENT)
                {
                    return m_validateConfigurationUpdateEvent;
                }
                else
                {
                    return Aws::Crt::Optional<ValidateConfigurationUpdateEvent>();
                }
            }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ValidateConfigurationUpdateEvents &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ValidateConfigurationUpdateEvents *) noexcept;
            /* This needs to be defined so that `ValidateConfigurationUpdateEvents` can be
             * used as a key in maps. */
            bool operator<(const ValidateConfigurationUpdateEvents &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            enum ChosenMember
            {
                TAG_VALIDATE_CONFIGURATION_UPDATE_EVENT
            } m_chosenMember;
            Aws::Crt::Optional<ValidateConfigurationUpdateEvent> m_validateConfigurationUpdateEvent;
        };

        class SubscriptionResponseMessage : public AbstractShapeBase
        {
          public:
            SubscriptionResponseMessage() noexcept {}
            SubscriptionResponseMessage &operator=(const SubscriptionResponseMessage &) noexcept;
            SubscriptionResponseMessage(const SubscriptionResponseMessage &objectToCopy) { *this = objectToCopy; }
            void SetJsonMessage(const JsonMessage &jsonMessage) noexcept
            {
                m_jsonMessage = jsonMessage;
                m_chosenMember = TAG_JSON_MESSAGE;
            }
            Aws::Crt::Optional<JsonMessage> GetJsonMessage() noexcept
            {
                if (m_chosenMember == TAG_JSON_MESSAGE)
                {
                    return m_jsonMessage;
                }
                else
                {
                    return Aws::Crt::Optional<JsonMessage>();
                }
            }
            void SetBinaryMessage(const BinaryMessage &binaryMessage) noexcept
            {
                m_binaryMessage = binaryMessage;
                m_chosenMember = TAG_BINARY_MESSAGE;
            }
            Aws::Crt::Optional<BinaryMessage> GetBinaryMessage() noexcept
            {
                if (m_chosenMember == TAG_BINARY_MESSAGE)
                {
                    return m_binaryMessage;
                }
                else
                {
                    return Aws::Crt::Optional<BinaryMessage>();
                }
            }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(SubscriptionResponseMessage &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(SubscriptionResponseMessage *) noexcept;
            /* This needs to be defined so that `SubscriptionResponseMessage` can be used
             * as a key in maps. */
            bool operator<(const SubscriptionResponseMessage &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            enum ChosenMember
            {
                TAG_JSON_MESSAGE,
                TAG_BINARY_MESSAGE
            } m_chosenMember;
            Aws::Crt::Optional<JsonMessage> m_jsonMessage;
            Aws::Crt::Optional<BinaryMessage> m_binaryMessage;
        };

        class IoTCoreMessage : public AbstractShapeBase
        {
          public:
            IoTCoreMessage() noexcept {}
            IoTCoreMessage &operator=(const IoTCoreMessage &) noexcept;
            IoTCoreMessage(const IoTCoreMessage &objectToCopy) { *this = objectToCopy; }
            void SetMessage(const MQTTMessage &message) noexcept
            {
                m_message = message;
                m_chosenMember = TAG_MESSAGE;
            }
            Aws::Crt::Optional<MQTTMessage> GetMessage() noexcept
            {
                if (m_chosenMember == TAG_MESSAGE)
                {
                    return m_message;
                }
                else
                {
                    return Aws::Crt::Optional<MQTTMessage>();
                }
            }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(IoTCoreMessage &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(IoTCoreMessage *) noexcept;
            /* This needs to be defined so that `IoTCoreMessage` can be used as a key in
             * maps. */
            bool operator<(const IoTCoreMessage &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            enum ChosenMember
            {
                TAG_MESSAGE
            } m_chosenMember;
            Aws::Crt::Optional<MQTTMessage> m_message;
        };

        class ConfigurationUpdateEvents : public AbstractShapeBase
        {
          public:
            ConfigurationUpdateEvents() noexcept {}
            ConfigurationUpdateEvents &operator=(const ConfigurationUpdateEvents &) noexcept;
            ConfigurationUpdateEvents(const ConfigurationUpdateEvents &objectToCopy) { *this = objectToCopy; }
            void SetConfigurationUpdateEvent(const ConfigurationUpdateEvent &configurationUpdateEvent) noexcept
            {
                m_configurationUpdateEvent = configurationUpdateEvent;
                m_chosenMember = TAG_CONFIGURATION_UPDATE_EVENT;
            }
            Aws::Crt::Optional<ConfigurationUpdateEvent> GetConfigurationUpdateEvent() noexcept
            {
                if (m_chosenMember == TAG_CONFIGURATION_UPDATE_EVENT)
                {
                    return m_configurationUpdateEvent;
                }
                else
                {
                    return Aws::Crt::Optional<ConfigurationUpdateEvent>();
                }
            }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ConfigurationUpdateEvents &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ConfigurationUpdateEvents *) noexcept;
            /* This needs to be defined so that `ConfigurationUpdateEvents` can be used as
             * a key in maps. */
            bool operator<(const ConfigurationUpdateEvents &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            enum ChosenMember
            {
                TAG_CONFIGURATION_UPDATE_EVENT
            } m_chosenMember;
            Aws::Crt::Optional<ConfigurationUpdateEvent> m_configurationUpdateEvent;
        };

        class ComponentUpdatePolicyEvents : public AbstractShapeBase
        {
          public:
            ComponentUpdatePolicyEvents() noexcept {}
            ComponentUpdatePolicyEvents &operator=(const ComponentUpdatePolicyEvents &) noexcept;
            ComponentUpdatePolicyEvents(const ComponentUpdatePolicyEvents &objectToCopy) { *this = objectToCopy; }
            void SetPreUpdateEvent(const PreComponentUpdateEvent &preUpdateEvent) noexcept
            {
                m_preUpdateEvent = preUpdateEvent;
                m_chosenMember = TAG_PRE_UPDATE_EVENT;
            }
            Aws::Crt::Optional<PreComponentUpdateEvent> GetPreUpdateEvent() noexcept
            {
                if (m_chosenMember == TAG_PRE_UPDATE_EVENT)
                {
                    return m_preUpdateEvent;
                }
                else
                {
                    return Aws::Crt::Optional<PreComponentUpdateEvent>();
                }
            }
            void SetPostUpdateEvent(const PostComponentUpdateEvent &postUpdateEvent) noexcept
            {
                m_postUpdateEvent = postUpdateEvent;
                m_chosenMember = TAG_POST_UPDATE_EVENT;
            }
            Aws::Crt::Optional<PostComponentUpdateEvent> GetPostUpdateEvent() noexcept
            {
                if (m_chosenMember == TAG_POST_UPDATE_EVENT)
                {
                    return m_postUpdateEvent;
                }
                else
                {
                    return Aws::Crt::Optional<PostComponentUpdateEvent>();
                }
            }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ComponentUpdatePolicyEvents &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ComponentUpdatePolicyEvents *) noexcept;
            /* This needs to be defined so that `ComponentUpdatePolicyEvents` can be used
             * as a key in maps. */
            bool operator<(const ComponentUpdatePolicyEvents &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            enum ChosenMember
            {
                TAG_PRE_UPDATE_EVENT,
                TAG_POST_UPDATE_EVENT
            } m_chosenMember;
            Aws::Crt::Optional<PreComponentUpdateEvent> m_preUpdateEvent;
            Aws::Crt::Optional<PostComponentUpdateEvent> m_postUpdateEvent;
        };

        class ConfigurationValidityReport : public AbstractShapeBase
        {
          public:
            ConfigurationValidityReport() noexcept {}
            ConfigurationValidityReport(const ConfigurationValidityReport &) = default;
            void SetStatus(ConfigurationValidityStatus status) noexcept;
            Aws::Crt::Optional<ConfigurationValidityStatus> GetStatus() noexcept;
            void SetDeploymentId(const Aws::Crt::String &deploymentId) noexcept { m_deploymentId = deploymentId; }
            Aws::Crt::Optional<Aws::Crt::String> GetDeploymentId() noexcept { return m_deploymentId; }
            void SetMessage(const Aws::Crt::String &message) noexcept { m_message = message; }
            Aws::Crt::Optional<Aws::Crt::String> GetMessage() noexcept { return m_message; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ConfigurationValidityReport &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ConfigurationValidityReport *) noexcept;
            /* This needs to be defined so that `ConfigurationValidityReport` can be used
             * as a key in maps. */
            bool operator<(const ConfigurationValidityReport &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_status;
            Aws::Crt::Optional<Aws::Crt::String> m_deploymentId;
            Aws::Crt::Optional<Aws::Crt::String> m_message;
        };

        enum RequestStatus
        {
            REQUEST_STATUS_SUCCEEDED,
            REQUEST_STATUS_FAILED
        };

        class PublishMessage : public AbstractShapeBase
        {
          public:
            PublishMessage() noexcept {}
            PublishMessage &operator=(const PublishMessage &) noexcept;
            PublishMessage(const PublishMessage &objectToCopy) { *this = objectToCopy; }
            void SetJsonMessage(const JsonMessage &jsonMessage) noexcept
            {
                m_jsonMessage = jsonMessage;
                m_chosenMember = TAG_JSON_MESSAGE;
            }
            Aws::Crt::Optional<JsonMessage> GetJsonMessage() noexcept
            {
                if (m_chosenMember == TAG_JSON_MESSAGE)
                {
                    return m_jsonMessage;
                }
                else
                {
                    return Aws::Crt::Optional<JsonMessage>();
                }
            }
            void SetBinaryMessage(const BinaryMessage &binaryMessage) noexcept
            {
                m_binaryMessage = binaryMessage;
                m_chosenMember = TAG_BINARY_MESSAGE;
            }
            Aws::Crt::Optional<BinaryMessage> GetBinaryMessage() noexcept
            {
                if (m_chosenMember == TAG_BINARY_MESSAGE)
                {
                    return m_binaryMessage;
                }
                else
                {
                    return Aws::Crt::Optional<BinaryMessage>();
                }
            }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(PublishMessage &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(PublishMessage *) noexcept;
            /* This needs to be defined so that `PublishMessage` can be used as a key in
             * maps. */
            bool operator<(const PublishMessage &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            enum ChosenMember
            {
                TAG_JSON_MESSAGE,
                TAG_BINARY_MESSAGE
            } m_chosenMember;
            Aws::Crt::Optional<JsonMessage> m_jsonMessage;
            Aws::Crt::Optional<BinaryMessage> m_binaryMessage;
        };

        enum QOS
        {
            QOS_AT_MOST_ONCE,
            QOS_AT_LEAST_ONCE
        };

        class SecretValue : public AbstractShapeBase
        {
          public:
            SecretValue() noexcept {}
            SecretValue &operator=(const SecretValue &) noexcept;
            SecretValue(const SecretValue &objectToCopy) { *this = objectToCopy; }
            void SetSecretString(const Aws::Crt::String &secretString) noexcept
            {
                m_secretString = secretString;
                m_chosenMember = TAG_SECRET_STRING;
            }
            Aws::Crt::Optional<Aws::Crt::String> GetSecretString() noexcept
            {
                if (m_chosenMember == TAG_SECRET_STRING)
                {
                    return m_secretString;
                }
                else
                {
                    return Aws::Crt::Optional<Aws::Crt::String>();
                }
            }
            void SetSecretBinary(const Aws::Crt::Vector<uint8_t> &secretBinary) noexcept
            {
                m_secretBinary = secretBinary;
                m_chosenMember = TAG_SECRET_BINARY;
            }
            Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>> GetSecretBinary() noexcept
            {
                if (m_chosenMember == TAG_SECRET_BINARY)
                {
                    return m_secretBinary;
                }
                else
                {
                    return Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>>();
                }
            }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(SecretValue &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(SecretValue *) noexcept;
            /* This needs to be defined so that `SecretValue` can be used as a key in
             * maps. */
            bool operator<(const SecretValue &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            enum ChosenMember
            {
                TAG_SECRET_STRING,
                TAG_SECRET_BINARY
            } m_chosenMember;
            Aws::Crt::Optional<Aws::Crt::String> m_secretString;
            Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>> m_secretBinary;
        };

        class LocalDeployment : public AbstractShapeBase
        {
          public:
            LocalDeployment() noexcept {}
            LocalDeployment(const LocalDeployment &) = default;
            void SetDeploymentId(const Aws::Crt::String &deploymentId) noexcept { m_deploymentId = deploymentId; }
            Aws::Crt::Optional<Aws::Crt::String> GetDeploymentId() noexcept { return m_deploymentId; }
            void SetStatus(DeploymentStatus status) noexcept;
            Aws::Crt::Optional<DeploymentStatus> GetStatus() noexcept;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(LocalDeployment &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(LocalDeployment *) noexcept;
            /* This needs to be defined so that `LocalDeployment` can be used as a key in
             * maps. */
            bool operator<(const LocalDeployment &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_deploymentId;
            Aws::Crt::Optional<Aws::Crt::String> m_status;
        };

        class ComponentDetails : public AbstractShapeBase
        {
          public:
            ComponentDetails() noexcept {}
            ComponentDetails(const ComponentDetails &) = default;
            void SetComponentName(const Aws::Crt::String &componentName) noexcept { m_componentName = componentName; }
            Aws::Crt::Optional<Aws::Crt::String> GetComponentName() noexcept { return m_componentName; }
            void SetVersion(const Aws::Crt::String &version) noexcept { m_version = version; }
            Aws::Crt::Optional<Aws::Crt::String> GetVersion() noexcept { return m_version; }
            void SetState(LifecycleState state) noexcept;
            Aws::Crt::Optional<LifecycleState> GetState() noexcept;
            void SetConfiguration(const Aws::Crt::JsonObject &configuration) noexcept
            {
                m_configuration = configuration;
            }
            Aws::Crt::Optional<Aws::Crt::JsonObject> GetConfiguration() noexcept { return m_configuration; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ComponentDetails &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ComponentDetails *) noexcept;
            /* This needs to be defined so that `ComponentDetails` can be used as a key in
             * maps. */
            bool operator<(const ComponentDetails &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_componentName;
            Aws::Crt::Optional<Aws::Crt::String> m_version;
            Aws::Crt::Optional<Aws::Crt::String> m_state;
            Aws::Crt::Optional<Aws::Crt::JsonObject> m_configuration;
        };

        class InvalidTokenError : public OperationError
        {
          public:
            InvalidTokenError() noexcept {}
            InvalidTokenError(const InvalidTokenError &) = default;
            void SetMessage(const Aws::Crt::String &message) noexcept { m_message = message; }
            Aws::Crt::Optional<Aws::Crt::String> GetMessage() noexcept override { return m_message; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(InvalidTokenError &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<OperationError> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(InvalidTokenError *) noexcept;
            /* This needs to be defined so that `InvalidTokenError` can be used as a key
             * in maps. */
            bool operator<(const InvalidTokenError &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_message;
        };

        class ValidateAuthorizationTokenResponse : public AbstractShapeBase
        {
          public:
            ValidateAuthorizationTokenResponse() noexcept {}
            ValidateAuthorizationTokenResponse(const ValidateAuthorizationTokenResponse &) = default;
            void SetIsValid(const bool &isValid) noexcept { m_isValid = isValid; }
            Aws::Crt::Optional<bool> GetIsValid() noexcept { return m_isValid; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ValidateAuthorizationTokenResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ValidateAuthorizationTokenResponse *) noexcept;
            /* This needs to be defined so that `ValidateAuthorizationTokenResponse` can
             * be used as a key in maps. */
            bool operator<(const ValidateAuthorizationTokenResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<bool> m_isValid;
        };

        class ValidateAuthorizationTokenRequest : public AbstractShapeBase
        {
          public:
            ValidateAuthorizationTokenRequest() noexcept {}
            ValidateAuthorizationTokenRequest(const ValidateAuthorizationTokenRequest &) = default;
            void SetToken(const Aws::Crt::String &token) noexcept { m_token = token; }
            Aws::Crt::Optional<Aws::Crt::String> GetToken() noexcept { return m_token; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ValidateAuthorizationTokenRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ValidateAuthorizationTokenRequest *) noexcept;
            /* This needs to be defined so that `ValidateAuthorizationTokenRequest` can be
             * used as a key in maps. */
            bool operator<(const ValidateAuthorizationTokenRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_token;
        };

        class UpdateThingShadowResponse : public AbstractShapeBase
        {
          public:
            UpdateThingShadowResponse() noexcept {}
            UpdateThingShadowResponse(const UpdateThingShadowResponse &) = default;
            void SetPayload(const Aws::Crt::Vector<uint8_t> &payload) noexcept { m_payload = payload; }
            Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>> GetPayload() noexcept { return m_payload; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(UpdateThingShadowResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(UpdateThingShadowResponse *) noexcept;
            /* This needs to be defined so that `UpdateThingShadowResponse` can be used as
             * a key in maps. */
            bool operator<(const UpdateThingShadowResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>> m_payload;
        };

        class UpdateThingShadowRequest : public AbstractShapeBase
        {
          public:
            UpdateThingShadowRequest() noexcept {}
            UpdateThingShadowRequest(const UpdateThingShadowRequest &) = default;
            void SetThingName(const Aws::Crt::String &thingName) noexcept { m_thingName = thingName; }
            Aws::Crt::Optional<Aws::Crt::String> GetThingName() noexcept { return m_thingName; }
            void SetShadowName(const Aws::Crt::String &shadowName) noexcept { m_shadowName = shadowName; }
            Aws::Crt::Optional<Aws::Crt::String> GetShadowName() noexcept { return m_shadowName; }
            void SetPayload(const Aws::Crt::Vector<uint8_t> &payload) noexcept { m_payload = payload; }
            Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>> GetPayload() noexcept { return m_payload; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(UpdateThingShadowRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(UpdateThingShadowRequest *) noexcept;
            /* This needs to be defined so that `UpdateThingShadowRequest` can be used as
             * a key in maps. */
            bool operator<(const UpdateThingShadowRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_thingName;
            Aws::Crt::Optional<Aws::Crt::String> m_shadowName;
            Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>> m_payload;
        };

        class UpdateStateResponse : public AbstractShapeBase
        {
          public:
            UpdateStateResponse() noexcept {}
            UpdateStateResponse(const UpdateStateResponse &) = default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(UpdateStateResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(UpdateStateResponse *) noexcept;
            /* This needs to be defined so that `UpdateStateResponse` can be used as a key
             * in maps. */
            bool operator<(const UpdateStateResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class UpdateStateRequest : public AbstractShapeBase
        {
          public:
            UpdateStateRequest() noexcept {}
            UpdateStateRequest(const UpdateStateRequest &) = default;
            void SetState(ReportedLifecycleState state) noexcept;
            Aws::Crt::Optional<ReportedLifecycleState> GetState() noexcept;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(UpdateStateRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(UpdateStateRequest *) noexcept;
            /* This needs to be defined so that `UpdateStateRequest` can be used as a key
             * in maps. */
            bool operator<(const UpdateStateRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_state;
        };

        class FailedUpdateConditionCheckError : public OperationError
        {
          public:
            FailedUpdateConditionCheckError() noexcept {}
            FailedUpdateConditionCheckError(const FailedUpdateConditionCheckError &) = default;
            void SetMessage(const Aws::Crt::String &message) noexcept { m_message = message; }
            Aws::Crt::Optional<Aws::Crt::String> GetMessage() noexcept override { return m_message; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(FailedUpdateConditionCheckError &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<OperationError> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(FailedUpdateConditionCheckError *) noexcept;
            /* This needs to be defined so that `FailedUpdateConditionCheckError` can be
             * used as a key in maps. */
            bool operator<(const FailedUpdateConditionCheckError &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_message;
        };

        class ConflictError : public OperationError
        {
          public:
            ConflictError() noexcept {}
            ConflictError(const ConflictError &) = default;
            void SetMessage(const Aws::Crt::String &message) noexcept { m_message = message; }
            Aws::Crt::Optional<Aws::Crt::String> GetMessage() noexcept override { return m_message; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ConflictError &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<OperationError> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ConflictError *) noexcept;
            /* This needs to be defined so that `ConflictError` can be used as a key in
             * maps. */
            bool operator<(const ConflictError &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_message;
        };

        class UpdateConfigurationResponse : public AbstractShapeBase
        {
          public:
            UpdateConfigurationResponse() noexcept {}
            UpdateConfigurationResponse(const UpdateConfigurationResponse &) = default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(UpdateConfigurationResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(UpdateConfigurationResponse *) noexcept;
            /* This needs to be defined so that `UpdateConfigurationResponse` can be used
             * as a key in maps. */
            bool operator<(const UpdateConfigurationResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class UpdateConfigurationRequest : public AbstractShapeBase
        {
          public:
            UpdateConfigurationRequest() noexcept {}
            UpdateConfigurationRequest(const UpdateConfigurationRequest &) = default;
            void SetKeyPath(const Aws::Crt::Vector<Aws::Crt::String> &keyPath) noexcept { m_keyPath = keyPath; }
            Aws::Crt::Optional<Aws::Crt::Vector<Aws::Crt::String>> GetKeyPath() noexcept { return m_keyPath; }
            void SetTimestamp(const Aws::Crt::DateTime &timestamp) noexcept { m_timestamp = timestamp; }
            Aws::Crt::Optional<Aws::Crt::DateTime> GetTimestamp() noexcept { return m_timestamp; }
            void SetValueToMerge(const Aws::Crt::JsonObject &valueToMerge) noexcept { m_valueToMerge = valueToMerge; }
            Aws::Crt::Optional<Aws::Crt::JsonObject> GetValueToMerge() noexcept { return m_valueToMerge; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(UpdateConfigurationRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(UpdateConfigurationRequest *) noexcept;
            /* This needs to be defined so that `UpdateConfigurationRequest` can be used
             * as a key in maps. */
            bool operator<(const UpdateConfigurationRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::Vector<Aws::Crt::String>> m_keyPath;
            Aws::Crt::Optional<Aws::Crt::DateTime> m_timestamp;
            Aws::Crt::Optional<Aws::Crt::JsonObject> m_valueToMerge;
        };

        class SubscribeToValidateConfigurationUpdatesResponse : public AbstractShapeBase
        {
          public:
            SubscribeToValidateConfigurationUpdatesResponse() noexcept {}
            SubscribeToValidateConfigurationUpdatesResponse(const SubscribeToValidateConfigurationUpdatesResponse &) =
                default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(
                SubscribeToValidateConfigurationUpdatesResponse &,
                const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(SubscribeToValidateConfigurationUpdatesResponse *) noexcept;
            /* This needs to be defined so that
             * `SubscribeToValidateConfigurationUpdatesResponse` can be used as a key in
             * maps. */
            bool operator<(const SubscribeToValidateConfigurationUpdatesResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class SubscribeToValidateConfigurationUpdatesRequest : public AbstractShapeBase
        {
          public:
            SubscribeToValidateConfigurationUpdatesRequest() noexcept {}
            SubscribeToValidateConfigurationUpdatesRequest(const SubscribeToValidateConfigurationUpdatesRequest &) =
                default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(
                SubscribeToValidateConfigurationUpdatesRequest &,
                const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(SubscribeToValidateConfigurationUpdatesRequest *) noexcept;
            /* This needs to be defined so that
             * `SubscribeToValidateConfigurationUpdatesRequest` can be used as a key in
             * maps. */
            bool operator<(const SubscribeToValidateConfigurationUpdatesRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class SubscribeToTopicResponse : public AbstractShapeBase
        {
          public:
            SubscribeToTopicResponse() noexcept {}
            SubscribeToTopicResponse(const SubscribeToTopicResponse &) = default;
            void SetTopicName(const Aws::Crt::String &topicName) noexcept { m_topicName = topicName; }
            Aws::Crt::Optional<Aws::Crt::String> GetTopicName() noexcept { return m_topicName; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(SubscribeToTopicResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(SubscribeToTopicResponse *) noexcept;
            /* This needs to be defined so that `SubscribeToTopicResponse` can be used as
             * a key in maps. */
            bool operator<(const SubscribeToTopicResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_topicName;
        };

        class SubscribeToTopicRequest : public AbstractShapeBase
        {
          public:
            SubscribeToTopicRequest() noexcept {}
            SubscribeToTopicRequest(const SubscribeToTopicRequest &) = default;
            void SetTopic(const Aws::Crt::String &topic) noexcept { m_topic = topic; }
            Aws::Crt::Optional<Aws::Crt::String> GetTopic() noexcept { return m_topic; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(SubscribeToTopicRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(SubscribeToTopicRequest *) noexcept;
            /* This needs to be defined so that `SubscribeToTopicRequest` can be used as a
             * key in maps. */
            bool operator<(const SubscribeToTopicRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_topic;
        };

        class SubscribeToIoTCoreResponse : public AbstractShapeBase
        {
          public:
            SubscribeToIoTCoreResponse() noexcept {}
            SubscribeToIoTCoreResponse(const SubscribeToIoTCoreResponse &) = default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(SubscribeToIoTCoreResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(SubscribeToIoTCoreResponse *) noexcept;
            /* This needs to be defined so that `SubscribeToIoTCoreResponse` can be used
             * as a key in maps. */
            bool operator<(const SubscribeToIoTCoreResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class SubscribeToIoTCoreRequest : public AbstractShapeBase
        {
          public:
            SubscribeToIoTCoreRequest() noexcept {}
            SubscribeToIoTCoreRequest(const SubscribeToIoTCoreRequest &) = default;
            void SetTopicName(const Aws::Crt::String &topicName) noexcept { m_topicName = topicName; }
            Aws::Crt::Optional<Aws::Crt::String> GetTopicName() noexcept { return m_topicName; }
            void SetQos(QOS qos) noexcept;
            Aws::Crt::Optional<QOS> GetQos() noexcept;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(SubscribeToIoTCoreRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(SubscribeToIoTCoreRequest *) noexcept;
            /* This needs to be defined so that `SubscribeToIoTCoreRequest` can be used as
             * a key in maps. */
            bool operator<(const SubscribeToIoTCoreRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_topicName;
            Aws::Crt::Optional<Aws::Crt::String> m_qos;
        };

        class SubscribeToConfigurationUpdateResponse : public AbstractShapeBase
        {
          public:
            SubscribeToConfigurationUpdateResponse() noexcept {}
            SubscribeToConfigurationUpdateResponse(const SubscribeToConfigurationUpdateResponse &) = default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(
                SubscribeToConfigurationUpdateResponse &,
                const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(SubscribeToConfigurationUpdateResponse *) noexcept;
            /* This needs to be defined so that `SubscribeToConfigurationUpdateResponse`
             * can be used as a key in maps. */
            bool operator<(const SubscribeToConfigurationUpdateResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class SubscribeToConfigurationUpdateRequest : public AbstractShapeBase
        {
          public:
            SubscribeToConfigurationUpdateRequest() noexcept {}
            SubscribeToConfigurationUpdateRequest(const SubscribeToConfigurationUpdateRequest &) = default;
            void SetComponentName(const Aws::Crt::String &componentName) noexcept { m_componentName = componentName; }
            Aws::Crt::Optional<Aws::Crt::String> GetComponentName() noexcept { return m_componentName; }
            void SetKeyPath(const Aws::Crt::Vector<Aws::Crt::String> &keyPath) noexcept { m_keyPath = keyPath; }
            Aws::Crt::Optional<Aws::Crt::Vector<Aws::Crt::String>> GetKeyPath() noexcept { return m_keyPath; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(
                SubscribeToConfigurationUpdateRequest &,
                const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(SubscribeToConfigurationUpdateRequest *) noexcept;
            /* This needs to be defined so that `SubscribeToConfigurationUpdateRequest`
             * can be used as a key in maps. */
            bool operator<(const SubscribeToConfigurationUpdateRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_componentName;
            Aws::Crt::Optional<Aws::Crt::Vector<Aws::Crt::String>> m_keyPath;
        };

        class SubscribeToComponentUpdatesResponse : public AbstractShapeBase
        {
          public:
            SubscribeToComponentUpdatesResponse() noexcept {}
            SubscribeToComponentUpdatesResponse(const SubscribeToComponentUpdatesResponse &) = default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(SubscribeToComponentUpdatesResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(SubscribeToComponentUpdatesResponse *) noexcept;
            /* This needs to be defined so that `SubscribeToComponentUpdatesResponse` can
             * be used as a key in maps. */
            bool operator<(const SubscribeToComponentUpdatesResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class SubscribeToComponentUpdatesRequest : public AbstractShapeBase
        {
          public:
            SubscribeToComponentUpdatesRequest() noexcept {}
            SubscribeToComponentUpdatesRequest(const SubscribeToComponentUpdatesRequest &) = default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(SubscribeToComponentUpdatesRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(SubscribeToComponentUpdatesRequest *) noexcept;
            /* This needs to be defined so that `SubscribeToComponentUpdatesRequest` can
             * be used as a key in maps. */
            bool operator<(const SubscribeToComponentUpdatesRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class StopComponentResponse : public AbstractShapeBase
        {
          public:
            StopComponentResponse() noexcept {}
            StopComponentResponse(const StopComponentResponse &) = default;
            void SetStopStatus(RequestStatus stopStatus) noexcept;
            Aws::Crt::Optional<RequestStatus> GetStopStatus() noexcept;
            void SetMessage(const Aws::Crt::String &message) noexcept { m_message = message; }
            Aws::Crt::Optional<Aws::Crt::String> GetMessage() noexcept { return m_message; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(StopComponentResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(StopComponentResponse *) noexcept;
            /* This needs to be defined so that `StopComponentResponse` can be used as a
             * key in maps. */
            bool operator<(const StopComponentResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_stopStatus;
            Aws::Crt::Optional<Aws::Crt::String> m_message;
        };

        class StopComponentRequest : public AbstractShapeBase
        {
          public:
            StopComponentRequest() noexcept {}
            StopComponentRequest(const StopComponentRequest &) = default;
            void SetComponentName(const Aws::Crt::String &componentName) noexcept { m_componentName = componentName; }
            Aws::Crt::Optional<Aws::Crt::String> GetComponentName() noexcept { return m_componentName; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(StopComponentRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(StopComponentRequest *) noexcept;
            /* This needs to be defined so that `StopComponentRequest` can be used as a
             * key in maps. */
            bool operator<(const StopComponentRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_componentName;
        };

        class SendConfigurationValidityReportResponse : public AbstractShapeBase
        {
          public:
            SendConfigurationValidityReportResponse() noexcept {}
            SendConfigurationValidityReportResponse(const SendConfigurationValidityReportResponse &) = default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(
                SendConfigurationValidityReportResponse &,
                const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(SendConfigurationValidityReportResponse *) noexcept;
            /* This needs to be defined so that `SendConfigurationValidityReportResponse`
             * can be used as a key in maps. */
            bool operator<(const SendConfigurationValidityReportResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class SendConfigurationValidityReportRequest : public AbstractShapeBase
        {
          public:
            SendConfigurationValidityReportRequest() noexcept {}
            SendConfigurationValidityReportRequest(const SendConfigurationValidityReportRequest &) = default;
            void SetConfigurationValidityReport(const ConfigurationValidityReport &configurationValidityReport) noexcept
            {
                m_configurationValidityReport = configurationValidityReport;
            }
            Aws::Crt::Optional<ConfigurationValidityReport> GetConfigurationValidityReport() noexcept
            {
                return m_configurationValidityReport;
            }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(
                SendConfigurationValidityReportRequest &,
                const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(SendConfigurationValidityReportRequest *) noexcept;
            /* This needs to be defined so that `SendConfigurationValidityReportRequest`
             * can be used as a key in maps. */
            bool operator<(const SendConfigurationValidityReportRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<ConfigurationValidityReport> m_configurationValidityReport;
        };

        class ResumeComponentResponse : public AbstractShapeBase
        {
          public:
            ResumeComponentResponse() noexcept {}
            ResumeComponentResponse(const ResumeComponentResponse &) = default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ResumeComponentResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ResumeComponentResponse *) noexcept;
            /* This needs to be defined so that `ResumeComponentResponse` can be used as a
             * key in maps. */
            bool operator<(const ResumeComponentResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class ResumeComponentRequest : public AbstractShapeBase
        {
          public:
            ResumeComponentRequest() noexcept {}
            ResumeComponentRequest(const ResumeComponentRequest &) = default;
            void SetComponentName(const Aws::Crt::String &componentName) noexcept { m_componentName = componentName; }
            Aws::Crt::Optional<Aws::Crt::String> GetComponentName() noexcept { return m_componentName; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ResumeComponentRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ResumeComponentRequest *) noexcept;
            /* This needs to be defined so that `ResumeComponentRequest` can be used as a
             * key in maps. */
            bool operator<(const ResumeComponentRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_componentName;
        };

        class ComponentNotFoundError : public OperationError
        {
          public:
            ComponentNotFoundError() noexcept {}
            ComponentNotFoundError(const ComponentNotFoundError &) = default;
            void SetMessage(const Aws::Crt::String &message) noexcept { m_message = message; }
            Aws::Crt::Optional<Aws::Crt::String> GetMessage() noexcept override { return m_message; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ComponentNotFoundError &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<OperationError> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ComponentNotFoundError *) noexcept;
            /* This needs to be defined so that `ComponentNotFoundError` can be used as a
             * key in maps. */
            bool operator<(const ComponentNotFoundError &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_message;
        };

        class RestartComponentResponse : public AbstractShapeBase
        {
          public:
            RestartComponentResponse() noexcept {}
            RestartComponentResponse(const RestartComponentResponse &) = default;
            void SetRestartStatus(RequestStatus restartStatus) noexcept;
            Aws::Crt::Optional<RequestStatus> GetRestartStatus() noexcept;
            void SetMessage(const Aws::Crt::String &message) noexcept { m_message = message; }
            Aws::Crt::Optional<Aws::Crt::String> GetMessage() noexcept { return m_message; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(RestartComponentResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(RestartComponentResponse *) noexcept;
            /* This needs to be defined so that `RestartComponentResponse` can be used as
             * a key in maps. */
            bool operator<(const RestartComponentResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_restartStatus;
            Aws::Crt::Optional<Aws::Crt::String> m_message;
        };

        class RestartComponentRequest : public AbstractShapeBase
        {
          public:
            RestartComponentRequest() noexcept {}
            RestartComponentRequest(const RestartComponentRequest &) = default;
            void SetComponentName(const Aws::Crt::String &componentName) noexcept { m_componentName = componentName; }
            Aws::Crt::Optional<Aws::Crt::String> GetComponentName() noexcept { return m_componentName; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(RestartComponentRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(RestartComponentRequest *) noexcept;
            /* This needs to be defined so that `RestartComponentRequest` can be used as a
             * key in maps. */
            bool operator<(const RestartComponentRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_componentName;
        };

        class PublishToTopicResponse : public AbstractShapeBase
        {
          public:
            PublishToTopicResponse() noexcept {}
            PublishToTopicResponse(const PublishToTopicResponse &) = default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(PublishToTopicResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(PublishToTopicResponse *) noexcept;
            /* This needs to be defined so that `PublishToTopicResponse` can be used as a
             * key in maps. */
            bool operator<(const PublishToTopicResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class PublishToTopicRequest : public AbstractShapeBase
        {
          public:
            PublishToTopicRequest() noexcept {}
            PublishToTopicRequest(const PublishToTopicRequest &) = default;
            void SetTopic(const Aws::Crt::String &topic) noexcept { m_topic = topic; }
            Aws::Crt::Optional<Aws::Crt::String> GetTopic() noexcept { return m_topic; }
            void SetPublishMessage(const PublishMessage &publishMessage) noexcept { m_publishMessage = publishMessage; }
            Aws::Crt::Optional<PublishMessage> GetPublishMessage() noexcept { return m_publishMessage; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(PublishToTopicRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(PublishToTopicRequest *) noexcept;
            /* This needs to be defined so that `PublishToTopicRequest` can be used as a
             * key in maps. */
            bool operator<(const PublishToTopicRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_topic;
            Aws::Crt::Optional<PublishMessage> m_publishMessage;
        };

        class PublishToIoTCoreResponse : public AbstractShapeBase
        {
          public:
            PublishToIoTCoreResponse() noexcept {}
            PublishToIoTCoreResponse(const PublishToIoTCoreResponse &) = default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(PublishToIoTCoreResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(PublishToIoTCoreResponse *) noexcept;
            /* This needs to be defined so that `PublishToIoTCoreResponse` can be used as
             * a key in maps. */
            bool operator<(const PublishToIoTCoreResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class PublishToIoTCoreRequest : public AbstractShapeBase
        {
          public:
            PublishToIoTCoreRequest() noexcept {}
            PublishToIoTCoreRequest(const PublishToIoTCoreRequest &) = default;
            void SetTopicName(const Aws::Crt::String &topicName) noexcept { m_topicName = topicName; }
            Aws::Crt::Optional<Aws::Crt::String> GetTopicName() noexcept { return m_topicName; }
            void SetQos(QOS qos) noexcept;
            Aws::Crt::Optional<QOS> GetQos() noexcept;
            void SetPayload(const Aws::Crt::Vector<uint8_t> &payload) noexcept { m_payload = payload; }
            Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>> GetPayload() noexcept { return m_payload; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(PublishToIoTCoreRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(PublishToIoTCoreRequest *) noexcept;
            /* This needs to be defined so that `PublishToIoTCoreRequest` can be used as a
             * key in maps. */
            bool operator<(const PublishToIoTCoreRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_topicName;
            Aws::Crt::Optional<Aws::Crt::String> m_qos;
            Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>> m_payload;
        };

        class PauseComponentResponse : public AbstractShapeBase
        {
          public:
            PauseComponentResponse() noexcept {}
            PauseComponentResponse(const PauseComponentResponse &) = default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(PauseComponentResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(PauseComponentResponse *) noexcept;
            /* This needs to be defined so that `PauseComponentResponse` can be used as a
             * key in maps. */
            bool operator<(const PauseComponentResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class PauseComponentRequest : public AbstractShapeBase
        {
          public:
            PauseComponentRequest() noexcept {}
            PauseComponentRequest(const PauseComponentRequest &) = default;
            void SetComponentName(const Aws::Crt::String &componentName) noexcept { m_componentName = componentName; }
            Aws::Crt::Optional<Aws::Crt::String> GetComponentName() noexcept { return m_componentName; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(PauseComponentRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(PauseComponentRequest *) noexcept;
            /* This needs to be defined so that `PauseComponentRequest` can be used as a
             * key in maps. */
            bool operator<(const PauseComponentRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_componentName;
        };

        class ListNamedShadowsForThingResponse : public AbstractShapeBase
        {
          public:
            ListNamedShadowsForThingResponse() noexcept {}
            ListNamedShadowsForThingResponse(const ListNamedShadowsForThingResponse &) = default;
            void SetResults(const Aws::Crt::Vector<Aws::Crt::String> &results) noexcept { m_results = results; }
            Aws::Crt::Optional<Aws::Crt::Vector<Aws::Crt::String>> GetResults() noexcept { return m_results; }
            void SetTimestamp(const Aws::Crt::DateTime &timestamp) noexcept { m_timestamp = timestamp; }
            Aws::Crt::Optional<Aws::Crt::DateTime> GetTimestamp() noexcept { return m_timestamp; }
            void SetNextToken(const Aws::Crt::String &nextToken) noexcept { m_nextToken = nextToken; }
            Aws::Crt::Optional<Aws::Crt::String> GetNextToken() noexcept { return m_nextToken; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ListNamedShadowsForThingResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ListNamedShadowsForThingResponse *) noexcept;
            /* This needs to be defined so that `ListNamedShadowsForThingResponse` can be
             * used as a key in maps. */
            bool operator<(const ListNamedShadowsForThingResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::Vector<Aws::Crt::String>> m_results;
            Aws::Crt::Optional<Aws::Crt::DateTime> m_timestamp;
            Aws::Crt::Optional<Aws::Crt::String> m_nextToken;
        };

        class ListNamedShadowsForThingRequest : public AbstractShapeBase
        {
          public:
            ListNamedShadowsForThingRequest() noexcept {}
            ListNamedShadowsForThingRequest(const ListNamedShadowsForThingRequest &) = default;
            void SetThingName(const Aws::Crt::String &thingName) noexcept { m_thingName = thingName; }
            Aws::Crt::Optional<Aws::Crt::String> GetThingName() noexcept { return m_thingName; }
            void SetNextToken(const Aws::Crt::String &nextToken) noexcept { m_nextToken = nextToken; }
            Aws::Crt::Optional<Aws::Crt::String> GetNextToken() noexcept { return m_nextToken; }
            void SetPageSize(const int &pageSize) noexcept { m_pageSize = pageSize; }
            Aws::Crt::Optional<int> GetPageSize() noexcept { return m_pageSize; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ListNamedShadowsForThingRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ListNamedShadowsForThingRequest *) noexcept;
            /* This needs to be defined so that `ListNamedShadowsForThingRequest` can be
             * used as a key in maps. */
            bool operator<(const ListNamedShadowsForThingRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_thingName;
            Aws::Crt::Optional<Aws::Crt::String> m_nextToken;
            Aws::Crt::Optional<int> m_pageSize;
        };

        class ListLocalDeploymentsResponse : public AbstractShapeBase
        {
          public:
            ListLocalDeploymentsResponse() noexcept {}
            ListLocalDeploymentsResponse(const ListLocalDeploymentsResponse &) = default;
            void SetLocalDeployments(const Aws::Crt::Vector<LocalDeployment> &localDeployments) noexcept
            {
                m_localDeployments = localDeployments;
            }
            Aws::Crt::Optional<Aws::Crt::Vector<LocalDeployment>> GetLocalDeployments() noexcept
            {
                return m_localDeployments;
            }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ListLocalDeploymentsResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ListLocalDeploymentsResponse *) noexcept;
            /* This needs to be defined so that `ListLocalDeploymentsResponse` can be used
             * as a key in maps. */
            bool operator<(const ListLocalDeploymentsResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::Vector<LocalDeployment>> m_localDeployments;
        };

        class ListLocalDeploymentsRequest : public AbstractShapeBase
        {
          public:
            ListLocalDeploymentsRequest() noexcept {}
            ListLocalDeploymentsRequest(const ListLocalDeploymentsRequest &) = default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ListLocalDeploymentsRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ListLocalDeploymentsRequest *) noexcept;
            /* This needs to be defined so that `ListLocalDeploymentsRequest` can be used
             * as a key in maps. */
            bool operator<(const ListLocalDeploymentsRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class ListComponentsResponse : public AbstractShapeBase
        {
          public:
            ListComponentsResponse() noexcept {}
            ListComponentsResponse(const ListComponentsResponse &) = default;
            void SetComponents(const Aws::Crt::Vector<ComponentDetails> &components) noexcept
            {
                m_components = components;
            }
            Aws::Crt::Optional<Aws::Crt::Vector<ComponentDetails>> GetComponents() noexcept { return m_components; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ListComponentsResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ListComponentsResponse *) noexcept;
            /* This needs to be defined so that `ListComponentsResponse` can be used as a
             * key in maps. */
            bool operator<(const ListComponentsResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::Vector<ComponentDetails>> m_components;
        };

        class ListComponentsRequest : public AbstractShapeBase
        {
          public:
            ListComponentsRequest() noexcept {}
            ListComponentsRequest(const ListComponentsRequest &) = default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ListComponentsRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ListComponentsRequest *) noexcept;
            /* This needs to be defined so that `ListComponentsRequest` can be used as a
             * key in maps. */
            bool operator<(const ListComponentsRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class GetThingShadowResponse : public AbstractShapeBase
        {
          public:
            GetThingShadowResponse() noexcept {}
            GetThingShadowResponse(const GetThingShadowResponse &) = default;
            void SetPayload(const Aws::Crt::Vector<uint8_t> &payload) noexcept { m_payload = payload; }
            Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>> GetPayload() noexcept { return m_payload; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(GetThingShadowResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(GetThingShadowResponse *) noexcept;
            /* This needs to be defined so that `GetThingShadowResponse` can be used as a
             * key in maps. */
            bool operator<(const GetThingShadowResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>> m_payload;
        };

        class GetThingShadowRequest : public AbstractShapeBase
        {
          public:
            GetThingShadowRequest() noexcept {}
            GetThingShadowRequest(const GetThingShadowRequest &) = default;
            void SetThingName(const Aws::Crt::String &thingName) noexcept { m_thingName = thingName; }
            Aws::Crt::Optional<Aws::Crt::String> GetThingName() noexcept { return m_thingName; }
            void SetShadowName(const Aws::Crt::String &shadowName) noexcept { m_shadowName = shadowName; }
            Aws::Crt::Optional<Aws::Crt::String> GetShadowName() noexcept { return m_shadowName; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(GetThingShadowRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(GetThingShadowRequest *) noexcept;
            /* This needs to be defined so that `GetThingShadowRequest` can be used as a
             * key in maps. */
            bool operator<(const GetThingShadowRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_thingName;
            Aws::Crt::Optional<Aws::Crt::String> m_shadowName;
        };

        class GetSecretValueResponse : public AbstractShapeBase
        {
          public:
            GetSecretValueResponse() noexcept {}
            GetSecretValueResponse(const GetSecretValueResponse &) = default;
            void SetSecretId(const Aws::Crt::String &secretId) noexcept { m_secretId = secretId; }
            Aws::Crt::Optional<Aws::Crt::String> GetSecretId() noexcept { return m_secretId; }
            void SetVersionId(const Aws::Crt::String &versionId) noexcept { m_versionId = versionId; }
            Aws::Crt::Optional<Aws::Crt::String> GetVersionId() noexcept { return m_versionId; }
            void SetVersionStage(const Aws::Crt::Vector<Aws::Crt::String> &versionStage) noexcept
            {
                m_versionStage = versionStage;
            }
            Aws::Crt::Optional<Aws::Crt::Vector<Aws::Crt::String>> GetVersionStage() noexcept { return m_versionStage; }
            void SetSecretValue(const SecretValue &secretValue) noexcept { m_secretValue = secretValue; }
            Aws::Crt::Optional<SecretValue> GetSecretValue() noexcept { return m_secretValue; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(GetSecretValueResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(GetSecretValueResponse *) noexcept;
            /* This needs to be defined so that `GetSecretValueResponse` can be used as a
             * key in maps. */
            bool operator<(const GetSecretValueResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_secretId;
            Aws::Crt::Optional<Aws::Crt::String> m_versionId;
            Aws::Crt::Optional<Aws::Crt::Vector<Aws::Crt::String>> m_versionStage;
            Aws::Crt::Optional<SecretValue> m_secretValue;
        };

        class GetSecretValueRequest : public AbstractShapeBase
        {
          public:
            GetSecretValueRequest() noexcept {}
            GetSecretValueRequest(const GetSecretValueRequest &) = default;
            void SetSecretId(const Aws::Crt::String &secretId) noexcept { m_secretId = secretId; }
            Aws::Crt::Optional<Aws::Crt::String> GetSecretId() noexcept { return m_secretId; }
            void SetVersionId(const Aws::Crt::String &versionId) noexcept { m_versionId = versionId; }
            Aws::Crt::Optional<Aws::Crt::String> GetVersionId() noexcept { return m_versionId; }
            void SetVersionStage(const Aws::Crt::String &versionStage) noexcept { m_versionStage = versionStage; }
            Aws::Crt::Optional<Aws::Crt::String> GetVersionStage() noexcept { return m_versionStage; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(GetSecretValueRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(GetSecretValueRequest *) noexcept;
            /* This needs to be defined so that `GetSecretValueRequest` can be used as a
             * key in maps. */
            bool operator<(const GetSecretValueRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_secretId;
            Aws::Crt::Optional<Aws::Crt::String> m_versionId;
            Aws::Crt::Optional<Aws::Crt::String> m_versionStage;
        };

        class GetLocalDeploymentStatusResponse : public AbstractShapeBase
        {
          public:
            GetLocalDeploymentStatusResponse() noexcept {}
            GetLocalDeploymentStatusResponse(const GetLocalDeploymentStatusResponse &) = default;
            void SetDeployment(const LocalDeployment &deployment) noexcept { m_deployment = deployment; }
            Aws::Crt::Optional<LocalDeployment> GetDeployment() noexcept { return m_deployment; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(GetLocalDeploymentStatusResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(GetLocalDeploymentStatusResponse *) noexcept;
            /* This needs to be defined so that `GetLocalDeploymentStatusResponse` can be
             * used as a key in maps. */
            bool operator<(const GetLocalDeploymentStatusResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<LocalDeployment> m_deployment;
        };

        class GetLocalDeploymentStatusRequest : public AbstractShapeBase
        {
          public:
            GetLocalDeploymentStatusRequest() noexcept {}
            GetLocalDeploymentStatusRequest(const GetLocalDeploymentStatusRequest &) = default;
            void SetDeploymentId(const Aws::Crt::String &deploymentId) noexcept { m_deploymentId = deploymentId; }
            Aws::Crt::Optional<Aws::Crt::String> GetDeploymentId() noexcept { return m_deploymentId; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(GetLocalDeploymentStatusRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(GetLocalDeploymentStatusRequest *) noexcept;
            /* This needs to be defined so that `GetLocalDeploymentStatusRequest` can be
             * used as a key in maps. */
            bool operator<(const GetLocalDeploymentStatusRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_deploymentId;
        };

        class GetConfigurationResponse : public AbstractShapeBase
        {
          public:
            GetConfigurationResponse() noexcept {}
            GetConfigurationResponse(const GetConfigurationResponse &) = default;
            void SetComponentName(const Aws::Crt::String &componentName) noexcept { m_componentName = componentName; }
            Aws::Crt::Optional<Aws::Crt::String> GetComponentName() noexcept { return m_componentName; }
            void SetValue(const Aws::Crt::JsonObject &value) noexcept { m_value = value; }
            Aws::Crt::Optional<Aws::Crt::JsonObject> GetValue() noexcept { return m_value; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(GetConfigurationResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(GetConfigurationResponse *) noexcept;
            /* This needs to be defined so that `GetConfigurationResponse` can be used as
             * a key in maps. */
            bool operator<(const GetConfigurationResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_componentName;
            Aws::Crt::Optional<Aws::Crt::JsonObject> m_value;
        };

        class GetConfigurationRequest : public AbstractShapeBase
        {
          public:
            GetConfigurationRequest() noexcept {}
            GetConfigurationRequest(const GetConfigurationRequest &) = default;
            void SetComponentName(const Aws::Crt::String &componentName) noexcept { m_componentName = componentName; }
            Aws::Crt::Optional<Aws::Crt::String> GetComponentName() noexcept { return m_componentName; }
            void SetKeyPath(const Aws::Crt::Vector<Aws::Crt::String> &keyPath) noexcept { m_keyPath = keyPath; }
            Aws::Crt::Optional<Aws::Crt::Vector<Aws::Crt::String>> GetKeyPath() noexcept { return m_keyPath; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(GetConfigurationRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(GetConfigurationRequest *) noexcept;
            /* This needs to be defined so that `GetConfigurationRequest` can be used as a
             * key in maps. */
            bool operator<(const GetConfigurationRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_componentName;
            Aws::Crt::Optional<Aws::Crt::Vector<Aws::Crt::String>> m_keyPath;
        };

        class GetComponentDetailsResponse : public AbstractShapeBase
        {
          public:
            GetComponentDetailsResponse() noexcept {}
            GetComponentDetailsResponse(const GetComponentDetailsResponse &) = default;
            void SetComponentDetails(const ComponentDetails &componentDetails) noexcept
            {
                m_componentDetails = componentDetails;
            }
            Aws::Crt::Optional<ComponentDetails> GetComponentDetails() noexcept { return m_componentDetails; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(GetComponentDetailsResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(GetComponentDetailsResponse *) noexcept;
            /* This needs to be defined so that `GetComponentDetailsResponse` can be used
             * as a key in maps. */
            bool operator<(const GetComponentDetailsResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<ComponentDetails> m_componentDetails;
        };

        class GetComponentDetailsRequest : public AbstractShapeBase
        {
          public:
            GetComponentDetailsRequest() noexcept {}
            GetComponentDetailsRequest(const GetComponentDetailsRequest &) = default;
            void SetComponentName(const Aws::Crt::String &componentName) noexcept { m_componentName = componentName; }
            Aws::Crt::Optional<Aws::Crt::String> GetComponentName() noexcept { return m_componentName; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(GetComponentDetailsRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(GetComponentDetailsRequest *) noexcept;
            /* This needs to be defined so that `GetComponentDetailsRequest` can be used
             * as a key in maps. */
            bool operator<(const GetComponentDetailsRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_componentName;
        };

        class DeleteThingShadowResponse : public AbstractShapeBase
        {
          public:
            DeleteThingShadowResponse() noexcept {}
            DeleteThingShadowResponse(const DeleteThingShadowResponse &) = default;
            void SetPayload(const Aws::Crt::Vector<uint8_t> &payload) noexcept { m_payload = payload; }
            Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>> GetPayload() noexcept { return m_payload; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(DeleteThingShadowResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(DeleteThingShadowResponse *) noexcept;
            /* This needs to be defined so that `DeleteThingShadowResponse` can be used as
             * a key in maps. */
            bool operator<(const DeleteThingShadowResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::Vector<uint8_t>> m_payload;
        };

        class DeleteThingShadowRequest : public AbstractShapeBase
        {
          public:
            DeleteThingShadowRequest() noexcept {}
            DeleteThingShadowRequest(const DeleteThingShadowRequest &) = default;
            void SetThingName(const Aws::Crt::String &thingName) noexcept { m_thingName = thingName; }
            Aws::Crt::Optional<Aws::Crt::String> GetThingName() noexcept { return m_thingName; }
            void SetShadowName(const Aws::Crt::String &shadowName) noexcept { m_shadowName = shadowName; }
            Aws::Crt::Optional<Aws::Crt::String> GetShadowName() noexcept { return m_shadowName; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(DeleteThingShadowRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(DeleteThingShadowRequest *) noexcept;
            /* This needs to be defined so that `DeleteThingShadowRequest` can be used as
             * a key in maps. */
            bool operator<(const DeleteThingShadowRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_thingName;
            Aws::Crt::Optional<Aws::Crt::String> m_shadowName;
        };

        class ResourceNotFoundError : public OperationError
        {
          public:
            ResourceNotFoundError() noexcept {}
            ResourceNotFoundError(const ResourceNotFoundError &) = default;
            void SetMessage(const Aws::Crt::String &message) noexcept { m_message = message; }
            Aws::Crt::Optional<Aws::Crt::String> GetMessage() noexcept override { return m_message; }
            void SetResourceType(const Aws::Crt::String &resourceType) noexcept { m_resourceType = resourceType; }
            Aws::Crt::Optional<Aws::Crt::String> GetResourceType() noexcept { return m_resourceType; }
            void SetResourceName(const Aws::Crt::String &resourceName) noexcept { m_resourceName = resourceName; }
            Aws::Crt::Optional<Aws::Crt::String> GetResourceName() noexcept { return m_resourceName; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ResourceNotFoundError &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<OperationError> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ResourceNotFoundError *) noexcept;
            /* This needs to be defined so that `ResourceNotFoundError` can be used as a
             * key in maps. */
            bool operator<(const ResourceNotFoundError &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_message;
            Aws::Crt::Optional<Aws::Crt::String> m_resourceType;
            Aws::Crt::Optional<Aws::Crt::String> m_resourceName;
        };

        class DeferComponentUpdateResponse : public AbstractShapeBase
        {
          public:
            DeferComponentUpdateResponse() noexcept {}
            DeferComponentUpdateResponse(const DeferComponentUpdateResponse &) = default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(DeferComponentUpdateResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(DeferComponentUpdateResponse *) noexcept;
            /* This needs to be defined so that `DeferComponentUpdateResponse` can be used
             * as a key in maps. */
            bool operator<(const DeferComponentUpdateResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class DeferComponentUpdateRequest : public AbstractShapeBase
        {
          public:
            DeferComponentUpdateRequest() noexcept {}
            DeferComponentUpdateRequest(const DeferComponentUpdateRequest &) = default;
            void SetDeploymentId(const Aws::Crt::String &deploymentId) noexcept { m_deploymentId = deploymentId; }
            Aws::Crt::Optional<Aws::Crt::String> GetDeploymentId() noexcept { return m_deploymentId; }
            void SetMessage(const Aws::Crt::String &message) noexcept { m_message = message; }
            Aws::Crt::Optional<Aws::Crt::String> GetMessage() noexcept { return m_message; }
            void SetRecheckAfterMs(const int64_t &recheckAfterMs) noexcept { m_recheckAfterMs = recheckAfterMs; }
            Aws::Crt::Optional<int64_t> GetRecheckAfterMs() noexcept { return m_recheckAfterMs; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(DeferComponentUpdateRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(DeferComponentUpdateRequest *) noexcept;
            /* This needs to be defined so that `DeferComponentUpdateRequest` can be used
             * as a key in maps. */
            bool operator<(const DeferComponentUpdateRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_deploymentId;
            Aws::Crt::Optional<Aws::Crt::String> m_message;
            Aws::Crt::Optional<int64_t> m_recheckAfterMs;
        };

        class InvalidArgumentsError : public OperationError
        {
          public:
            InvalidArgumentsError() noexcept {}
            InvalidArgumentsError(const InvalidArgumentsError &) = default;
            void SetMessage(const Aws::Crt::String &message) noexcept { m_message = message; }
            Aws::Crt::Optional<Aws::Crt::String> GetMessage() noexcept override { return m_message; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(InvalidArgumentsError &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<OperationError> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(InvalidArgumentsError *) noexcept;
            /* This needs to be defined so that `InvalidArgumentsError` can be used as a
             * key in maps. */
            bool operator<(const InvalidArgumentsError &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_message;
        };

        class InvalidArtifactsDirectoryPathError : public OperationError
        {
          public:
            InvalidArtifactsDirectoryPathError() noexcept {}
            InvalidArtifactsDirectoryPathError(const InvalidArtifactsDirectoryPathError &) = default;
            void SetMessage(const Aws::Crt::String &message) noexcept { m_message = message; }
            Aws::Crt::Optional<Aws::Crt::String> GetMessage() noexcept override { return m_message; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(InvalidArtifactsDirectoryPathError &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<OperationError> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(InvalidArtifactsDirectoryPathError *) noexcept;
            /* This needs to be defined so that `InvalidArtifactsDirectoryPathError` can
             * be used as a key in maps. */
            bool operator<(const InvalidArtifactsDirectoryPathError &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_message;
        };

        class InvalidRecipeDirectoryPathError : public OperationError
        {
          public:
            InvalidRecipeDirectoryPathError() noexcept {}
            InvalidRecipeDirectoryPathError(const InvalidRecipeDirectoryPathError &) = default;
            void SetMessage(const Aws::Crt::String &message) noexcept { m_message = message; }
            Aws::Crt::Optional<Aws::Crt::String> GetMessage() noexcept override { return m_message; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(InvalidRecipeDirectoryPathError &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<OperationError> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(InvalidRecipeDirectoryPathError *) noexcept;
            /* This needs to be defined so that `InvalidRecipeDirectoryPathError` can be
             * used as a key in maps. */
            bool operator<(const InvalidRecipeDirectoryPathError &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_message;
        };

        class CreateLocalDeploymentResponse : public AbstractShapeBase
        {
          public:
            CreateLocalDeploymentResponse() noexcept {}
            CreateLocalDeploymentResponse(const CreateLocalDeploymentResponse &) = default;
            void SetDeploymentId(const Aws::Crt::String &deploymentId) noexcept { m_deploymentId = deploymentId; }
            Aws::Crt::Optional<Aws::Crt::String> GetDeploymentId() noexcept { return m_deploymentId; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(CreateLocalDeploymentResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(CreateLocalDeploymentResponse *) noexcept;
            /* This needs to be defined so that `CreateLocalDeploymentResponse` can be
             * used as a key in maps. */
            bool operator<(const CreateLocalDeploymentResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_deploymentId;
        };

        class CreateLocalDeploymentRequest : public AbstractShapeBase
        {
          public:
            CreateLocalDeploymentRequest() noexcept {}
            CreateLocalDeploymentRequest(const CreateLocalDeploymentRequest &) = default;
            void SetGroupName(const Aws::Crt::String &groupName) noexcept { m_groupName = groupName; }
            Aws::Crt::Optional<Aws::Crt::String> GetGroupName() noexcept { return m_groupName; }
            void SetRootComponentVersionsToAdd(
                const Aws::Crt::Map<Aws::Crt::String, Aws::Crt::String> &rootComponentVersionsToAdd) noexcept
            {
                m_rootComponentVersionsToAdd = rootComponentVersionsToAdd;
            }
            Aws::Crt::Optional<Aws::Crt::Map<Aws::Crt::String, Aws::Crt::String>>
                GetRootComponentVersionsToAdd() noexcept
            {
                return m_rootComponentVersionsToAdd;
            }
            void SetRootComponentsToRemove(const Aws::Crt::Vector<Aws::Crt::String> &rootComponentsToRemove) noexcept
            {
                m_rootComponentsToRemove = rootComponentsToRemove;
            }
            Aws::Crt::Optional<Aws::Crt::Vector<Aws::Crt::String>> GetRootComponentsToRemove() noexcept
            {
                return m_rootComponentsToRemove;
            }
            void SetComponentToConfiguration(
                const Aws::Crt::Map<Aws::Crt::String, Aws::Crt::JsonObject> &componentToConfiguration) noexcept
            {
                m_componentToConfiguration = componentToConfiguration;
            }
            Aws::Crt::Optional<Aws::Crt::Map<Aws::Crt::String, Aws::Crt::JsonObject>>
                GetComponentToConfiguration() noexcept
            {
                return m_componentToConfiguration;
            }
            void SetComponentToRunWithInfo(
                const Aws::Crt::Map<Aws::Crt::String, RunWithInfo> &componentToRunWithInfo) noexcept
            {
                m_componentToRunWithInfo = componentToRunWithInfo;
            }
            Aws::Crt::Optional<Aws::Crt::Map<Aws::Crt::String, RunWithInfo>> GetComponentToRunWithInfo() noexcept
            {
                return m_componentToRunWithInfo;
            }
            void SetRecipeDirectoryPath(const Aws::Crt::String &recipeDirectoryPath) noexcept
            {
                m_recipeDirectoryPath = recipeDirectoryPath;
            }
            Aws::Crt::Optional<Aws::Crt::String> GetRecipeDirectoryPath() noexcept { return m_recipeDirectoryPath; }
            void SetArtifactsDirectoryPath(const Aws::Crt::String &artifactsDirectoryPath) noexcept
            {
                m_artifactsDirectoryPath = artifactsDirectoryPath;
            }
            Aws::Crt::Optional<Aws::Crt::String> GetArtifactsDirectoryPath() noexcept
            {
                return m_artifactsDirectoryPath;
            }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(CreateLocalDeploymentRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(CreateLocalDeploymentRequest *) noexcept;
            /* This needs to be defined so that `CreateLocalDeploymentRequest` can be used
             * as a key in maps. */
            bool operator<(const CreateLocalDeploymentRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_groupName;
            Aws::Crt::Optional<Aws::Crt::Map<Aws::Crt::String, Aws::Crt::String>> m_rootComponentVersionsToAdd;
            Aws::Crt::Optional<Aws::Crt::Vector<Aws::Crt::String>> m_rootComponentsToRemove;
            Aws::Crt::Optional<Aws::Crt::Map<Aws::Crt::String, Aws::Crt::JsonObject>> m_componentToConfiguration;
            Aws::Crt::Optional<Aws::Crt::Map<Aws::Crt::String, RunWithInfo>> m_componentToRunWithInfo;
            Aws::Crt::Optional<Aws::Crt::String> m_recipeDirectoryPath;
            Aws::Crt::Optional<Aws::Crt::String> m_artifactsDirectoryPath;
        };

        class ServiceError : public OperationError
        {
          public:
            ServiceError() noexcept {}
            ServiceError(const ServiceError &) = default;
            void SetMessage(const Aws::Crt::String &message) noexcept { m_message = message; }
            Aws::Crt::Optional<Aws::Crt::String> GetMessage() noexcept override { return m_message; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(ServiceError &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<OperationError> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(ServiceError *) noexcept;
            /* This needs to be defined so that `ServiceError` can be used as a key in
             * maps. */
            bool operator<(const ServiceError &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_message;
        };

        class UnauthorizedError : public OperationError
        {
          public:
            UnauthorizedError() noexcept {}
            UnauthorizedError(const UnauthorizedError &) = default;
            void SetMessage(const Aws::Crt::String &message) noexcept { m_message = message; }
            Aws::Crt::Optional<Aws::Crt::String> GetMessage() noexcept override { return m_message; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(UnauthorizedError &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<OperationError> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(UnauthorizedError *) noexcept;
            /* This needs to be defined so that `UnauthorizedError` can be used as a key
             * in maps. */
            bool operator<(const UnauthorizedError &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_message;
        };

        class CreateDebugPasswordResponse : public AbstractShapeBase
        {
          public:
            CreateDebugPasswordResponse() noexcept {}
            CreateDebugPasswordResponse(const CreateDebugPasswordResponse &) = default;
            void SetPassword(const Aws::Crt::String &password) noexcept { m_password = password; }
            Aws::Crt::Optional<Aws::Crt::String> GetPassword() noexcept { return m_password; }
            void SetUsername(const Aws::Crt::String &username) noexcept { m_username = username; }
            Aws::Crt::Optional<Aws::Crt::String> GetUsername() noexcept { return m_username; }
            void SetPasswordExpiration(const Aws::Crt::DateTime &passwordExpiration) noexcept
            {
                m_passwordExpiration = passwordExpiration;
            }
            Aws::Crt::Optional<Aws::Crt::DateTime> GetPasswordExpiration() noexcept { return m_passwordExpiration; }
            void SetCertificateSHA256Hash(const Aws::Crt::String &certificateSHA256Hash) noexcept
            {
                m_certificateSHA256Hash = certificateSHA256Hash;
            }
            Aws::Crt::Optional<Aws::Crt::String> GetCertificateSHA256Hash() noexcept { return m_certificateSHA256Hash; }
            void SetCertificateSHA1Hash(const Aws::Crt::String &certificateSHA1Hash) noexcept
            {
                m_certificateSHA1Hash = certificateSHA1Hash;
            }
            Aws::Crt::Optional<Aws::Crt::String> GetCertificateSHA1Hash() noexcept { return m_certificateSHA1Hash; }
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(CreateDebugPasswordResponse &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(CreateDebugPasswordResponse *) noexcept;
            /* This needs to be defined so that `CreateDebugPasswordResponse` can be used
             * as a key in maps. */
            bool operator<(const CreateDebugPasswordResponse &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            Aws::Crt::Optional<Aws::Crt::String> m_password;
            Aws::Crt::Optional<Aws::Crt::String> m_username;
            Aws::Crt::Optional<Aws::Crt::DateTime> m_passwordExpiration;
            Aws::Crt::Optional<Aws::Crt::String> m_certificateSHA256Hash;
            Aws::Crt::Optional<Aws::Crt::String> m_certificateSHA1Hash;
        };

        class CreateDebugPasswordRequest : public AbstractShapeBase
        {
          public:
            CreateDebugPasswordRequest() noexcept {}
            CreateDebugPasswordRequest(const CreateDebugPasswordRequest &) = default;
            void SerializeToJsonObject(Aws::Crt::JsonObject &payloadObject) const noexcept override;
            static void s_loadFromJsonView(CreateDebugPasswordRequest &, const Aws::Crt::JsonView &) noexcept;
            static Aws::Crt::ScopedResource<AbstractShapeBase> s_allocateFromPayload(
                Aws::Crt::StringView,
                Aws::Crt::Allocator *) noexcept;
            static void s_customDeleter(CreateDebugPasswordRequest *) noexcept;
            /* This needs to be defined so that `CreateDebugPasswordRequest` can be used
             * as a key in maps. */
            bool operator<(const CreateDebugPasswordRequest &) const noexcept;
            static const char *MODEL_NAME;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
        };

        class SubscribeToIoTCoreStreamHandler : public StreamResponseHandler
        {
          public:
            virtual void OnStreamEvent(IoTCoreMessage *response) { (void)response; }

            /**
             * A callback that is invoked when an error occurs while parsing a message
             * from the stream.
             * @param rpcError The RPC error containing the status and possibly a CRT
             * error.
             */
            virtual bool OnStreamError(RpcError rpcError)
            {
                (void)rpcError;
                return true;
            }

            /**
             * A callback that is invoked upon receiving an error of type `ServiceError`.
             * @param operationError The error message being received.
             */
            virtual bool OnStreamError(ServiceError *operationError)
            {
                (void)operationError;
                return true;
            }

            /**
             * A callback that is invoked upon receiving an error of type
             * `UnauthorizedError`.
             * @param operationError The error message being received.
             */
            virtual bool OnStreamError(UnauthorizedError *operationError)
            {
                (void)operationError;
                return true;
            }

            /**
             * A callback that is invoked upon receiving ANY error response from the
             * server.
             * @param operationError The error message being received.
             */
            virtual bool OnStreamError(OperationError *operationError)
            {
                (void)operationError;
                return true;
            }

          private:
            /**
             * Invoked when a message is received on this continuation.
             */
            void OnStreamEvent(Aws::Crt::ScopedResource<AbstractShapeBase> response) override;
            /**
             * Invoked when a message is received on this continuation but results in an
             * error.
             *
             * This callback can return true so that the stream is closed afterwards.
             */
            bool OnStreamError(Aws::Crt::ScopedResource<OperationError> error, RpcError rpcError) override;
        };
        class SubscribeToIoTCoreOperationContext : public OperationModelContext
        {
          public:
            SubscribeToIoTCoreOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class SubscribeToIoTCoreResult
        {
          public:
            SubscribeToIoTCoreResult() noexcept {}
            SubscribeToIoTCoreResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            SubscribeToIoTCoreResponse *GetOperationResponse() const noexcept
            {
                return static_cast<SubscribeToIoTCoreResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class SubscribeToIoTCoreOperation : public ClientOperation
        {
          public:
            SubscribeToIoTCoreOperation(
                ClientConnection &connection,
                SubscribeToIoTCoreStreamHandler *streamHandler,
                const SubscribeToIoTCoreOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            SubscribeToIoTCoreOperation(
                ClientConnection &connection,
                std::shared_ptr<SubscribeToIoTCoreStreamHandler> streamHandler,
                const SubscribeToIoTCoreOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `SubscribeToIoTCoreOperation`
             * @param request The request used for the `SubscribeToIoTCoreOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const SubscribeToIoTCoreRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<SubscribeToIoTCoreResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            std::shared_ptr<SubscribeToIoTCoreStreamHandler> pinnedHandler;
        };

        class ResumeComponentOperationContext : public OperationModelContext
        {
          public:
            ResumeComponentOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class ResumeComponentResult
        {
          public:
            ResumeComponentResult() noexcept {}
            ResumeComponentResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            ResumeComponentResponse *GetOperationResponse() const noexcept
            {
                return static_cast<ResumeComponentResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class ResumeComponentOperation : public ClientOperation
        {
          public:
            ResumeComponentOperation(
                ClientConnection &connection,
                const ResumeComponentOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `ResumeComponentOperation`
             * @param request The request used for the `ResumeComponentOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const ResumeComponentRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<ResumeComponentResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class PublishToIoTCoreOperationContext : public OperationModelContext
        {
          public:
            PublishToIoTCoreOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class PublishToIoTCoreResult
        {
          public:
            PublishToIoTCoreResult() noexcept {}
            PublishToIoTCoreResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            PublishToIoTCoreResponse *GetOperationResponse() const noexcept
            {
                return static_cast<PublishToIoTCoreResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class PublishToIoTCoreOperation : public ClientOperation
        {
          public:
            PublishToIoTCoreOperation(
                ClientConnection &connection,
                const PublishToIoTCoreOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `PublishToIoTCoreOperation`
             * @param request The request used for the `PublishToIoTCoreOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const PublishToIoTCoreRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<PublishToIoTCoreResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class SubscribeToConfigurationUpdateStreamHandler : public StreamResponseHandler
        {
          public:
            virtual void OnStreamEvent(ConfigurationUpdateEvents *response) { (void)response; }

            /**
             * A callback that is invoked when an error occurs while parsing a message
             * from the stream.
             * @param rpcError The RPC error containing the status and possibly a CRT
             * error.
             */
            virtual bool OnStreamError(RpcError rpcError)
            {
                (void)rpcError;
                return true;
            }

            /**
             * A callback that is invoked upon receiving an error of type `ServiceError`.
             * @param operationError The error message being received.
             */
            virtual bool OnStreamError(ServiceError *operationError)
            {
                (void)operationError;
                return true;
            }

            /**
             * A callback that is invoked upon receiving an error of type
             * `ResourceNotFoundError`.
             * @param operationError The error message being received.
             */
            virtual bool OnStreamError(ResourceNotFoundError *operationError)
            {
                (void)operationError;
                return true;
            }

            /**
             * A callback that is invoked upon receiving ANY error response from the
             * server.
             * @param operationError The error message being received.
             */
            virtual bool OnStreamError(OperationError *operationError)
            {
                (void)operationError;
                return true;
            }

          private:
            /**
             * Invoked when a message is received on this continuation.
             */
            void OnStreamEvent(Aws::Crt::ScopedResource<AbstractShapeBase> response) override;
            /**
             * Invoked when a message is received on this continuation but results in an
             * error.
             *
             * This callback can return true so that the stream is closed afterwards.
             */
            bool OnStreamError(Aws::Crt::ScopedResource<OperationError> error, RpcError rpcError) override;
        };
        class SubscribeToConfigurationUpdateOperationContext : public OperationModelContext
        {
          public:
            SubscribeToConfigurationUpdateOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class SubscribeToConfigurationUpdateResult
        {
          public:
            SubscribeToConfigurationUpdateResult() noexcept {}
            SubscribeToConfigurationUpdateResult(TaggedResult &&taggedResult) noexcept
                : m_taggedResult(std::move(taggedResult))
            {
            }
            SubscribeToConfigurationUpdateResponse *GetOperationResponse() const noexcept
            {
                return static_cast<SubscribeToConfigurationUpdateResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class SubscribeToConfigurationUpdateOperation : public ClientOperation
        {
          public:
            SubscribeToConfigurationUpdateOperation(
                ClientConnection &connection,
                SubscribeToConfigurationUpdateStreamHandler *streamHandler,
                const SubscribeToConfigurationUpdateOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            SubscribeToConfigurationUpdateOperation(
                ClientConnection &connection,
                std::shared_ptr<SubscribeToConfigurationUpdateStreamHandler> streamHandler,
                const SubscribeToConfigurationUpdateOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `SubscribeToConfigurationUpdateOperation`
             * @param request The request used for the
             * `SubscribeToConfigurationUpdateOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const SubscribeToConfigurationUpdateRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<SubscribeToConfigurationUpdateResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            std::shared_ptr<SubscribeToConfigurationUpdateStreamHandler> pinnedHandler;
        };

        class DeleteThingShadowOperationContext : public OperationModelContext
        {
          public:
            DeleteThingShadowOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class DeleteThingShadowResult
        {
          public:
            DeleteThingShadowResult() noexcept {}
            DeleteThingShadowResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            DeleteThingShadowResponse *GetOperationResponse() const noexcept
            {
                return static_cast<DeleteThingShadowResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class DeleteThingShadowOperation : public ClientOperation
        {
          public:
            DeleteThingShadowOperation(
                ClientConnection &connection,
                const DeleteThingShadowOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `DeleteThingShadowOperation`
             * @param request The request used for the `DeleteThingShadowOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const DeleteThingShadowRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<DeleteThingShadowResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class DeferComponentUpdateOperationContext : public OperationModelContext
        {
          public:
            DeferComponentUpdateOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class DeferComponentUpdateResult
        {
          public:
            DeferComponentUpdateResult() noexcept {}
            DeferComponentUpdateResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult))
            {
            }
            DeferComponentUpdateResponse *GetOperationResponse() const noexcept
            {
                return static_cast<DeferComponentUpdateResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class DeferComponentUpdateOperation : public ClientOperation
        {
          public:
            DeferComponentUpdateOperation(
                ClientConnection &connection,
                const DeferComponentUpdateOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `DeferComponentUpdateOperation`
             * @param request The request used for the `DeferComponentUpdateOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const DeferComponentUpdateRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<DeferComponentUpdateResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class SubscribeToValidateConfigurationUpdatesStreamHandler : public StreamResponseHandler
        {
          public:
            virtual void OnStreamEvent(ValidateConfigurationUpdateEvents *response) { (void)response; }

            /**
             * A callback that is invoked when an error occurs while parsing a message
             * from the stream.
             * @param rpcError The RPC error containing the status and possibly a CRT
             * error.
             */
            virtual bool OnStreamError(RpcError rpcError)
            {
                (void)rpcError;
                return true;
            }

            /**
             * A callback that is invoked upon receiving an error of type `ServiceError`.
             * @param operationError The error message being received.
             */
            virtual bool OnStreamError(ServiceError *operationError)
            {
                (void)operationError;
                return true;
            }

            /**
             * A callback that is invoked upon receiving ANY error response from the
             * server.
             * @param operationError The error message being received.
             */
            virtual bool OnStreamError(OperationError *operationError)
            {
                (void)operationError;
                return true;
            }

          private:
            /**
             * Invoked when a message is received on this continuation.
             */
            void OnStreamEvent(Aws::Crt::ScopedResource<AbstractShapeBase> response) override;
            /**
             * Invoked when a message is received on this continuation but results in an
             * error.
             *
             * This callback can return true so that the stream is closed afterwards.
             */
            bool OnStreamError(Aws::Crt::ScopedResource<OperationError> error, RpcError rpcError) override;
        };
        class SubscribeToValidateConfigurationUpdatesOperationContext : public OperationModelContext
        {
          public:
            SubscribeToValidateConfigurationUpdatesOperationContext(
                const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class SubscribeToValidateConfigurationUpdatesResult
        {
          public:
            SubscribeToValidateConfigurationUpdatesResult() noexcept {}
            SubscribeToValidateConfigurationUpdatesResult(TaggedResult &&taggedResult) noexcept
                : m_taggedResult(std::move(taggedResult))
            {
            }
            SubscribeToValidateConfigurationUpdatesResponse *GetOperationResponse() const noexcept
            {
                return static_cast<SubscribeToValidateConfigurationUpdatesResponse *>(
                    m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class SubscribeToValidateConfigurationUpdatesOperation : public ClientOperation
        {
          public:
            SubscribeToValidateConfigurationUpdatesOperation(
                ClientConnection &connection,
                SubscribeToValidateConfigurationUpdatesStreamHandler *streamHandler,
                const SubscribeToValidateConfigurationUpdatesOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            SubscribeToValidateConfigurationUpdatesOperation(
                ClientConnection &connection,
                std::shared_ptr<SubscribeToValidateConfigurationUpdatesStreamHandler> streamHandler,
                const SubscribeToValidateConfigurationUpdatesOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the
             * `SubscribeToValidateConfigurationUpdatesOperation`
             * @param request The request used for the
             * `SubscribeToValidateConfigurationUpdatesOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const SubscribeToValidateConfigurationUpdatesRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<SubscribeToValidateConfigurationUpdatesResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            std::shared_ptr<SubscribeToValidateConfigurationUpdatesStreamHandler> pinnedHandler;
        };

        class GetConfigurationOperationContext : public OperationModelContext
        {
          public:
            GetConfigurationOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class GetConfigurationResult
        {
          public:
            GetConfigurationResult() noexcept {}
            GetConfigurationResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            GetConfigurationResponse *GetOperationResponse() const noexcept
            {
                return static_cast<GetConfigurationResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class GetConfigurationOperation : public ClientOperation
        {
          public:
            GetConfigurationOperation(
                ClientConnection &connection,
                const GetConfigurationOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `GetConfigurationOperation`
             * @param request The request used for the `GetConfigurationOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const GetConfigurationRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<GetConfigurationResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class SubscribeToTopicStreamHandler : public StreamResponseHandler
        {
          public:
            virtual void OnStreamEvent(SubscriptionResponseMessage *response) { (void)response; }

            /**
             * A callback that is invoked when an error occurs while parsing a message
             * from the stream.
             * @param rpcError The RPC error containing the status and possibly a CRT
             * error.
             */
            virtual bool OnStreamError(RpcError rpcError)
            {
                (void)rpcError;
                return true;
            }

            /**
             * A callback that is invoked upon receiving an error of type
             * `InvalidArgumentsError`.
             * @param operationError The error message being received.
             */
            virtual bool OnStreamError(InvalidArgumentsError *operationError)
            {
                (void)operationError;
                return true;
            }

            /**
             * A callback that is invoked upon receiving an error of type `ServiceError`.
             * @param operationError The error message being received.
             */
            virtual bool OnStreamError(ServiceError *operationError)
            {
                (void)operationError;
                return true;
            }

            /**
             * A callback that is invoked upon receiving an error of type
             * `UnauthorizedError`.
             * @param operationError The error message being received.
             */
            virtual bool OnStreamError(UnauthorizedError *operationError)
            {
                (void)operationError;
                return true;
            }

            /**
             * A callback that is invoked upon receiving ANY error response from the
             * server.
             * @param operationError The error message being received.
             */
            virtual bool OnStreamError(OperationError *operationError)
            {
                (void)operationError;
                return true;
            }

          private:
            /**
             * Invoked when a message is received on this continuation.
             */
            void OnStreamEvent(Aws::Crt::ScopedResource<AbstractShapeBase> response) override;
            /**
             * Invoked when a message is received on this continuation but results in an
             * error.
             *
             * This callback can return true so that the stream is closed afterwards.
             */
            bool OnStreamError(Aws::Crt::ScopedResource<OperationError> error, RpcError rpcError) override;
        };
        class SubscribeToTopicOperationContext : public OperationModelContext
        {
          public:
            SubscribeToTopicOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class SubscribeToTopicResult
        {
          public:
            SubscribeToTopicResult() noexcept {}
            SubscribeToTopicResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            SubscribeToTopicResponse *GetOperationResponse() const noexcept
            {
                return static_cast<SubscribeToTopicResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class SubscribeToTopicOperation : public ClientOperation
        {
          public:
            SubscribeToTopicOperation(
                ClientConnection &connection,
                SubscribeToTopicStreamHandler *streamHandler,
                const SubscribeToTopicOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            SubscribeToTopicOperation(
                ClientConnection &connection,
                std::shared_ptr<SubscribeToTopicStreamHandler> streamHandler,
                const SubscribeToTopicOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `SubscribeToTopicOperation`
             * @param request The request used for the `SubscribeToTopicOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const SubscribeToTopicRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<SubscribeToTopicResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            std::shared_ptr<SubscribeToTopicStreamHandler> pinnedHandler;
        };

        class GetComponentDetailsOperationContext : public OperationModelContext
        {
          public:
            GetComponentDetailsOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class GetComponentDetailsResult
        {
          public:
            GetComponentDetailsResult() noexcept {}
            GetComponentDetailsResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            GetComponentDetailsResponse *GetOperationResponse() const noexcept
            {
                return static_cast<GetComponentDetailsResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class GetComponentDetailsOperation : public ClientOperation
        {
          public:
            GetComponentDetailsOperation(
                ClientConnection &connection,
                const GetComponentDetailsOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `GetComponentDetailsOperation`
             * @param request The request used for the `GetComponentDetailsOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const GetComponentDetailsRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<GetComponentDetailsResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class PublishToTopicOperationContext : public OperationModelContext
        {
          public:
            PublishToTopicOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class PublishToTopicResult
        {
          public:
            PublishToTopicResult() noexcept {}
            PublishToTopicResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            PublishToTopicResponse *GetOperationResponse() const noexcept
            {
                return static_cast<PublishToTopicResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class PublishToTopicOperation : public ClientOperation
        {
          public:
            PublishToTopicOperation(
                ClientConnection &connection,
                const PublishToTopicOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `PublishToTopicOperation`
             * @param request The request used for the `PublishToTopicOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const PublishToTopicRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<PublishToTopicResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class ListComponentsOperationContext : public OperationModelContext
        {
          public:
            ListComponentsOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class ListComponentsResult
        {
          public:
            ListComponentsResult() noexcept {}
            ListComponentsResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            ListComponentsResponse *GetOperationResponse() const noexcept
            {
                return static_cast<ListComponentsResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class ListComponentsOperation : public ClientOperation
        {
          public:
            ListComponentsOperation(
                ClientConnection &connection,
                const ListComponentsOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `ListComponentsOperation`
             * @param request The request used for the `ListComponentsOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const ListComponentsRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<ListComponentsResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class CreateDebugPasswordOperationContext : public OperationModelContext
        {
          public:
            CreateDebugPasswordOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class CreateDebugPasswordResult
        {
          public:
            CreateDebugPasswordResult() noexcept {}
            CreateDebugPasswordResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            CreateDebugPasswordResponse *GetOperationResponse() const noexcept
            {
                return static_cast<CreateDebugPasswordResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class CreateDebugPasswordOperation : public ClientOperation
        {
          public:
            CreateDebugPasswordOperation(
                ClientConnection &connection,
                const CreateDebugPasswordOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `CreateDebugPasswordOperation`
             * @param request The request used for the `CreateDebugPasswordOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const CreateDebugPasswordRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<CreateDebugPasswordResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class GetThingShadowOperationContext : public OperationModelContext
        {
          public:
            GetThingShadowOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class GetThingShadowResult
        {
          public:
            GetThingShadowResult() noexcept {}
            GetThingShadowResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            GetThingShadowResponse *GetOperationResponse() const noexcept
            {
                return static_cast<GetThingShadowResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class GetThingShadowOperation : public ClientOperation
        {
          public:
            GetThingShadowOperation(
                ClientConnection &connection,
                const GetThingShadowOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `GetThingShadowOperation`
             * @param request The request used for the `GetThingShadowOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const GetThingShadowRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<GetThingShadowResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class SendConfigurationValidityReportOperationContext : public OperationModelContext
        {
          public:
            SendConfigurationValidityReportOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class SendConfigurationValidityReportResult
        {
          public:
            SendConfigurationValidityReportResult() noexcept {}
            SendConfigurationValidityReportResult(TaggedResult &&taggedResult) noexcept
                : m_taggedResult(std::move(taggedResult))
            {
            }
            SendConfigurationValidityReportResponse *GetOperationResponse() const noexcept
            {
                return static_cast<SendConfigurationValidityReportResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class SendConfigurationValidityReportOperation : public ClientOperation
        {
          public:
            SendConfigurationValidityReportOperation(
                ClientConnection &connection,
                const SendConfigurationValidityReportOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the
             * `SendConfigurationValidityReportOperation`
             * @param request The request used for the
             * `SendConfigurationValidityReportOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const SendConfigurationValidityReportRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<SendConfigurationValidityReportResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class UpdateThingShadowOperationContext : public OperationModelContext
        {
          public:
            UpdateThingShadowOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class UpdateThingShadowResult
        {
          public:
            UpdateThingShadowResult() noexcept {}
            UpdateThingShadowResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            UpdateThingShadowResponse *GetOperationResponse() const noexcept
            {
                return static_cast<UpdateThingShadowResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class UpdateThingShadowOperation : public ClientOperation
        {
          public:
            UpdateThingShadowOperation(
                ClientConnection &connection,
                const UpdateThingShadowOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `UpdateThingShadowOperation`
             * @param request The request used for the `UpdateThingShadowOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const UpdateThingShadowRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<UpdateThingShadowResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class UpdateConfigurationOperationContext : public OperationModelContext
        {
          public:
            UpdateConfigurationOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class UpdateConfigurationResult
        {
          public:
            UpdateConfigurationResult() noexcept {}
            UpdateConfigurationResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            UpdateConfigurationResponse *GetOperationResponse() const noexcept
            {
                return static_cast<UpdateConfigurationResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class UpdateConfigurationOperation : public ClientOperation
        {
          public:
            UpdateConfigurationOperation(
                ClientConnection &connection,
                const UpdateConfigurationOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `UpdateConfigurationOperation`
             * @param request The request used for the `UpdateConfigurationOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const UpdateConfigurationRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<UpdateConfigurationResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class ValidateAuthorizationTokenOperationContext : public OperationModelContext
        {
          public:
            ValidateAuthorizationTokenOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class ValidateAuthorizationTokenResult
        {
          public:
            ValidateAuthorizationTokenResult() noexcept {}
            ValidateAuthorizationTokenResult(TaggedResult &&taggedResult) noexcept
                : m_taggedResult(std::move(taggedResult))
            {
            }
            ValidateAuthorizationTokenResponse *GetOperationResponse() const noexcept
            {
                return static_cast<ValidateAuthorizationTokenResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class ValidateAuthorizationTokenOperation : public ClientOperation
        {
          public:
            ValidateAuthorizationTokenOperation(
                ClientConnection &connection,
                const ValidateAuthorizationTokenOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `ValidateAuthorizationTokenOperation`
             * @param request The request used for the
             * `ValidateAuthorizationTokenOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const ValidateAuthorizationTokenRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<ValidateAuthorizationTokenResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class RestartComponentOperationContext : public OperationModelContext
        {
          public:
            RestartComponentOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class RestartComponentResult
        {
          public:
            RestartComponentResult() noexcept {}
            RestartComponentResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            RestartComponentResponse *GetOperationResponse() const noexcept
            {
                return static_cast<RestartComponentResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class RestartComponentOperation : public ClientOperation
        {
          public:
            RestartComponentOperation(
                ClientConnection &connection,
                const RestartComponentOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `RestartComponentOperation`
             * @param request The request used for the `RestartComponentOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const RestartComponentRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<RestartComponentResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class GetLocalDeploymentStatusOperationContext : public OperationModelContext
        {
          public:
            GetLocalDeploymentStatusOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class GetLocalDeploymentStatusResult
        {
          public:
            GetLocalDeploymentStatusResult() noexcept {}
            GetLocalDeploymentStatusResult(TaggedResult &&taggedResult) noexcept
                : m_taggedResult(std::move(taggedResult))
            {
            }
            GetLocalDeploymentStatusResponse *GetOperationResponse() const noexcept
            {
                return static_cast<GetLocalDeploymentStatusResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class GetLocalDeploymentStatusOperation : public ClientOperation
        {
          public:
            GetLocalDeploymentStatusOperation(
                ClientConnection &connection,
                const GetLocalDeploymentStatusOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `GetLocalDeploymentStatusOperation`
             * @param request The request used for the `GetLocalDeploymentStatusOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const GetLocalDeploymentStatusRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<GetLocalDeploymentStatusResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class GetSecretValueOperationContext : public OperationModelContext
        {
          public:
            GetSecretValueOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class GetSecretValueResult
        {
          public:
            GetSecretValueResult() noexcept {}
            GetSecretValueResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            GetSecretValueResponse *GetOperationResponse() const noexcept
            {
                return static_cast<GetSecretValueResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class GetSecretValueOperation : public ClientOperation
        {
          public:
            GetSecretValueOperation(
                ClientConnection &connection,
                const GetSecretValueOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `GetSecretValueOperation`
             * @param request The request used for the `GetSecretValueOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const GetSecretValueRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<GetSecretValueResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class UpdateStateOperationContext : public OperationModelContext
        {
          public:
            UpdateStateOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class UpdateStateResult
        {
          public:
            UpdateStateResult() noexcept {}
            UpdateStateResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            UpdateStateResponse *GetOperationResponse() const noexcept
            {
                return static_cast<UpdateStateResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class UpdateStateOperation : public ClientOperation
        {
          public:
            UpdateStateOperation(
                ClientConnection &connection,
                const UpdateStateOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `UpdateStateOperation`
             * @param request The request used for the `UpdateStateOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const UpdateStateRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<UpdateStateResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class ListNamedShadowsForThingOperationContext : public OperationModelContext
        {
          public:
            ListNamedShadowsForThingOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class ListNamedShadowsForThingResult
        {
          public:
            ListNamedShadowsForThingResult() noexcept {}
            ListNamedShadowsForThingResult(TaggedResult &&taggedResult) noexcept
                : m_taggedResult(std::move(taggedResult))
            {
            }
            ListNamedShadowsForThingResponse *GetOperationResponse() const noexcept
            {
                return static_cast<ListNamedShadowsForThingResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class ListNamedShadowsForThingOperation : public ClientOperation
        {
          public:
            ListNamedShadowsForThingOperation(
                ClientConnection &connection,
                const ListNamedShadowsForThingOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `ListNamedShadowsForThingOperation`
             * @param request The request used for the `ListNamedShadowsForThingOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const ListNamedShadowsForThingRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<ListNamedShadowsForThingResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class SubscribeToComponentUpdatesStreamHandler : public StreamResponseHandler
        {
          public:
            virtual void OnStreamEvent(ComponentUpdatePolicyEvents *response) { (void)response; }

            /**
             * A callback that is invoked when an error occurs while parsing a message
             * from the stream.
             * @param rpcError The RPC error containing the status and possibly a CRT
             * error.
             */
            virtual bool OnStreamError(RpcError rpcError)
            {
                (void)rpcError;
                return true;
            }

            /**
             * A callback that is invoked upon receiving an error of type `ServiceError`.
             * @param operationError The error message being received.
             */
            virtual bool OnStreamError(ServiceError *operationError)
            {
                (void)operationError;
                return true;
            }

            /**
             * A callback that is invoked upon receiving an error of type
             * `ResourceNotFoundError`.
             * @param operationError The error message being received.
             */
            virtual bool OnStreamError(ResourceNotFoundError *operationError)
            {
                (void)operationError;
                return true;
            }

            /**
             * A callback that is invoked upon receiving ANY error response from the
             * server.
             * @param operationError The error message being received.
             */
            virtual bool OnStreamError(OperationError *operationError)
            {
                (void)operationError;
                return true;
            }

          private:
            /**
             * Invoked when a message is received on this continuation.
             */
            void OnStreamEvent(Aws::Crt::ScopedResource<AbstractShapeBase> response) override;
            /**
             * Invoked when a message is received on this continuation but results in an
             * error.
             *
             * This callback can return true so that the stream is closed afterwards.
             */
            bool OnStreamError(Aws::Crt::ScopedResource<OperationError> error, RpcError rpcError) override;
        };
        class SubscribeToComponentUpdatesOperationContext : public OperationModelContext
        {
          public:
            SubscribeToComponentUpdatesOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class SubscribeToComponentUpdatesResult
        {
          public:
            SubscribeToComponentUpdatesResult() noexcept {}
            SubscribeToComponentUpdatesResult(TaggedResult &&taggedResult) noexcept
                : m_taggedResult(std::move(taggedResult))
            {
            }
            SubscribeToComponentUpdatesResponse *GetOperationResponse() const noexcept
            {
                return static_cast<SubscribeToComponentUpdatesResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class SubscribeToComponentUpdatesOperation : public ClientOperation
        {
          public:
            SubscribeToComponentUpdatesOperation(
                ClientConnection &connection,
                SubscribeToComponentUpdatesStreamHandler *streamHandler,
                const SubscribeToComponentUpdatesOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            SubscribeToComponentUpdatesOperation(
                ClientConnection &connection,
                std::shared_ptr<SubscribeToComponentUpdatesStreamHandler> streamHandler,
                const SubscribeToComponentUpdatesOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `SubscribeToComponentUpdatesOperation`
             * @param request The request used for the
             * `SubscribeToComponentUpdatesOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const SubscribeToComponentUpdatesRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<SubscribeToComponentUpdatesResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;

          private:
            std::shared_ptr<SubscribeToComponentUpdatesStreamHandler> pinnedHandler;
        };

        class ListLocalDeploymentsOperationContext : public OperationModelContext
        {
          public:
            ListLocalDeploymentsOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class ListLocalDeploymentsResult
        {
          public:
            ListLocalDeploymentsResult() noexcept {}
            ListLocalDeploymentsResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult))
            {
            }
            ListLocalDeploymentsResponse *GetOperationResponse() const noexcept
            {
                return static_cast<ListLocalDeploymentsResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class ListLocalDeploymentsOperation : public ClientOperation
        {
          public:
            ListLocalDeploymentsOperation(
                ClientConnection &connection,
                const ListLocalDeploymentsOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `ListLocalDeploymentsOperation`
             * @param request The request used for the `ListLocalDeploymentsOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const ListLocalDeploymentsRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<ListLocalDeploymentsResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class StopComponentOperationContext : public OperationModelContext
        {
          public:
            StopComponentOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class StopComponentResult
        {
          public:
            StopComponentResult() noexcept {}
            StopComponentResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            StopComponentResponse *GetOperationResponse() const noexcept
            {
                return static_cast<StopComponentResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class StopComponentOperation : public ClientOperation
        {
          public:
            StopComponentOperation(
                ClientConnection &connection,
                const StopComponentOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `StopComponentOperation`
             * @param request The request used for the `StopComponentOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const StopComponentRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<StopComponentResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class PauseComponentOperationContext : public OperationModelContext
        {
          public:
            PauseComponentOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class PauseComponentResult
        {
          public:
            PauseComponentResult() noexcept {}
            PauseComponentResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult)) {}
            PauseComponentResponse *GetOperationResponse() const noexcept
            {
                return static_cast<PauseComponentResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class PauseComponentOperation : public ClientOperation
        {
          public:
            PauseComponentOperation(
                ClientConnection &connection,
                const PauseComponentOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `PauseComponentOperation`
             * @param request The request used for the `PauseComponentOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const PauseComponentRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<PauseComponentResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class CreateLocalDeploymentOperationContext : public OperationModelContext
        {
          public:
            CreateLocalDeploymentOperationContext(const GreengrassCoreIpcServiceModel &serviceModel) noexcept;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateInitialResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::ScopedResource<AbstractShapeBase> AllocateStreamingResponseFromPayload(
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            Aws::Crt::String GetRequestModelName() const noexcept override;
            Aws::Crt::String GetInitialResponseModelName() const noexcept override;
            Aws::Crt::Optional<Aws::Crt::String> GetStreamingResponseModelName() const noexcept override;
            Aws::Crt::String GetOperationName() const noexcept override;
        };

        class CreateLocalDeploymentResult
        {
          public:
            CreateLocalDeploymentResult() noexcept {}
            CreateLocalDeploymentResult(TaggedResult &&taggedResult) noexcept : m_taggedResult(std::move(taggedResult))
            {
            }
            CreateLocalDeploymentResponse *GetOperationResponse() const noexcept
            {
                return static_cast<CreateLocalDeploymentResponse *>(m_taggedResult.GetOperationResponse());
            }
            /**
             * @return true if the response is associated with an expected response;
             * false if the response is associated with an error.
             */
            operator bool() const noexcept { return m_taggedResult == true; }
            OperationError *GetOperationError() const noexcept { return m_taggedResult.GetOperationError(); }
            RpcError GetRpcError() const noexcept { return m_taggedResult.GetRpcError(); }
            ResultType GetResultType() const noexcept { return m_taggedResult.GetResultType(); }

          private:
            TaggedResult m_taggedResult;
        };

        class CreateLocalDeploymentOperation : public ClientOperation
        {
          public:
            CreateLocalDeploymentOperation(
                ClientConnection &connection,
                const CreateLocalDeploymentOperationContext &operationContext,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) noexcept;
            /**
             * Used to activate a stream for the `CreateLocalDeploymentOperation`
             * @param request The request used for the `CreateLocalDeploymentOperation`
             * @param onMessageFlushCallback An optional callback that is invoked when the
             * request is flushed.
             * @return An `RpcError` that can be used to check whether the stream was
             * activated.
             */
            std::future<RpcError> Activate(
                const CreateLocalDeploymentRequest &request,
                OnMessageFlushCallback onMessageFlushCallback = nullptr) noexcept;
            /**
             * Retrieve the result from activating the stream.
             */
            std::future<CreateLocalDeploymentResult> GetResult() noexcept;

          protected:
            Aws::Crt::String GetModelName() const noexcept override;
        };

        class GreengrassCoreIpcServiceModel : public ServiceModel
        {
          public:
            GreengrassCoreIpcServiceModel() noexcept;
            Aws::Crt::ScopedResource<OperationError> AllocateOperationErrorFromPayload(
                const Aws::Crt::String &errorModelName,
                Aws::Crt::StringView stringView,
                Aws::Crt::Allocator *allocator = Aws::Crt::g_allocator) const noexcept override;
            void AssignModelNameToErrorResponse(Aws::Crt::String, ErrorResponseFactory) noexcept;

          private:
            friend class GreengrassCoreIpcClient;
            SubscribeToIoTCoreOperationContext m_subscribeToIoTCoreOperationContext;
            ResumeComponentOperationContext m_resumeComponentOperationContext;
            PublishToIoTCoreOperationContext m_publishToIoTCoreOperationContext;
            SubscribeToConfigurationUpdateOperationContext m_subscribeToConfigurationUpdateOperationContext;
            DeleteThingShadowOperationContext m_deleteThingShadowOperationContext;
            DeferComponentUpdateOperationContext m_deferComponentUpdateOperationContext;
            SubscribeToValidateConfigurationUpdatesOperationContext
                m_subscribeToValidateConfigurationUpdatesOperationContext;
            GetConfigurationOperationContext m_getConfigurationOperationContext;
            SubscribeToTopicOperationContext m_subscribeToTopicOperationContext;
            GetComponentDetailsOperationContext m_getComponentDetailsOperationContext;
            PublishToTopicOperationContext m_publishToTopicOperationContext;
            ListComponentsOperationContext m_listComponentsOperationContext;
            CreateDebugPasswordOperationContext m_createDebugPasswordOperationContext;
            GetThingShadowOperationContext m_getThingShadowOperationContext;
            SendConfigurationValidityReportOperationContext m_sendConfigurationValidityReportOperationContext;
            UpdateThingShadowOperationContext m_updateThingShadowOperationContext;
            UpdateConfigurationOperationContext m_updateConfigurationOperationContext;
            ValidateAuthorizationTokenOperationContext m_validateAuthorizationTokenOperationContext;
            RestartComponentOperationContext m_restartComponentOperationContext;
            GetLocalDeploymentStatusOperationContext m_getLocalDeploymentStatusOperationContext;
            GetSecretValueOperationContext m_getSecretValueOperationContext;
            UpdateStateOperationContext m_updateStateOperationContext;
            ListNamedShadowsForThingOperationContext m_listNamedShadowsForThingOperationContext;
            SubscribeToComponentUpdatesOperationContext m_subscribeToComponentUpdatesOperationContext;
            ListLocalDeploymentsOperationContext m_listLocalDeploymentsOperationContext;
            StopComponentOperationContext m_stopComponentOperationContext;
            PauseComponentOperationContext m_pauseComponentOperationContext;
            CreateLocalDeploymentOperationContext m_createLocalDeploymentOperationContext;
            Aws::Crt::Map<Aws::Crt::String, ErrorResponseFactory> m_modelNameToErrorResponse;
        };
    } // namespace Greengrass
} // namespace Aws
