// Generated by scripts/vendor-prelude.mbtx from smithy-lang/smithy at 30bdab593f0c2cdf96036782cc3ce15c43a711ef.
// Copyright Amazon.com, Inc. or its affiliates. Apache-2.0.

///|
fn prelude_text() -> String {
  (
    #|// This model defines the Smithy prelude model.
    #|//
    #|// Shapes in the prelude model that are not marked as `@private` can be
    #|// referenced using a relative shape ID.
    #|$version: "2.0"
    #|
    #|namespace smithy.api
    #|
    #|// --- The following shapes are publicly available prelude shapes.
    #|string String
    #|
    #|blob Blob
    #|
    #|bigInteger BigInteger
    #|
    #|bigDecimal BigDecimal
    #|
    #|timestamp Timestamp
    #|
    #|document Document
    #|
    #|boolean Boolean
    #|
    #|byte Byte
    #|
    #|short Short
    #|
    #|integer Integer
    #|
    #|long Long
    #|
    #|float Float
    #|
    #|double Double
    #|
    #|@default(false)
    #|boolean PrimitiveBoolean
    #|
    #|@default(0)
    #|byte PrimitiveByte
    #|
    #|@default(0)
    #|short PrimitiveShort
    #|
    #|@default(0)
    #|integer PrimitiveInteger
    #|
    #|@default(0)
    #|long PrimitiveLong
    #|
    #|@default(0)
    #|float PrimitiveFloat
    #|
    #|@default(0)
    #|double PrimitiveDouble
    #|
    #|// The `Unit` type is a publicly available "unit" value type. This shape
    #|// is the only shape in Smithy allowed to be marked with the `@unitType` trait.
    #|@unitType
    #|structure Unit {}
    #|
    #|// --- Shapes below are traits and the private shapes that define them.
    #|/// Makes a shape a trait.
    #|@trait(
    #|    selector: ":is(simpleType, list, map, structure, union)"
    #|    breakingChanges: [
    #|        {
    #|            change: "presence"
    #|        }
    #|        {
    #|            path: "/structurallyExclusive"
    #|            change: "any"
    #|        }
    #|        {
    #|            path: "/conflicts"
    #|            change: "update"
    #|            severity: "NOTE"
    #|            message: "Adding more conflicts to a trait could cause previously written models to fail validation."
    #|        }
    #|    ]
    #|)
    #|structure trait {
    #|    /// The valid places in a model that the trait can be applied.
    #|    selector: String
    #|
    #|    /// Whether or not only a single member in a shape can have this trait.
    #|    /// This only has an effect on members of structure shapes.
    #|    structurallyExclusive: StructurallyExclusive
    #|
    #|    /// The traits that this trait conflicts with.
    #|    conflicts: NonEmptyStringList
    #|
    #|    /// Defines the backward compatibility rules of the trait.
    #|    breakingChanges: TraitDiffRules
    #|}
    #|
    #|@private
    #|@length(min: 1)
    #|list TraitDiffRules {
    #|    member: TraitDiffRule
    #|}
    #|
    #|@private
    #|structure TraitDiffRule {
    #|    /// Defines a JSON Pointer to the value to evaluate.
    #|    path: String
    #|
    #|    /// Defines the type of change that is not allowed.
    #|    @required
    #|    change: TraitChangeType
    #|
    #|    /// Defines the severity of the change. Defaults to ERROR if not defined.
    #|    severity: Severity = "ERROR"
    #|
    #|    /// Provides a reason why the change is potentially backward incompatible.
    #|    message: String
    #|}
    #|
    #|@private
    #|enum TraitChangeType {
    #|    /// Emit when a trait is modified.
    #|    UPDATE = "update"
    #|
    #|    /// Emit when a trait or value is added that previously did not exist.
    #|    ADD = "add"
    #|
    #|    /// Emit when a trait or value is removed.
    #|    REMOVE = "remove"
    #|
    #|    /// Emit when a trait is added or removed.
    #|    PRESENCE = "presence"
    #|
    #|    /// Emit when any change occurs.
    #|    ANY = "any"
    #|}
    #|
    #|@private
    #|enum Severity {
    #|    /// A minor infraction occurred.
    #|    NOTE
    #|
    #|    /// An infraction occurred that needs attention.
    #|    WARNING
    #|
    #|    /// An infraction occurred that must be resolved.
    #|    DANGER
    #|
    #|    /// An unrecoverable infraction occurred.
    #|    ERROR
    #|}
    #|
    #|@private
    #|enum StructurallyExclusive {
    #|    /// Only a single member of a shape can be marked with the trait.
    #|    MEMBER = "member"
    #|
    #|    /// Only a single member of a shape can target a shape marked with
    #|    /// this trait.
    #|    TARGET = "target"
    #|}
    #|
    #|/// Marks a shape or member as deprecated.
    #|@trait
    #|structure deprecated {
    #|    /// The reason for deprecation.
    #|    message: String
    #|
    #|    /// A description of when the shape was deprecated (e.g., a date or
    #|    /// version).
    #|    since: String
    #|}
    #|
    #|/// Used only in Smithy 1.0 to indicate that a shape is boxed.
    #|///
    #|/// This trait cannot be used in Smithy 2.0 models. When a boxed shape is the
    #|/// target of a member, the member may or may not contain a value, and the
    #|/// member has no default value.
    #|@trait(
    #|    selector: """
    #|        :test(boolean, byte, short, integer, long, float, double,
    #|        member > :test(boolean, byte, short, integer, long, float, double))"""
    #|)
    #|structure box {}
    #|
    #|/// Adds documentation to a shape or member using CommonMark syntax.
    #|@trait
    #|string documentation
    #|
    #|/// Provides a link to additional documentation.
    #|@trait
    #|@length(min: 1)
    #|map externalDocumentation {
    #|    key: NonEmptyString
    #|    value: NonEmptyString
    #|}
    #|
    #|/// Defines the ordered list of supported authentication schemes.
    #|@trait(selector: ":is(service, operation)")
    #|@uniqueItems
    #|list auth {
    #|    member: AuthTraitReference
    #|}
    #|
    #|/// A string that must target an auth trait.
    #|@idRef(selector: "[trait|authDefinition]")
    #|@private
    #|string AuthTraitReference
    #|
    #|/// Marks a trait as a protocol defining trait.
    #|///
    #|/// The targeted trait must only be applied to service shapes, must be a
    #|/// structure, and must have the `trait` trait.
    #|@trait(
    #|    selector: "structure[trait|trait]"
    #|    breakingChanges: [
    #|        {
    #|            change: "presence"
    #|        }
    #|    ]
    #|)
    #|structure protocolDefinition {
    #|    /// The list of traits that protocol implementations must understand in
    #|    /// order to successfully use the protocol.
    #|    traits: TraitShapeIdList
    #|
    #|    /// Set to true if inline documents are not supported by this protocol.
    #|    @deprecated(message: "Use the `@traitValidators` trait instead")
    #|    noInlineDocumentSupport: Boolean
    #|}
    #|
    #|@private
    #|list TraitShapeIdList {
    #|    member: TraitShapeId
    #|}
    #|
    #|@private
    #|@idRef(failWhenMissing: true, selector: "[trait|trait]")
    #|string TraitShapeId
    #|
    #|/// Marks a trait as an auth scheme defining trait.
    #|///
    #|/// The targeted trait must only be applied to service shapes or operation
    #|/// shapes, must be a structure, and must have the `trait` trait.
    #|@trait(
    #|    selector: "structure[trait|trait]"
    #|    breakingChanges: [
    #|        {
    #|            change: "presence"
    #|        }
    #|    ]
    #|)
    #|structure authDefinition {
    #|    /// The list of traits that auth implementations must understand in order
    #|    /// to successfully use the scheme.
    #|    traits: TraitShapeIdList
    #|}
    #|
    #|/// HTTP Basic Authentication as defined in [RFC 2617](https://tools.ietf.org/html/rfc2617.html).
    #|@trait(
    #|    selector: "service"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|        }
    #|    ]
    #|)
    #|@authDefinition
    #|@externalDocumentation("RFC 2617": "https://tools.ietf.org/html/rfc2617.html")
    #|structure httpBasicAuth {}
    #|
    #|/// HTTP Digest Authentication as defined in [RFC 2617](https://tools.ietf.org/html/rfc2617.html).
    #|@trait(
    #|    selector: "service"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|        }
    #|    ]
    #|)
    #|@authDefinition
    #|@externalDocumentation("RFC 2617": "https://tools.ietf.org/html/rfc2617.html")
    #|structure httpDigestAuth {}
    #|
    #|/// HTTP Bearer Authentication as defined in [RFC 6750](https://tools.ietf.org/html/rfc6750.html).
    #|@trait(
    #|    selector: "service"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|        }
    #|    ]
    #|)
    #|@authDefinition
    #|@externalDocumentation("RFC 6750": "https://tools.ietf.org/html/rfc6750.html")
    #|structure httpBearerAuth {}
    #|
    #|/// An HTTP-specific authentication scheme that sends an arbitrary API key in
    #|/// a header or query string parameter.
    #|@trait(
    #|    selector: "service"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|        }
    #|    ]
    #|)
    #|@authDefinition
    #|structure httpApiKeyAuth {
    #|    /// Defines the name of the HTTP header or query string parameter that
    #|    /// contains the API key.
    #|    @required
    #|    name: NonEmptyString
    #|
    #|    /// Defines the location of where the key is serialized. This value can
    #|    /// be set to `"header"` or `"query"`.
    #|    @required
    #|    in: HttpApiKeyLocations
    #|
    #|    /// Defines the security scheme to use in the ``Authorization`` header.
    #|    /// This can only be set if the "in" property is set to ``header``.
    #|    scheme: NonEmptyString
    #|}
    #|
    #|/// A meta-trait used to apply validation to a specific shape in the model that a trait is applied to.
    #|///
    #|/// `traitValidators` is a map of validation event IDs to validators to apply to a shape.
    #|/// Selectors are used to identify shapes that are incompatible with a constrained trait.
    #|/// The shape with the targeted trait applied MUST be a valid entry point for the selector.
    #|///
    #|/// The following example defines a protocol that does not support document types. Each matching member found in the
    #|/// closure of an attached shape emits a validation event:
    #|///
    #|/// ```
    #|/// @trait(selector: "service")
    #|/// @traitValidators(
    #|///     "myCustomProtocol.NoDocuments": {
    #|///         selector: "~> member :test(> document)"
    #|///         message: "This protocol does not support document types"
    #|///     }
    #|/// )
    #|/// @protocolDefinition
    #|/// structure myCustomProtocol {}
    #|/// ```
    #|@trait(selector: "[trait|trait]")
    #|map traitValidators {
    #|    /// The validation event ID to emit when the constraint finds an incompatible shape.
    #|    @length(min: 1)
    #|    key: String
    #|
    #|    /// The validator to apply.
    #|    value: TraitValidator
    #|}
    #|
    #|@private
    #|structure TraitValidator {
    #|    /// A Smithy selector that receives only the shape to which the `traitValidators` trait is applied.
    #|    /// Any shape yielded by the selector is considered incompatible with the trait.
    #|    @required
    #|    selector: String
    #|
    #|    /// A message to use when a matching shape is found.
    #|    message: String
    #|
    #|    /// The severity to use when a matching shape is found.
    #|    severity: Severity = "ERROR"
    #|}
    #|
    #|/// Defines a type for a metadata key.
    #|///
    #|/// If a matching key is defined in the model, its value will be validated
    #|/// according to the targeted shape.
    #|///
    #|/// The type for any metadata key MUST only be defined once.
    #|@trait(selector: "dataType :not([trait|input]) :not([trait|output])")
    #|structure metadata {
    #|    /// The metadata key to validate. Each key MUST only be defined once.
    #|    @required
    #|    @length(min: 1)
    #|    key: String
    #|}
    #|
    #|/// Defines named closures of shapes that consumers like code generators can
    #|/// reference by id.
    #|@private
    #|@metadata(key: "shapeClosures")
    #|list ShapeClosures {
    #|    member: ShapeClosure
    #|}
    #|
    #|/// A defined closure of shapes that consumers like code generators can
    #|/// reference by id.
    #|@private
    #|structure ShapeClosure {
    #|    /// The namespaced identifier of the closure. Used by consumers to refer
    #|    /// to this closure. The id follows the same format as a shape id, MUST
    #|    /// be unique across all closures in the model, and MUST NOT refer to a
    #|    /// shape that exists in the model.
    #|    ///
    #|    /// This identifier is not intended to be semantically significant. The
    #|    /// requirement for a namespace is intended to reduce the chance for naming
    #|    /// collisions, not to suggest the namespace that any generated artifacts
    #|    /// must be generated into.
    #|    @required
    #|    id: ClosureId
    #|
    #|    /// Namespaces whose shapes are included in the closure.
    #|    includeNamespaces: Namespaces = []
    #|
    #|    /// A Smithy selector whose matched shapes are included in the closure.
    #|    @length(min: 1)
    #|    includeBySelector: String
    #|
    #|    /// Disambiguates shape name conflicts in the closure. Map keys are
    #|    /// shape ids contained in the closure, and map values are the
    #|    /// disambiguated shape names (without a namespace) to use in the
    #|    /// context of the closure. Each given map value MUST match the
    #|    /// `Identifier` production used for shape ids. Renaming a shape
    #|    /// does not give the shape a new shape id.
    #|    ///
    #|    /// - No renamed shape name can case-insensitively match any other
    #|    ///   renamed shape name or the name of a non-renamed shape contained
    #|    ///   in the closure.
    #|    /// - Member shapes MAY NOT be renamed.
    #|    /// - Service, resource, and operation shapes MAY NOT be renamed.
    #|    ///   Renaming shapes is intended for incidental naming conflicts,
    #|    ///   not for renaming the fundamental concepts of an API.
    #|    /// - Shapes from other namespaces marked as private MAY be renamed.
    #|    /// - A rename MUST use a name that is case-sensitively different
    #|    ///   from the original shape id name.
    #|    rename: Renames = {}
    #|
    #|    /// Documentation for the shape closure in CommonMark format.
    #|    documentation: CommonMark
    #|}
    #|
    #|/// An identifier for a closure. This matches the shape id format.
    #|@private
    #|// The idRef trait is being used here to validate format.
    #|@idRef(failWhenMissing: false)
    #|string ClosureId
    #|
    #|/// A list of Smithy namespaces.
    #|@private
    #|@uniqueItems
    #|list Namespaces {
    #|    member: String
    #|}
    #|
    #|/// Disambiguates shape name conflicts in a closure. Map keys are
    #|/// shape ids contained in the closure, and map values are the
    #|/// disambiguated shape names (without a namespace) to use in the
    #|/// context of the closure. Each given map value MUST match the
    #|/// `Identifier` production used for shape ids. Renaming a shape
    #|/// does not give the shape a new shape id.
    #|///
    #|/// - No renamed shape name can case-insensitively match any other
    #|///   renamed shape name or the name of a non-renamed shape contained
    #|///   in the closure.
    #|/// - Member shapes MAY NOT be renamed.
    #|/// - Service, resource, and operation shapes MAY NOT be renamed.
    #|///   Renaming shapes is intended for incidental naming conflicts,
    #|///   not for renaming the fundamental concepts of an API.
    #|/// - Shapes from other namespaces marked as private MAY be renamed.
    #|/// - A rename MUST use a name that is case-sensitively different
    #|///   from the original shape id name.
    #|@private
    #|map Renames {
    #|    /// The id of the shape to rename.
    #|    @idRef(
    #|        failWhenMissing: true
    #|        selector: ":not(:is(member, service, resource, operation))"
    #|        errorMessage: """
    #|            Renames must target shapes that are in the model and must not target \
    #|            services, resources, operations, or members."""
    #|    )
    #|    key: String
    #|
    #|    /// The new name for the shape.
    #|    value: Identifier
    #|}
    #|
    #|/// A string containing CommonMark-formatted text.
    #|@private
    #|@externalDocumentation("CommonMark Specification": "https://commonmark.org/")
    #|@mediaType("text/markdown; charset=UTF-8; variant=CommonMark")
    #|string CommonMark
    #|
    #|/// A string matching the `Identifier` ABNF production used for shape names.
    #|@private
    #|@pattern("^(_+[a-zA-Z0-9]|[a-zA-Z])\\w*$")
    #|string Identifier
    #|
    #|/// Provides a structure member with a default value. When added to root
    #|/// level shapes, requires that every targeting structure member defines the
    #|/// same default value on the member or sets a default of null.
    #|///
    #|/// This trait can currently only be used in Smithy 2.0 models.
    #|@trait(selector: ":is(simpleType, list, map, structure > member :test(> :is(simpleType, list, map)))")
    #|document default
    #|
    #|/// Indicates that the default trait was added to a member.
    #|@trait(
    #|    selector: "structure > member [trait|default]"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|        }
    #|    ]
    #|)
    #|structure addedDefault {}
    #|
    #|/// Requires that non-authoritative generators like clients treat a structure
    #|/// member as nullable regardless of if the member is also marked with the
    #|/// required trait.
    #|@trait(selector: "structure > member")
    #|structure clientOptional {}
    #|
    #|@private
    #|enum HttpApiKeyLocations {
    #|    HEADER = "header"
    #|    QUERY = "query"
    #|}
    #|
    #|/// Indicates that an operation can be called without authentication.
    #|@trait(
    #|    selector: "operation"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|        }
    #|    ]
    #|)
    #|structure optionalAuth {}
    #|
    #|/// Provides example inputs and outputs for operations.
    #|@trait(selector: "operation")
    #|list examples {
    #|    member: Example
    #|}
    #|
    #|@private
    #|structure Example {
    #|    @required
    #|    title: String
    #|
    #|    documentation: String
    #|
    #|    input: Document
    #|
    #|    output: Document
    #|
    #|    error: ExampleError
    #|
    #|    allowConstraintErrors: Boolean
    #|}
    #|
    #|@private
    #|structure ExampleError {
    #|    @idRef(selector: "structure[trait|error]")
    #|    shapeId: String
    #|
    #|    content: Document
    #|}
    #|
    #|/// Indicates that a structure shape represents an error.
    #|///
    #|/// All shapes referenced by the errors list of an operation MUST be targeted
    #|/// with this trait.
    #|@trait(
    #|    selector: "structure"
    #|    conflicts: [trait]
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|enum error {
    #|    CLIENT = "client"
    #|    SERVER = "server"
    #|}
    #|
    #|/// Indicates that an error MAY be retried by the client.
    #|@trait(
    #|    selector: "structure[trait|error]"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|        }
    #|    ]
    #|)
    #|structure retryable {
    #|    /// Classifies the retry as throttling.
    #|    throttling: Boolean
    #|}
    #|
    #|/// Indicates that an operation is effectively read-only.
    #|@trait(
    #|    selector: "operation"
    #|    conflicts: [idempotent]
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|        }
    #|    ]
    #|)
    #|structure readonly {}
    #|
    #|/// Indicates that the intended effect on the server of multiple identical
    #|/// requests with an operation is the same as the effect for a single such
    #|/// request.
    #|@trait(
    #|    selector: "operation"
    #|    conflicts: [readonly]
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|        }
    #|    ]
    #|)
    #|structure idempotent {
    #|    /// Describes the errors returned when the operation is called and the
    #|    /// resource already exists. Applicable to create lifecycle operations.
    #|    /// An empty list indicates the operation returns a successful response.
    #|    exists: IdempotentErrors
    #|
    #|    /// Describes the errors returned when the operation is called and the
    #|    /// resource does not exist. Applicable to delete lifecycle operations.
    #|    /// An empty list indicates the operation returns a successful response.
    #|    notFound: IdempotentErrors
    #|}
    #|
    #|@private
    #|list IdempotentErrors {
    #|    @idRef(selector: "[trait|error]")
    #|    member: String
    #|}
    #|
    #|/// Defines the input member of an operation that is used by the server to
    #|/// identify and discard replayed requests.
    #|@trait(
    #|    selector: "structure > :test(member > string)"
    #|    structurallyExclusive: "member"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|        }
    #|    ]
    #|)
    #|@notProperty
    #|structure idempotencyToken {}
    #|
    #|/// Shapes marked with the internal trait are meant only for internal use and
    #|/// must not be exposed to customers.
    #|@trait(
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|            severity: "WARNING"
    #|            message: "Removing the @internal trait makes a shape externally visible."
    #|        }
    #|    ]
    #|)
    #|structure internal {}
    #|
    #|/// Allows a serialized object property name to differ from a structure member
    #|/// name used in the model.
    #|@trait(
    #|    selector: ":is(structure, union) > member"
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|string jsonName
    #|
    #|/// Serializes an object property as an XML attribute rather than a nested XML
    #|/// element.
    #|@trait(
    #|    selector: "structure > :test(member > :test(boolean, number, string, timestamp))"
    #|    conflicts: [xmlNamespace]
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|structure xmlAttribute {}
    #|
    #|/// Unwraps the values of a list, set, or map into the containing
    #|/// structure/union.
    #|@trait(
    #|    selector: ":is(structure, union) > :test(member > :test(list, map))"
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|structure xmlFlattened {}
    #|
    #|/// Changes the serialized element or attribute name of a structure, union,
    #|/// or member.
    #|@trait(
    #|    selector: ":is(structure, union, member)"
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|@pattern("^[a-zA-Z_][a-zA-Z_0-9-]*(:[a-zA-Z_][a-zA-Z_0-9-]*)?$")
    #|string xmlName
    #|
    #|/// Adds an xmlns namespace definition URI to an XML element.
    #|@trait(
    #|    selector: ":is(service, member, simpleType, list, map, structure, union)"
    #|    conflicts: [xmlAttribute]
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|structure xmlNamespace {
    #|    /// The namespace URI for scoping this XML element.
    #|    @required
    #|    uri: NonEmptyString
    #|
    #|    /// The prefix for the given namespace.
    #|    @pattern("^[a-zA-Z_][a-zA-Z_0-9-]*$")
    #|    prefix: NonEmptyString
    #|}
    #|
    #|@private
    #|@length(min: 1)
    #|string NonEmptyString
    #|
    #|/// Indicates that the put lifecycle operation of a resource can only be used
    #|/// to create a resource and cannot replace an existing resource.
    #|@trait(selector: "resource:test(-[put]->)")
    #|structure noReplace {}
    #|
    #|/// Describes the contents of a blob shape using a media type as defined by
    #|/// RFC 6838 (e.g., "video/quicktime").
    #|@trait(
    #|    selector: ":is(blob, string)"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|        }
    #|    ]
    #|)
    #|string mediaType
    #|
    #|/// Defines the resource shapes that are referenced by a string shape or a
    #|/// structure shape and the members of the structure that provide values for
    #|/// the identifiers of the resource.
    #|@trait(selector: ":is(structure, string)")
    #|list references {
    #|    member: Reference
    #|}
    #|
    #|@private
    #|structure Reference {
    #|    /// The shape ID of the referenced resource.
    #|    @required
    #|    resource: NonEmptyString
    #|
    #|    /// Defines a mapping of each resource identifier name to a structure member
    #|    /// name that provides its value. Each key in the map MUST refer to one of the
    #|    /// identifier names in the identifiers property of the resource, and each
    #|    /// value in the map MUST refer to a valid structure member name that targets
    #|    /// a string shape.
    #|    ids: NonEmptyStringMap
    #|
    #|    /// Providing a service makes the reference specific to a particular binding
    #|    /// of the resource to a service. When omitted, the reference is late-bound to
    #|    /// a service, meaning the reference is assumed to be a reference to the
    #|    /// resource bound to the service currently in use by the client or server.
    #|    service: NonEmptyString
    #|
    #|    /// Defines the semantics of the relationship. The rel property SHOULD
    #|    /// contain a link relation as defined in RFC 5988#section-4.
    #|    rel: NonEmptyString
    #|}
    #|
    #|@private
    #|map NonEmptyStringMap {
    #|    key: NonEmptyString
    #|    value: NonEmptyString
    #|}
    #|
    #|/// Indicates that the targeted structure member provides an identifier for
    #|/// a resource.
    #|@trait(
    #|    selector: "structure > :test(member[trait|required] > string)"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|        }
    #|    ]
    #|)
    #|@length(min: 1)
    #|@notProperty
    #|string resourceIdentifier
    #|
    #|/// Prevents models defined in a different namespace from referencing the
    #|/// targeted shape.
    #|@trait
    #|structure private {}
    #|
    #|/// Indicates that the data stored in the shape is sensitive and MUST be
    #|/// handled with care.
    #|@trait(selector: ":not(:test(service, operation, resource, member))")
    #|structure sensitive {}
    #|
    #|/// Defines the version or date in which a shape or member was added to the
    #|/// model.
    #|@trait
    #|string since
    #|
    #|/// Indicates that the data stored in the shape is very large and should not
    #|/// be stored in memory, or that the size of the data stored in the shape is
    #|/// unknown at the start of a request. If the target is a union then the shape
    #|/// represents a stream of events.
    #|@trait(
    #|    selector: ":is(blob, union)"
    #|    structurallyExclusive: "target"
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|structure streaming {}
    #|
    #|/// Indicates that the streaming blob must be finite and has a known size.
    #|@trait(
    #|    selector: "blob[trait|streaming]"
    #|    breakingChanges: [
    #|        {
    #|            change: "presence"
    #|        }
    #|    ]
    #|)
    #|structure requiresLength {}
    #|
    #|/// Indicates that the service may not respond immediately to requests for the targeted
    #|/// operation. This can allow services more time to prepare more detailed responses or
    #|/// allow them to hold the request open as it waits for information to become
    #|/// available.
    #|///
    #|/// When making requests for an operation targeted by this trait, clients should
    #|/// wait for at least the amount of time indicated by the `timeoutMillis` member.
    #|/// If the client's default timeout is longer, it may use the longer value.
    #|///
    #|/// Clients may allow users to configure timeouts. If a user configures a timeout
    #|/// value on a client, the client must use the user-configured value regardless of
    #|/// whether it is greater or less than `timeoutMillis`. Similarly, if the user
    #|/// configures a timeout value for a request, clients must use that value.
    #|@trait(selector: "operation")
    #|@unstable
    #|structure longPoll {
    #|    /// The amount of time in milliseconds that a client should wait for a response.
    #|    @required
    #|    @range(min: 1)
    #|    timeoutMillis: Integer
    #|}
    #|
    #|/// Tags a shape with arbitrary tag names that can be used to filter and
    #|/// group shapes in the model.
    #|@trait
    #|list tags {
    #|    member: String
    #|}
    #|
    #|/// Defines a proper name for a shape.
    #|///
    #|/// This title can be used in automatically generated documentation
    #|/// and other contexts to provide a user-friendly for shapes.
    #|@trait
    #|string title
    #|
    #|/// Constrains the acceptable values of a string to a fixed set
    #|/// of constant values.
    #|@trait(
    #|    selector: "string :not(enum)"
    #|    // It's a breaking change to change values or enums or the ordering of
    #|    // enums, but that validation happens in code to provide better error
    #|    // messages.
    #|    breakingChanges: [
    #|        {
    #|            change: "presence"
    #|        }
    #|    ]
    #|)
    #|@length(min: 1)
    #|@deprecated(message: "The enum trait is replaced by the enum shape in Smithy 2.0", since: "2.0")
    #|list enum {
    #|    member: EnumDefinition
    #|}
    #|
    #|/// An enum definition for the enum trait.
    #|@private
    #|structure EnumDefinition {
    #|    /// Defines the enum value that is sent over the wire.
    #|    @required
    #|    value: NonEmptyString
    #|
    #|    /// Defines the name that is used in code to represent this variant.
    #|    name: EnumConstantBodyName
    #|
    #|    /// Provides optional documentation about the enum constant value.
    #|    documentation: String
    #|
    #|    /// Applies a list of tags to the enum constant.
    #|    tags: NonEmptyStringList
    #|
    #|    /// Whether the enum value should be considered deprecated.
    #|    deprecated: Boolean
    #|}
    #|
    #|/// The optional name or label of the enum constant value.
    #|///
    #|/// This property is used in code generation to provide a label for
    #|/// each enum value. No two enums can have the same 'name' value.
    #|@private
    #|@pattern("^[a-zA-Z_]+[a-zA-Z_0-9]*$")
    #|string EnumConstantBodyName
    #|
    #|/// Defines the value of an enum member.
    #|@trait(selector: ":is(enum, intEnum) > member")
    #|@tags(["diff.error.const"])
    #|document enumValue
    #|
    #|/// Constrains a shape to minimum and maximum number of elements or size.
    #|@trait(selector: ":test(list, map, string, blob, member > :is(list, map, string, blob))")
    #|structure length {
    #|    /// Integer value that represents the minimum inclusive length of a shape.
    #|    min: Long
    #|
    #|    /// Integer value that represents the maximum inclusive length of a shape.
    #|    max: Long
    #|}
    #|
    #|/// Restricts allowed values of byte, short, integer, long, float, double,
    #|/// bigDecimal, and bigInteger shapes within an acceptable lower and upper
    #|/// bound.
    #|@trait(selector: ":test(number, member > number)")
    #|structure range {
    #|    /// Specifies the allowed inclusive minimum value.
    #|    min: BigDecimal
    #|
    #|    /// Specifies the allowed inclusive maximum value.
    #|    max: BigDecimal
    #|}
    #|
    #|/// Restricts string shape values to a specified regular expression.
    #|@trait(
    #|    selector: ":test(string, member > string)"
    #|    breakingChanges: [
    #|        {
    #|            change: "add"
    #|            severity: "WARNING"
    #|            message: "The @pattern trait should only be added if the string already had adhered to the pattern."
    #|        }
    #|        {
    #|            change: "update"
    #|            severity: "NOTE"
    #|            message: "Changes to the @pattern trait should generally make the string more permissive, not less."
    #|        }
    #|    ]
    #|)
    #|string pattern
    #|
    #|/// Marks a structure member as required, meaning a value for the member MUST
    #|/// be present.
    #|@trait(selector: "structure > member")
    #|structure required {}
    #|
    #|/// Configures a structure member's resource property mapping behavior.
    #|@trait(
    #|    selector: "structure > member"
    #|    conflicts: [resourceIdentifier]
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|        }
    #|        {
    #|            change: "update"
    #|        }
    #|    ]
    #|)
    #|structure property {
    #|    name: String
    #|}
    #|
    #|/// Explicitly excludes a member from resource property mapping or enables
    #|/// another trait to carry the same implied meaning.
    #|@trait(
    #|    selector: ":is(operation -[input, output]-> structure > member, operation -[input, output]-> structure > member > list > member > structure > member, [trait|trait])"
    #|    breakingChanges: [
    #|        {
    #|            change: "add"
    #|        }
    #|    ]
    #|)
    #|@notProperty
    #|structure notProperty {}
    #|
    #|/// Adjusts the resource property mapping of a lifecycle operation to the
    #|/// targeted member.
    #|@trait(
    #|    selector: "operation -[input, output]-> structure > member :test(> structure, > list > member > structure)"
    #|    structurallyExclusive: "member"
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|@notProperty
    #|structure nestedProperties {}
    #|
    #|/// Indicates that a structure member SHOULD be set.
    #|@trait(
    #|    selector: "structure > member"
    #|    conflicts: [required]
    #|)
    #|structure recommended {
    #|    /// Provides a reason why the member is recommended.
    #|    reason: String
    #|}
    #|
    #|/// Marks a list or map as sparse.
    #|@trait(
    #|    selector: ":is(list, map)"
    #|    breakingChanges: [
    #|        {
    #|            change: "presence"
    #|        }
    #|    ]
    #|)
    #|structure sparse {}
    #|
    #|/// Indicates that the items in a list MUST be unique.
    #|@trait(
    #|    selector: "list :not(> member ~> :is(float, double, document))"
    #|    conflicts: [sparse]
    #|    breakingChanges: [
    #|        {
    #|            change: "presence"
    #|            severity: "WARNING"
    #|        }
    #|    ]
    #|)
    #|structure uniqueItems {}
    #|
    #|/// Indicates that the shape is unstable and could change in the future.
    #|@trait(
    #|    breakingChanges: [
    #|        {
    #|            path: "/featureId"
    #|            change: "add"
    #|            message: "The `@unstable` trait's `featureId` cannot be added to an existing shape. A preview feature must be declared when the shape is first introduced."
    #|        }
    #|        {
    #|            path: "/featureId"
    #|            change: "update"
    #|            message: "The `@unstable` trait's `featureId` cannot be changed after setting."
    #|        }
    #|        {
    #|            path: "/featureId"
    #|            change: "remove"
    #|            message: "The `@unstable` trait's `featureId` cannot be removed after setting. Please remove the whole `unstable` trait if the shape is GA."
    #|        }
    #|    ]
    #|)
    #|structure unstable {
    #|    /// The id of the unstable feature this shape belongs to. When set, it must be defined as a key in the
    #|    /// `unstableFeatures` trait of an enclosing service.
    #|    @length(max: 100)
    #|    featureId: String
    #|}
    #|
    #|/// Defines the preview features offered by a service, keyed by `featureId`. Applied to the service shape.
    #|@trait(
    #|    selector: "service"
    #|    breakingChanges: [
    #|        {
    #|            path: "/value/since"
    #|            change: "update"
    #|            message: "The `since` date of an `@unstableFeatures` entry cannot be changed after setting."
    #|        }
    #|    ]
    #|)
    #|map unstableFeatures {
    #|    /// The id of the unstable feature.
    #|    @length(max: 100)
    #|    key: String
    #|
    #|    /// The metadata describing the unstable feature.
    #|    value: UnstableFeatureInfo
    #|}
    #|
    #|/// The metadata describing a single unstable feature.
    #|@private
    #|structure UnstableFeatureInfo {
    #|    /// The message to customers about the unstable feature.
    #|    message: String
    #|
    #|    /// The reason why this feature is unstable.
    #|    reason: UnstableReason
    #|
    #|    /// The date the feature became unstable, in `YYYY-MM-DD` format.
    #|    @pattern("^\\d{4}-\\d{2}-\\d{2}$")
    #|    since: String
    #|}
    #|
    #|@private
    #|enum UnstableReason {
    #|    /// This feature is under preview.
    #|    PREVIEW
    #|}
    #|
    #|/// The paginated trait indicates that an operation intentionally limits the
    #|/// number of results returned in a single response and that multiple
    #|/// invocations might be necessary to retrieve all results.
    #|@trait(
    #|    selector: ":is(service, operation)"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|        }
    #|        {
    #|            path: "/inputToken"
    #|            change: "update"
    #|        }
    #|        {
    #|            path: "/outputToken"
    #|            change: "update"
    #|        }
    #|        {
    #|            path: "/items"
    #|            change: "remove"
    #|        }
    #|        {
    #|            path: "/items"
    #|            change: "add"
    #|            severity: "NOTE"
    #|        }
    #|        {
    #|            path: "/items"
    #|            change: "update"
    #|            severity: "NOTE"
    #|        }
    #|        {
    #|            path: "/pageSize"
    #|            change: "update"
    #|        }
    #|        {
    #|            path: "/pageSize"
    #|            change: "remove"
    #|        }
    #|    ]
    #|)
    #|structure paginated {
    #|    /// The name of the operation input member that represents the continuation
    #|    /// token.
    #|    ///
    #|    /// When this value is provided as operation input, the service returns
    #|    /// results from where the previous response left off. This input member
    #|    /// MUST NOT be required and MUST target a string shape.
    #|    inputToken: NonEmptyString
    #|
    #|    /// The name of the operation output member that represents the
    #|    /// continuation token.
    #|    ///
    #|    /// When this value is present in operation output, it indicates that there
    #|    /// are more results to retrieve. To get the next page of results, the
    #|    /// client uses the output token as the input token of the next request.
    #|    /// This output member MUST NOT be required and MUST target a string shape.
    #|    outputToken: NonEmptyString
    #|
    #|    /// The name of a top-level output member of the operation that is the data
    #|    /// that is being paginated across many responses.
    #|    ///
    #|    /// The named output member, if specified, MUST target a list or map.
    #|    items: NonEmptyString
    #|
    #|    /// The name of an operation input member that limits the maximum number of
    #|    /// results to include in the operation output. This input member MUST NOT
    #|    /// be required and MUST target an integer shape.
    #|    pageSize: NonEmptyString
    #|}
    #|
    #|/// Configures the HTTP bindings of an operation.
    #|@trait(
    #|    selector: "operation"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|        }
    #|        {
    #|            path: "/method"
    #|            change: "update"
    #|        }
    #|        {
    #|            path: "/uri"
    #|            change: "update"
    #|        }
    #|        {
    #|            path: "/code"
    #|            change: "update"
    #|        }
    #|        {
    #|            path: "/code"
    #|            change: "presence"
    #|            severity: "DANGER"
    #|            message: "Adding or removing is backward compatible only if the value is the default value of 200"
    #|        }
    #|    ]
    #|)
    #|structure http {
    #|    /// The HTTP method of the operation.
    #|    @required
    #|    method: NonEmptyString
    #|
    #|    /// The URI pattern of the operation.
    #|    ///
    #|    /// Labels defined in the URI pattern are used to bind operation input
    #|    /// members to the URI.
    #|    @required
    #|    uri: NonEmptyString
    #|
    #|    // The HTTP status code of a successful response.
    #|    @range(min: 100, max: 999)
    #|    code: Integer = 200
    #|}
    #|
    #|/// Binds an operation input structure member to an HTTP label.
    #|@trait(
    #|    selector: "structure > member[trait|required] :test(> :test(string, number, boolean, timestamp))"
    #|    conflicts: [httpHeader, httpQuery, httpPrefixHeaders, httpPayload, httpResponseCode, httpQueryParams]
    #|    breakingChanges: [
    #|        {
    #|            change: "presence"
    #|        }
    #|    ]
    #|)
    #|structure httpLabel {}
    #|
    #|/// Binds an operation input structure member to a query string parameter.
    #|@trait(
    #|    selector: """
    #|        structure > member
    #|        :test(> :test(string, number, boolean, timestamp),
    #|        > list > member > :test(string, number, boolean, timestamp))"""
    #|    conflicts: [httpLabel, httpHeader, httpPrefixHeaders, httpPayload, httpResponseCode, httpQueryParams]
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|@length(min: 1)
    #|string httpQuery
    #|
    #|/// Binds an operation input structure member to the HTTP query string.
    #|@trait(
    #|    selector: """
    #|        structure > member
    #|        :test(> map > member[id|member=value] > :test(string, list > member > string))"""
    #|    structurallyExclusive: "member"
    #|    conflicts: [httpLabel, httpQuery, httpHeader, httpPayload, httpResponseCode, httpPrefixHeaders]
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|structure httpQueryParams {}
    #|
    #|/// Binds a structure member to an HTTP header.
    #|@trait(
    #|    selector: """
    #|        structure > :test(member > :test(boolean, number, string, timestamp,
    #|        list > member > :test(boolean, number, string, timestamp)))"""
    #|    conflicts: [httpLabel, httpQuery, httpPrefixHeaders, httpPayload, httpResponseCode, httpQueryParams]
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|@length(min: 1)
    #|string httpHeader
    #|
    #|/// Binds a map of key-value pairs to prefixed HTTP headers.
    #|@trait(
    #|    selector: """
    #|        structure > member
    #|        :test(> map :not([trait|sparse]) > member[id|member=value] > string)"""
    #|    structurallyExclusive: "member"
    #|    conflicts: [httpLabel, httpQuery, httpHeader, httpPayload, httpResponseCode, httpQueryParams]
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|string httpPrefixHeaders
    #|
    #|/// Binds a single structure member to the body of an HTTP request.
    #|@trait(
    #|    selector: "structure > member"
    #|    conflicts: [httpLabel, httpQuery, httpHeader, httpPrefixHeaders, httpResponseCode, httpQueryParams]
    #|    structurallyExclusive: "member"
    #|    breakingChanges: [
    #|        {
    #|            change: "presence"
    #|        }
    #|    ]
    #|)
    #|structure httpPayload {}
    #|
    #|/// Defines an HTTP response code for an operation error.
    #|@trait(
    #|    selector: "structure[trait|error]"
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|integer httpError
    #|
    #|/// Indicates that the structure member represents the HTTP response
    #|/// status code. The value MAY differ from the HTTP status code provided
    #|/// on the response.
    #|@trait(
    #|    selector: "structure :not([trait|input]) > member :test(> integer)"
    #|    structurallyExclusive: "member"
    #|    conflicts: [httpLabel, httpQuery, httpHeader, httpPrefixHeaders, httpPayload, httpQueryParams]
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|structure httpResponseCode {}
    #|
    #|/// Defines how a service supports cross-origin resource sharing.
    #|@trait(
    #|    selector: "service"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|        }
    #|    ]
    #|)
    #|structure cors {
    #|    /// The origin from which browser script-originating requests will be
    #|    /// allowed.
    #|    ///
    #|    /// The `origin` and `origins` members are mutually exclusive.
    #|    origin: NonEmptyString = "*"
    #|
    #|    /// A map of named origins from which browser script-originating requests
    #|    /// will be allowed. Each key is a user-defined name for the origin, and
    #|    /// each value is the origin URL. This allows for environment-aware origin
    #|    /// selection (e.g., selecting an origin based on a deployment stage).
    #|    ///
    #|    /// The `origin` and `origins` members are mutually exclusive.
    #|    origins: NonEmptyStringMap
    #|
    #|    /// The maximum number of seconds for which browsers are allowed to cache
    #|    /// the results of a preflight OPTIONS request.
    #|    ///
    #|    /// Defaults to 600, the maximum age permitted by several browsers.
    #|    /// Set to -1 to disable caching entirely.
    #|    maxAge: Integer = 600
    #|
    #|    /// The names of headers that should be included in the
    #|    /// Access-Control-Allow-Headers header in responses to preflight OPTIONS
    #|    /// requests. This list will be used in addition to the names of all
    #|    /// request headers bound to an input data member via the httpHeader, as
    #|    /// well as any headers required by the protocol or authentication scheme.
    #|    additionalAllowedHeaders: NonEmptyStringList
    #|
    #|    /// The names of headers that should be included in the
    #|    /// Access-Control-Expose-Headers header in all responses sent by the
    #|    /// service. This list will be used in addition to the names of all
    #|    /// request headers bound to an output data member via the httpHeader,
    #|    /// as well as any headers required by the protocol or authentication
    #|    /// scheme.
    #|    additionalExposedHeaders: NonEmptyStringList
    #|}
    #|
    #|@private
    #|list NonEmptyStringList {
    #|    member: NonEmptyString
    #|}
    #|
    #|/// Marks a member as the payload of an event.
    #|@trait(
    #|    selector: "structure > :test(member > :test(blob, string, structure, union))"
    #|    conflicts: [eventHeader]
    #|    structurallyExclusive: "member"
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|structure eventPayload {}
    #|
    #|/// Marks a member as a header of an event.
    #|@trait(
    #|    selector: """
    #|        structure >
    #|        :test(member > :test(boolean, byte, short, integer, long, blob, string, timestamp))"""
    #|    conflicts: [eventPayload]
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|structure eventHeader {}
    #|
    #|/// Indicates that a string value MUST contain a valid shape ID.
    #|///
    #|/// The provided shape ID MAY be absolute or relative to the shape to which
    #|/// the trait is applied. A relative shape ID that does not resolve to a
    #|/// shape defined in the same namespace resolves to a shape defined in the
    #|/// prelude if the prelude shape is not marked with the private trait.
    #|@trait(selector: ":test(string, member > string)")
    #|structure idRef {
    #|    /// Defines the selector that the resolved shape, if found, MUST match.
    #|    selector: String = "*"
    #|
    #|    /// When set to `true`, the shape ID MUST target a shape that can be
    #|    /// found in the model.
    #|    failWhenMissing: Boolean
    #|
    #|    /// Defines a custom error message to use when the shape ID cannot be
    #|    /// found or does not match the selector.
    #|    ///
    #|    /// A default message is generated when errorMessage is not defined.
    #|    errorMessage: String
    #|}
    #|
    #|@trait(
    #|    selector: ":test(timestamp, member > timestamp)"
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|enum timestampFormat {
    #|    /// Date time as defined by the date-time production in RFC3339 section 5.6
    #|    /// with no UTC offset (for example, 1985-04-12T23:20:50.52Z).
    #|    DATE_TIME = "date-time"
    #|
    #|    /// Also known as Unix time, the number of seconds that have elapsed since
    #|    /// 00:00:00 Coordinated Universal Time (UTC), Thursday, 1 January 1970,
    #|    /// with decimal precision (for example, 1515531081.1234).
    #|    EPOCH_SECONDS = "epoch-seconds"
    #|
    #|    /// An HTTP date as defined by the IMF-fixdate production in
    #|    /// RFC 9110#section-5.6.7 (for example, Tue, 29 Apr 2014 18:30:38 GMT).
    #|    HTTP_DATE = "http-date"
    #|}
    #|
    #|/// Configures a custom operation endpoint.
    #|@trait(
    #|    selector: "operation"
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|structure endpoint {
    #|    /// A host prefix pattern for the operation.
    #|    ///
    #|    /// Labels defined in the host pattern are used to bind top-level
    #|    /// operation input members to the host.
    #|    @required
    #|    hostPrefix: NonEmptyString
    #|}
    #|
    #|/// Binds a top-level operation input structure member to a label
    #|/// in the hostPrefix of an endpoint trait.
    #|@trait(
    #|    selector: "structure > :test(member[trait|required] > string)"
    #|    breakingChanges: [
    #|        {
    #|            change: "any"
    #|        }
    #|    ]
    #|)
    #|structure hostLabel {}
    #|
    #|/// Suppresses validation events by ID for a given shape.
    #|@trait
    #|list suppress {
    #|    @length(min: 1)
    #|    member: String
    #|}
    #|
    #|/// Marks an operation as requiring checksum in its HTTP request.
    #|/// By default, the checksum used for a service is a MD5 checksum
    #|/// passed in the Content-MD5 header.
    #|@unstable
    #|@trait(selector: "operation")
    #|structure httpChecksumRequired {}
    #|
    #|/// Specializes a structure for use only as the input of a single operation.
    #|@trait(
    #|    selector: "structure"
    #|    conflicts: [output, error]
    #|    breakingChanges: [
    #|        {
    #|            change: "presence"
    #|        }
    #|    ]
    #|)
    #|structure input {}
    #|
    #|/// Specializes a structure for use only as the output of a single operation.
    #|@trait(
    #|    selector: "structure"
    #|    conflicts: [input, error]
    #|    breakingChanges: [
    #|        {
    #|            change: "presence"
    #|        }
    #|    ]
    #|)
    #|structure output {}
    #|
    #|/// Specializes a structure as a unit type that has no meaningful value.
    #|/// This trait can only be applied to smithy.api#Unit, which ensures that
    #|/// only a single Unit shape can be created.
    #|@trait(selector: "[id=smithy.api#Unit]")
    #|structure unitType {}
    #|
    #|/// Makes a structure or union a mixin.
    #|@trait(selector: ":not(member)")
    #|structure mixin {
    #|    localTraits: LocalMixinTraitList
    #|}
    #|
    #|@private
    #|list LocalMixinTraitList {
    #|    member: LocalMixinTrait
    #|}
    #|
    #|@idRef(
    #|    selector: "[trait|trait]"
    #|    failWhenMissing: true
    #|    errorMessage: """
    #|        Strings provided to the localTraits property of a mixin trait
    #|        must target a valid trait."""
    #|)
    #|@private
    #|string LocalMixinTrait
    #|
    #|/// Defines the priority-ordered list of compression algorithms supported by
    #|/// the service operation.
    #|@private
    #|list RequestCompressionEncodingsList {
    #|    // Encodings are NOT constrained in a Smithy enum since supported encodings
    #|    // are case-insensitive
    #|    member: String
    #|}
    #|
    #|/// Indicates that an operation supports compressing requests from clients to
    #|/// services.
    #|@trait(
    #|    selector: "operation"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|            severity: "DANGER"
    #|            message: """
    #|                Trait was removed so newly generated clients will no longer compress requests, \
    #|                but the service MUST continue to support removed compression algorithms in `encodings`."""
    #|        }
    #|        {
    #|            change: "remove"
    #|            path: "/encodings"
    #|            message: "`encodings` was removed, but is required for the requestCompression trait."
    #|        }
    #|        {
    #|            change: "add"
    #|            severity: "NOTE"
    #|            path: "/encodings/member"
    #|            message: """
    #|                Members of `encodings` were added. Once a compression algorithm is added, \
    #|                the service MUST support the compression algorithm."""
    #|        }
    #|        {
    #|            change: "remove"
    #|            severity: "DANGER"
    #|            path: "/encodings/member"
    #|            message: """
    #|                Members of `encodings` were removed so newly generated clients will no longer compress requests \
    #|                for removed compression algorithms. The service MUST continue to support old clients by supporting \
    #|                removed compression algorithms."""
    #|        }
    #|        {
    #|            change: "update"
    #|            severity: "DANGER"
    #|            path: "/encodings/member"
    #|            message: """
    #|                Members of `encodings` were updated so newly generated clients will no longer compress requests \
    #|                for compression algorithms prior to the updates. The service MUST continue to support old clients by \
    #|                supporting compression algorithms prior to the updates."""
    #|        }
    #|    ]
    #|)
    #|structure requestCompression {
    #|    @required
    #|    encodings: RequestCompressionEncodingsList
    #|}
    #|
    #|/// Declares which resources an operation creates and where to find their
    #|/// identifiers in the operation output.
    #|@unstable
    #|@trait(
    #|    selector: "operation"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|            path: "/member"
    #|            message: "Removing a resource from @createsResources breaks consumers that depend on this lifecycle declaration."
    #|        }
    #|        {
    #|            change: "update"
    #|            path: "/member/resource"
    #|            message: "Changing the resource in a @createsResources entry is a breaking change."
    #|        }
    #|    ]
    #|)
    #|list createsResources {
    #|    member: ResourceLifecycleBinding
    #|}
    #|
    #|/// Declares which resources an operation creates or replaces (put semantics)
    #|/// and where to find their identifiers in the operation input.
    #|@unstable
    #|@trait(
    #|    selector: "operation"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|            path: "/member"
    #|            message: "Removing a resource from @putsResources breaks consumers that depend on this lifecycle declaration."
    #|        }
    #|        {
    #|            change: "update"
    #|            path: "/member/resource"
    #|            message: "Changing the resource in a @putsResources entry is a breaking change."
    #|        }
    #|    ]
    #|)
    #|list putsResources {
    #|    member: ResourceLifecycleBinding
    #|}
    #|
    #|/// Declares which resources an operation reads outside the standard lifecycle
    #|/// binding, and where to find their identifiers in the operation input.
    #|@unstable
    #|@trait(
    #|    selector: "operation"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|            severity: "DANGER"
    #|            path: "/member"
    #|            message: "Removing a resource from @readsResources may break consumers that depend on this lifecycle declaration."
    #|        }
    #|        {
    #|            change: "update"
    #|            severity: "DANGER"
    #|            path: "/member/resource"
    #|            message: "Changing the resource in a @readsResources entry may break consumers."
    #|        }
    #|    ]
    #|)
    #|list readsResources {
    #|    member: ResourceLifecycleBinding
    #|}
    #|
    #|/// Declares which resources an operation updates outside the standard lifecycle
    #|/// binding, and where to find their identifiers in the operation input.
    #|@unstable
    #|@trait(
    #|    selector: "operation"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|            severity: "DANGER"
    #|            path: "/member"
    #|            message: "Removing a resource from @updatesResources may break consumers that depend on this lifecycle declaration."
    #|        }
    #|        {
    #|            change: "update"
    #|            severity: "DANGER"
    #|            path: "/member/resource"
    #|            message: "Changing the resource in a @updatesResources entry may break consumers."
    #|        }
    #|    ]
    #|)
    #|list updatesResources {
    #|    member: ResourceLifecycleBinding
    #|}
    #|
    #|/// Declares which resources an operation deletes and where to find their
    #|/// identifiers in the operation input.
    #|@unstable
    #|@trait(
    #|    selector: "operation"
    #|    breakingChanges: [
    #|        {
    #|            change: "remove"
    #|            path: "/member"
    #|            message: "Removing a resource from @deletesResources breaks consumers that depend on this lifecycle declaration."
    #|        }
    #|        {
    #|            change: "update"
    #|            path: "/member/resource"
    #|            message: "Changing the resource in a @deletesResources entry is a breaking change."
    #|        }
    #|    ]
    #|)
    #|list deletesResources {
    #|    member: ResourceDeletionBinding
    #|}
    #|
    #|/// A binding that associates a resource with an operation lifecycle effect
    #|/// and optionally declares where to find resource identifiers.
    #|@private
    #|structure ResourceLifecycleBinding {
    #|    /// The shape ID of the affected resource.
    #|    @required
    #|    @idRef(selector: "resource", failWhenMissing: true)
    #|    resource: String
    #|
    #|    /// Explicit map of resource identifier name to a JMESPath locator for its
    #|    /// value in the operation input or output.
    #|    identifiers: ResourceMemberBindings
    #|
    #|    /// Structural JMESPath pointing at a nested structure or projection from
    #|    /// whose members identifiers are inferred by name.
    #|    identifiersFrom: NonEmptyString
    #|
    #|    /// Explicit map of resource property name to a JMESPath locator for its
    #|    /// value in the operation input or output.
    #|    properties: ResourceMemberBindings
    #|
    #|    /// Structural JMESPath pointing at a nested structure or projection from
    #|    /// whose members properties are inferred by name.
    #|    propertiesFrom: NonEmptyString
    #|}
    #|
    #|/// A binding that associates a deleted resource with an operation and optionally
    #|/// declares where to find its identifiers. Deletion binds no properties: a
    #|/// resource is deleted by its identifier alone.
    #|@private
    #|structure ResourceDeletionBinding {
    #|    /// The shape ID of the deleted resource.
    #|    @required
    #|    @idRef(selector: "resource", failWhenMissing: true)
    #|    resource: String
    #|
    #|    /// Explicit map of resource identifier name to a JMESPath locator for its
    #|    /// value in the operation input.
    #|    identifiers: ResourceMemberBindings
    #|
    #|    /// Structural JMESPath pointing at a nested structure or projection from
    #|    /// whose members identifiers are inferred by name.
    #|    identifiersFrom: NonEmptyString
    #|}
    #|
    #|@private
    #|map ResourceMemberBindings {
    #|    key: NonEmptyString
    #|    value: ResourceMemberBinding
    #|}
    #|
    #|/// Locates the value of a single resource identifier or property within an
    #|/// operation's input or output using a JMESPath expression.
    #|@private
    #|structure ResourceMemberBinding {
    #|    /// A JMESPath expression that locates the value in the operation input or
    #|    /// output.
    #|    @required
    #|    path: NonEmptyString
    #|}
    #|
  )
}